「DockerでWordPressサイトを開発してみよう」を読んでみよう

首先使用Docker来开发WordPress网站的演示非常棒。
我希望不仅能够”操作”这个内容,还能够”理解”它,所以我仔细研究了幻灯片的内容,并写下了这篇文章。

具体来说,这将成为每个命令和Dockerfile源代码的调查历史。
由于需要学习每个基础设施和Linux命令,可能会导致一些人因为需要一下子记住太多内容而感到混乱。
然而换个角度来看,我觉得这会使我很快地掌握服务器相关知识的感觉。

顺便说一下,我对Docker还是新手。最近了解到了以下内容。即便如此,我还是能使用Docker,非常有趣。
首次使用的Docker for Mac

前提 – “Premise”假设我们可以使用 $ docker –version 命令。
因此,我们将省略幻灯片 15 到最后一张。

让WordPress能够在Docker中使用。首先,执行Docker的基础操作,即从下载的镜像启动容器。

$ docker pull tutum/WordPress
$ docker run -d -p 80:80 --name=WordPress tutum/WordPress

使用pull命令,下载Docker镜像。
这次正在下载一个名为”tutum/WordPress”的Docker镜像。

使用run命令从下载的Docker镜像创建一个容器。
最后提到的”tutum/WordPress”是指定的Docker镜像。

运行命令的选项使用-d选项来指定以分离模式运行。
所谓”分离模式”就是指在后台运行,也就是不在控制台上显示输入输出。

通过-p选项,使得可以通过端口转发来访问容器。
端口转发是指将本地特定端口的通信转发到另一个IP地址的特定端口。
在这种情况下,当访问本地端口号80时,它会被转发到容器(由Apache管理的Web服务器)的端口号80上。

使用–name选项来指定容器的名称。如果没有使用该选项,则容器名称将会是一个随机的英文字。

关于已创建的容器(WordPress)由于容器已经创建,因此现在实际上可以在浏览器中访问 http://localhost:80/。 (*尽管幻灯片中使用的是IP地址访问,但省略了获取IP地址的步骤。)

另外,幻灯片中没有介绍的是,通过输入”$ docker ps” 可以查看正在运行的容器。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
529c95595d2a        tutum/WordPress     "/run.sh"                13 hours ago        Up About an hour    0.0.0.0:80->80/tcp, 3306/tcp   WordPress
56676d358595        mysql:5.7           "docker-entrypoint.sh"   39 hours ago        Up About an hour    3306/tcp                       db

容器ID(CONTAINER ID)是从镜像创建的具有特定ID的容器。
可以从一个镜像创建多个容器,每个容器都有不同的容器ID和容器名称。
如后文所述,停止、重启、删除容器等操作需要指定容器名或容器ID。

IMAGE指的是生成容器的Docker镜像。

COMMAND是在启动时给出的命令。
也就是说,$ docker run 不仅仅是创建容器,创建后马上会执行一些命令(操作)。

(PORTS仍然超出了我的理解范围。以下仅为草稿级别。)
PORTS指的是绑定的端口。”绑定”是指连接本地(正在操作的计算机)和远程(容器内部)之间的连接。
IP地址0.0.0.0代表本地主机。顺便提一下,127.0.0.1也指向本地主机。(它被称为回环地址)
端口80是预留给HTTP使用的端口号。端口3306通常被认为是用于连接MySQL的端口号。
换句话说,可以从COMMAND中看出本地主机的端口号80以及容器的端口号80和3306已经被绑定。

这个名字叫做“NAME”,它是一个容器的名称。

创建原始Docker镜像和Dockerfile以下的中文翻译为 :

幻灯片23至25

接下来,我们来看看我们下载的Docker镜像”tutum/WordPress”是如何产生的。

按我的理解,某个Docker镜像必定是基于其他Docker镜像创建的。
也就是说,我们当前使用的“tutum/WordPress”也是基于另一个Docker镜像构建的。

この「何を土台にして、どんな操作を加えるか」を決めるのがDockerfileだ。
そして$ docker build(詳細は後述)で、「新しいイメージ名をつけてDockerイメージを作成する」ことができる。

例如,”tutum/WordPress”的Dockerfile如下所示。

FROM tutum/lamp:latest
MAINTAINER Fernando Mayo <fernando@tutum.co>, Feng Honglin <hfeng@tutum.co>

# Install plugins
RUN apt-get update && \
  apt-get -y install php5-gd && \
  rm -rf /var/lib/apt/lists/*

# Download latest version of WordPress into /app
RUN rm -fr /app && git clone --depth=1 https://github.com/WordPress/WordPress.git /app

# Configure WordPress to connect to local DB
ADD wp-config.php /app/wp-config.php

# Modify permissions to allow plugin upload
RUN chown -R www-data:www-data /app/wp-content /var/www/html

# Add database setup script
ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
ADD create_db.sh /create_db.sh
RUN chmod +x /*.sh

EXPOSE 80 3306
CMD ["/run.sh"]

来自1行目の「FROM」は、土台とするDockerイメージを指定する。
FROM tutum/lamp:latestとあるので、おそらくLAMP環境(Linux, Apache, MySQL, PHP)が入ったイメージが土台になっている。

第二行的MAINTAINER是该文件的创建者。操作应该不会直接受到影响。

奔跑(详细解释)「RUN」指令用于执行后续的命令。

# Install plugins
RUN apt-get update && \
  apt-get -y install php5-gd && \
  rm -rf /var/lib/apt/lists/*

举个例子,上述命令是在安装名为”php5-gd”的软件包。但说实话,我突然看到也不知道是什么意思,所以需要逐一分解。

首先,这个命令看起来像是三行,但实际上由于有&&和反斜杠,所以成为了一个命令。第一个命令被正确执行后,接着就会执行第二个命令。
(解释可能有点基础,但我甚至没有意识到第二和第三行被包含在RUN中,哈哈)

apt-getは、Linuxコマンドのひとつで、パッケージを取得するもの。
そのうち、updateコマンドで、取得できるパッケージのリストを更新する。
そして、-y installコマンドで、インストールを実行する。
(-yは、問い合わせに対してすべてyesと答えるオプション。Dockerfileは当然応答ができないので、このオプションは頻繁に使われそう。)
rm -rfは、指定したフォルダ以下をすべて強制的に削除するコマンド。
“/var/lib/apt/lists/*ディレクトリは、前のコマンドで取得したパッケージのリストを指している。

まとめると、このRUNコマンドでは、最新化したパッケージリストからphp5-gdパッケージを取得・インストールし、パッケージリストを削除している。
このコマンドによって、無駄なファイル(パッケージリスト)を残すことなく、php5-gdパッケージをインストールしたことになる。

其他命令 de
如果你理解了上面的内容,接下来应该相对容易阅读了。

RUN rm -fr /app && git clone --depth=1 https://github.com/WordPress/WordPress.git /app

上のRUNコマンドでは、appフォルダを削除して、WordPressをappフォルダにダウンロードする。
(depthは、WordPressの履歴をどれくらい取得するか。今回の場合は必要ないので、1を指定して最新だけ取得している。)

もうひとつ、ADDコマンドも出現する。これは、ローカルのファイルをコンテナの中に追加(更新)するコマンド。

ADD wp-config.php /app/wp-config.php

通过上述的ADD命令,将本地存在的wp-config.php文件覆盖到容器内的/app/wp-config.php位置。
这样做可以修改基础镜像的配置文件。

RUN chown -R www-data:www-data /app/wp-content /var/www/html

chown -R命令用于更改文件和目录(包括其内容)的所有者。所有者需要以“(所有者):(组)”的格式指定。
在这种情况下,将/app/wp-content目录和/var/www/html目录的所有者设置为www-data(www-data组)。

ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
ADD create_db.sh /create_db.sh
RUN chmod +x /*.sh

2つのADDコマンドは省略。
つぎのRUNコマンドで出てくるchmodは、アクセス権を変更するLinuxコマンド。
アクセス権にも色々あり、+xは実行権限を追加する記述。つまり、拡張子shのファイル(ADDしたファイル)の実行権限を追加する命令。

EXPOSE 80 3306

EXPOSEコマンドは、コンテナ内の開放するポート番号を指定する。
HTTPとmysqlが利用できないといけないので、80と3306を開放している。

CMD ["/run.sh"]

CMDコマンドは、コンテナの実行コマンドを指定。
つまり、前述した$ docker runが実行されたときの、コンテナ作成後のコマンドを指定できる。

创建自定义的WordPress Docker镜像。第26至35张幻灯片

スライドの通り、WordPressは、wp-config.phpとMySQLのwordpressデータベースに設定を持っている。
よって、さきほど見たDockerfileにこれらをあらかじめ追加するよう命令を書けば、設定済のイメージをつくることができる。

ここで重要なのは、これから作るイメージはDockerfileで見た「tutum/lampを土台にしてDockerfileに定義した操作を行った、オリジナルのDockerイメージ」だということ。
このイメージから作成されるコンテナは設定済なので、さまざまな人に共有することが可能になる。

容器与本地文件的共享首先,我们应该已经创建了名为“wordpress”的容器,现在我们要删除它。
使用rm -f命令来强制删除容器。需要注意的是,Docker镜像仍然保留在本地。
我们只是删除了由镜像创建的容器。

$ docker rm -f wordpress

接下来,将下方网址内容下载到本地。
https://github.com/mookjp/tutum-docker-wordpress

进入下载的文件夹,然后重新创建WordPress容器。
但要添加-v选项。

$ docker run -d -p 80:80 -v $(pwd):/data-share --name=wordpress tutum/wordpress

通过使用-v选项,可以共享本地和容器内的文件。
“$(pwd)”表示当前所在的本地目录(如果操作正确,应该是下载的文件夹)。
“/data-share”是容器的目录。如果目录不存在,则会被创建。

実際に、ファイルが共有されているか確認してみたい。
(次の一文、ちょっと不安です)そのためには、コンテナにログインして、「コンソールを開く」を実行するプロセスを実行する。

$ docker exec -it wordpress /bin/bash

$ docker execは、「コンテナの中でプロセスを実行する」ためのコマンド。-itオプションで、コンテナにログインすることができる。(現在コメント欄にて教えてもらってます。のちほど更新)
最後の”/bin/bash”はコマンドで、bashシェルを起動する(「コンソールを開く」と同義と理解してます。)

ログインすると、コンソールがroot@1593df29e49d:/#のようになるはず。
このコンソールはコンテナの中を表示している。
この中で、lsコマンドを叩くと、”data-share”ディレクトリとファイル共有が確認できる。

root@1593df29e49d:/# ls
app  boot          create_mysql_admin_user.sh  dev  home  lib64  mnt  proc  run     sbin  start-apache2.sh  sys  usr
bin  create_db.sh  data-share                  etc  lib   media  opt  root  run.sh  srv   start-mysqld.sh   tmp  var
root@1593df29e49d:/# ls data-share
Dockerfile          create_mysql_admin_user.sh  LICENSE     mysql.dump.sql
README.md           wp-config.php   circle.yml          wp-content  create_db.sh

将配置后的数据放入Dockerfile中。
完成设置后,将数据复制到data-share。

设置后,请执行以下命令。Mysqldump是用于备份数据库的命令。
使用root用户名登录WordPress数据库,并将此备份保存为data-share目录下的mysql.dump.sql。

mysqldump -u root wordpress > /data-share/mysql.dump.sql

接下来,我们将编辑create_db.sh文件,将mysql.dump.sql作为初始数据插入。
在幻灯片中,我认为假设我们编辑了包含在下载文件中的create_db.sh文件,当然我们也可以使用vi等编辑工具在容器内编辑文件,然后通过data-share进行共享。
另外,由于开始调查shell脚本将会很麻烦,所以我暂时不去深究它。

#!/bin/bash

if [[ $# -eq 0 ]]; then
    echo "Usage: $0 <db_name>"
    exit 1
fi

/usr/bin/mysqld_safe > /dev/null 2>&1 &

echo "=> Creating database $1"
RET=1
while [[ RET -ne 0 ]]; do
    sleep 5
    mysql -uroot -e "CREATE DATABASE $1"
    mysql -uroot $1 < /mysql.dump.sql #ここを追加
    RET=$?
done

mysqladmin -uroot shutdown

echo "=> Done!"

最后,修改Dockerfile。
现在本地有一个mysql.dump.sql文件,这是刚刚获取的。将其包含在新创建的原始Docker镜像中。
下面是修正后的Dockerfile。

FROM tutum/lamp:latest
MAINTAINER Fernando Mayo <fernando@tutum.co>, Feng Honglin <hfeng@tutum.co>

# Install plugins
RUN apt-get update && \
  apt-get -y install php5-gd && \
  rm -rf /var/lib/apt/lists/*

# Download latest version of WordPress into /app
RUN rm -fr /app && git clone --depth=1 https://github.com/WordPress/WordPress.git /app

# Configure WordPress to connect to local DB
ADD wp-config.php /app/wp-config.php

# Modify permissions to allow plugin upload
RUN chown -R www-data:www-data /app/wp-content /var/www/html

# Add database setup script
ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
ADD mysql.dump.sql /mysql.dump.sql #ここを追加
ADD create_db.sh /create_db.sh
RUN chmod +x /*.sh


EXPOSE 80 3306
CMD ["/run.sh"]

たった1行の追記だが、これによって新しいイメージができることになる。
$ docker buildでDockerイメージを作成してみる。イメージ名はtutum/wordpressではなく、my-wordpressとする。最後のドットを忘れずに。
Dockerに割り振ったCPUとメモリも寄ると思うが、パッケージを取得などもあるので時間が多少かかる。

$ docker build -t my-wordpress .

-t选项用于为构建成功后创建的镜像添加仓库和标签。
最后的句点指定了Dockerfile所在的目录。

当构建完成后,关闭之前的WordPress容器,然后使用my-wordpress镜像创建一个新的容器。
这样就会得到一个配置完成的容器。

$ docker rm -f wordpress
$ docker run -d -p 80:80 --name=my-wordpress my-wordpress

最后第37至50页的幻灯片

当你能理解到此处时,我认为你就可以自己管理Docker并进行开发了。
当然,创建Dockerfile需要一些Linux命令的知识,但我有种直觉感觉你可以自己完成接下来的步骤。

本文介绍了利用已经学到的知识,进一步提高开发环境效率的步骤。由于内容并不困难,故此篇章在此作结。

bannerAds