在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已经成功启动。

image.png

在设置了初始密码等之后,如果能够成功登录并连接到数据库,则表示一切顺利。

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環境をサクッと構築する

bannerAds