在CentOS 7上使用Docker安装WordPress
首先
我认为有很多人想在CentOS上使用Docker来启动WordPress,并且已经有很多相关的文章了。然而,我发现我需要的信息没有集中在一处,而且在失败时很难知道“到哪个步骤成功了”、“在哪个步骤失败了”,这让我很困扰。因此,在进行操作时,我会逐步检查每个步骤是否成功。本文的目的是在新安装的CentOS 7上通过8080端口启动WordPress。
另外,由于安全问题,本文不包含安全措施的内容,请各位自行进行适当的设置。
以下是我上瘾的要点。
-
dockerはそのままでは一般ユーザアカウントから実行できない。dockerグループを追加し、グループパスワードを設定した上で、dockerを再起動、後は必要に応じてnewgrpすることで実行できるようにする。
docker-composeコマンドで起動すると、ボリュームにプロジェクト名のプレフィックスがつく。生のdockerコマンドで作ったボリュームを利用したい時には、予めそれを見越した名前にするか、ボリュームのリネームが必要。
做功课
从CentOS 7安装完毕后开始,一直到验证docker的运行情况。
在安装 CentOS 7 后,完成 yum 更新后,创建一个普通账号并将其注册为 sudoers,切换到该账号进行操作。之后,以该普通账号为操作主体。
首先打开防火墙的80号和443号端口。
sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --add-service=https --zone=public --permanent
sudo systemctl restart firewalld
安装Docker。
sudo yum install docker
当在这里尝试运行Docker时,会被告知无法连接到Docker守护程序。
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
运行Docker守护进程。
sudo systemctl start docker
再次执行docker ps命令,错误消息将会有所变化。
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied
这是因为在执行Docker时需要具有root权限或属于docker组。如果将用户加入docker组,则可以执行,但由于存在安全问题,可以通过在docker组中设置密码,并使用newgrp临时加入docker组来执行。
sudo groupadd docker # dockerグループを作成
sudo gpasswd docker # ここでグループパスワードを設定
sudo systemctl restart docker # dockerをリスタート
在这种情况下,使用newgrp docker命令将能够操作docker。
$ newgrp docker # パスワードを入力して一時的にdockerグループに
$ docker ps # dockerコマンドが実行できる
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ exit # dockerグループを抜ける
$ docker ps # グループを抜けると実行できない
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied
只需要一个选择,对以下内容进行汉语本土化改写:
直到WordPress的功能确认。
加入docker群组,并处于可以执行docker ps的状态下,执行以下内容。
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql:5.7
docker run --name wordpress --link mysql:mysql -d -p 8080:80 wordpress
如果通过该服务器(如果是本地服务器则为localhost:8080)访问,能够看到以下WordPress界面,则表示WordPress已经成功启动。

在设置了初始密码等之后,如果能够成功登录并连接到数据库,则表示一切顺利。
WordPress的持久化
在以前的设置中,所有在WordPress上的更改都会被写入容器镜像中,如果删除了镜像,更改也会一同消失。因此,将容器数据的一部分保留在主机上(持久化)。
暂时先删除之前创建的容器。通过使用docker ps查找其ID并停止、删除它。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26ff68b11bce wordpress "docker-entrypoint..." 4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp wordpress
ab33e60500ba mysql:5.7 "docker-entrypoint..." 5 minutes ago Up 5 minutes 3306/tcp, 33060/tcp mysql
$ docker stop 26ff68b11bce ab33e60500ba
26ff68b11bce
ab33e60500ba
$ docker rm 26ff68b11bce ab33e60500ba
26ff68b11bce
ab33e60500ba
mysql将/var/lib/mysql设为名为db-data的卷,由Docker进行管理。
$ docker run --name mysql -v db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql:5.7
$ docker volume ls | grep db-data # ボリュームができていることを確認
local db-data
WordPress可以将/var/www/html保存到主机的本地目录$PWD/wordpress中。这样可以通过主机进行更改。
$ docker run --name wordpress -v $PWD/wordpress:/var/www/html --link mysql:mysql -d -p 8080:80 wordpress # /var/www/htmlをローカルの./wordpressにマウント
$ ls wordpress # ファイルができていることを確認
index.php wp-admin wp-config.php wp-links-opml.php wp-settings.php
license.txt wp-blog-header.php wp-content wp-load.php wp-signup.php
readme.html wp-comments-post.php wp-cron.php wp-login.php wp-trackback.php
wp-activate.php wp-config-sample.php wp-includes wp-mail.php xmlrpc.php
在这种状态下,重新登录WordPress并进行各种自定义后,停止并删除容器。
$ docker stop コンテナID コンテナID
$ docker rm コンテナID コンテナID
$ docker ps -a # 何もないことを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
然后,再次启动容器,确认之前自定义的数据仍然存在(已经持久化)。
docker run --name mysql -v db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql:5.7
docker run --name wordpress -v $PWD/wordpress:/var/www/html --link mysql:mysql -p 8080:80 -d wordpress
如果能够成功登录到 localhost:8080 并且之前的修改已经保存,则表示成功。
使用Docker Compose启动
安装Python和pip。对于有自己安装Python的经验的人,可以按照他们自己的方式安装。安装完pip后,从pip安装docker-compose。
sudo yum install python36 python36-pip
sudo ln -s /usr/bin/pip3.6 /usr/local/bin/pip
sudo /usr/local/bin/pip install --upgrade pip
sudo /usr/local/bin/pip install docker-compose
从这里开始,我们将使用docker-compose进行配置,但是使用docker-compose创建的volume会自动添加前缀。项目名称默认为当前目录。看起来无法抑制这个前缀的添加。如果想要使用先前创建的volume,必须将其名称更改为带前缀的名称。
目前似乎还无法重命名Docker的卷,只能创建新的卷并进行复制,然后删除旧的卷。
docker volume create --name wp_db-data
docker run --rm -it -v db-data:/from -v wp_db-data:/to alpine sh -c "cp -av /from/* /to"
docker volume rm db-data
docker volume ls | grep data
local wp_db-data
db-data已被重命名为wp_db-data。
接下来,创建一个类似以下样式的docker-compose文件。它是将先前的docker命令直接转化为YAML格式的版本。
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql
volumes:
- db-data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: mysqlpassword
wordpress:
depends_on:
- db
image: wordpress
container_name: wordpress
ports:
- "8080:80"
volumes:
- "$PWD/wordpress:/var/www/html"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: mysqlpassword
volumes:
db-data:
在此之后,运行docker-compose up命令,并通过-p选项将项目名称指定为wp。这里声明将db-data用作卷,并附加项目名称的前缀wp,以形成wp_prefix。项目名称默认为当前目录,所以可以提前将当前目录命名为wp以便使用。
docker-compose -p wp up
访问localhost:8080,如果之前永久化的卷已经被重新利用,则表示成功。使用docker-compose命令时,可以通过添加-d(Detached)选项进行后台执行,但在测试时,我认为最好不要添加该选项,以便查看错误消息。
将环境变量存储到.evn文件中
将密码等环境变量保存在.env文件中,与在YAML文件中的指定方式不同,需要使用等号进行指定,敬请注意。
$ cat .env
MYSQL_ROOT_PASSWORD=mysqlpassword
WORDPRESS_DB_PASSWORD=mysqlpassword
在每个定义中指定env_file: .env的docker-compose.yaml文件。
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql
volumes:
- db-data:/var/lib/mysql
restart: always
env_file: .env
wordpress:
depends_on:
- db
image: wordpress
container_name: wordpress
ports:
- "8080:80"
volumes:
- "$PWD/wordpress:/var/www/html"
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
volumes:
db-data:
当你使用docker-compose up -p wp命令确认正常启动后,只需重新设置适当的环境变量和配置即可。
总结起来
WordPress的启动需要数据库,并且使用两个容器镜像,使用docker-compose是一种常见的选择,但是对于初学者来说,突然使用docker-compose,虽然WordPress能够启动,但经常会遇到“Error establishing a database connection”这样令人困扰的错误信息。
所以,
故此,
因此,
由此可見,
-
dockerコマンドがたたけるか
dockerコマンドを叩いてWordPressが起動できるか
docker-composeで一気に起動できるか
我认为最好按顺序进行工作。
请参考
Docker で Volume 名を変更する
Dockerでユーザーをdockerグループに追加することの危険性を理解しよう
docker-composeでwordpress環境をサクッと構築する
Dockerでユーザーをdockerグループに追加することの危険性を理解しよう
docker-composeでwordpress環境をサクッと構築する