【Docker+Cloud Run勉強会】2. 使用Docker部署WordPress
这篇文章
最近我们举办了关于Docker和Cloud Run的研讨会。
本文将成为当时准备的资料。
-
- 1. Dockerとは?
- 3. Cloud RunにWordPressをデプロイする
油管
目标
重新解释,容器是什么?并同时解释
-
- 代表的なコンテナエンジンであるDocker
- Google CloudのコンテナデプロイサービスであるCloud Run
我希望你们能学习关于这个话题。
尝试使用容器部署WordPress
我希望从这里开始使用一种名为WordPress的著名内容管理系统(CMS)作为教材。
WordPress利用数据库来管理内容。
在中文中,最佳实践是基本上采用“一个容器一个服务”的原则。
如果将一个容器分配给一个服务,那么关注的事项就会减少,一般来说,这是推荐的做法。
(文件)
因此,这次我们将WordPress和数据库分开运行。
以下是流程的概述
-
- 在本地部署WordPress和数据库的容器
- 在Cloud Run上搭建WordPress网站
1、通過1、2步骤,需要使用Docker,并在第2步还需要使用gcloud。
如果在本地准备困难的情况下,也可以通过GC的控制台启动Cloud Shell来进行操作。
在本地部署WordPress和数据库的容器。
首先,在本地部署WordPress和数据库,然后尝试检查容器之间的通信情况。
構成方面如下:
-
- コンテナ
wp : WordPressが稼働
db : MySQLが稼働
db_data (ボリューム) : データベースのデータを保存する領域
my_net (Dockerネットワーク) : Docker内のネットワーク
コンテナ間通信、コンテナ-ホスト間通信を実現
让我们按照上述的结构顺序进行构建。
我想立即运行一个容器,但首先需要创建在容器启动时所需的 “卷” 和 “Docker 网络”。
创建音量
「容器的特性:挥发性」被提到过,但是当容器被丢弃时,它会失去所有内容,因此无法作为数据库进行操作。
在这种情况下,通过在主机上创建一个”容器可以持久保存数据的地方”来解决问题,这被称为卷。
可以使用docker volume create命令来创建卷${卷名称}。
创建Docker网络
接下来创建Docker网络
命令是docker network create ${网络名称}。
「细节问题:
Docker 网络有几种类型,如果不指定的话,默认创建桥接网络。
桥接网络的特点是
-
- 同じネットワークに所属しているコンテナ同士は通信が可能
-
- 仮想ブリッジを通して、ホストと通信が可能
-
- コンテナ名で名前解決が可能
ただし、初期から存在するブリッジ・ネットワーク「bridge」では名前解決不可能(ドキュメント)
部署数据库的容器
这次使用的MySQL容器将直接部署已经存在的Docker镜像,就像”hello-world”一样。具体的命令如下:
docker run -d --name db --net my_net -v db_data:/var/lib/mysql --env-file .env mysql:5.7
-d : コンテナをバックグラウンドで実行
–name db : コンテナに名前を付与
–net my_net : コンテナが所属するネットワークを指定
-v db_data:/var/lib/mysql : ボリュームの割り当て
${ボリューム名}:${コンテナ側のパス}
ちなみにホスト側のディレクトリをバインドさせることも可能
–env-file .env : 環境変数をファイルで指定
.envファイルについては後述してます
mysql:5.7 : Dockerイメージを指定
使用WordPress进行容器部署
关于WordPress,Docker镜像已经发布,直接部署该镜像也足够启动。
然而,这次故意多做一步骤,事先下载一个WordPress插件。
在这种情况下,首先需要创建原始的Docker镜像。用于创建Docker镜像的Dockerfile将在后面提到(使用先前介绍的RUN指令)。
用以下命令从这个Dockerfile创建Docker镜像。
docker build -t my_db:test .
-t my_db:test : Dockerイメージのリポジトリとタグを指定する(ドキュメント)
. : Dockerfileが存在するディレクトリを指定
※ 详细的交谈
-
- Dockerfileのファイル名が「Dockerfile」以外の場合は、-fでファイル名を指定する必要があります
-tが無いとリポジトリ、タグ共にとなります
一応イメージIDを指定することでコンテナの起動は可能です
由于已经创建了Docker镜像”my_db:test”,现在只需部署容器即可。
docker run -d --name wp --net my_net -e WORDPRESS_DB_HOST=db:3306 --env-file .env -p 8000:80 my_wp:test
-e WORDPRESS_DB_HOST=db:3306 : このようにして環境変数を指定することも可能です
-p 8000:80 : ホストにおいて、localhostの8000番ポートにアクセスすると、コンテナの80番ポートに繋がります
厳密には ${IPアドレス}:${ホスト側のポート}:${コンテナ側のポート}という指定になります
命令和各种文件 (Command and various files)
命令
# ボリューム及びネットワークの作成
~/wordpress$ docker volume create db_data
~/wordpress$ docker network create my_net
# データベース用コンテナのデプロイ
~/wordpress$ cd db
~/wordpress/db$ ls -a
. .. .env
~/wordpress/db$ docker run -d --name db --net my_net -v db_data:/var/lib/mysql --env-file .env mysql:5.7
# WordPress用コンテナのデプロイ
~/wordpress/db$ cd ../wp/
~/wordpress/wp$ ls -a
. .. .dockerignore .env Dockerfile
~/wordpress/wp$ docker build -t my_wp:test .
~/wordpress/wp$ docker run -d --name wp --net my_net -e WORDPRESS_DB_HOST=db:3306 --env-file .env -p 8000:80 my_wp:test
Dockerfile (用于构建 Docker 镜像的文件)
FROM wordpress:latest
RUN apt-get update -y && apt-get install -y unzip
RUN curl -o /tmp/custom-post-type-ui.1.12.1.zip -L https://downloads.wordpress.org/plugin/custom-post-type-ui.1.12.1.zip \
&& unzip /tmp/custom-post-type-ui.1.12.1.zip -d /tmp/ \
&& mv /tmp/custom-post-type-ui /usr/src/wordpress/wp-content/plugins/
.env配置文件
用于数据库
MYSQL_ROOT_PASSWORD=${MySQL管理者ユーザ「root」用パスワード}
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=${MySQLユーザ「wordpress」用パスワード}
以下是中文本地化的解释:WordPress是一个使用的内容管理系统。
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=${MySQLユーザ「wordpress」用パスワード}
环境变量
wordpress
WORDPRESS_DB_HOST : データベースのホスト名
WORDPRESS_DB_USER : データベースのユーザ名
WORDPRESS_DB_PASSWORD : 「WORDPRESS_DB_USER」で指定したユーザのパスワード
WORDPRESS_DB_NAME : 使用するデータベース
mysql
MYSQL_ROOT_PASSWORD : MySQL管理者ユーザ「root」用パスワード
MYSQL_DATABASE : 起動時点で作成するデータベース
MYSQL_USER : 起動時点で作成するユーザ
MYSQL_PASSWORD : 「MYSQL_USER」で指定したユーザのパスワード
docker exec命令
尽管我已经介绍了一个Dockerfile的例子,但当我们真正要自己创建一个的时候
-
- ベースイメージにはどんなパッケージが入っているのか確かめたい
- 思ったように動作せず、トラブルシューティングがしたい
我认为会有类似的想法出现。
在这种情况下,使用docker exec命令非常方便。通过使用它,您可以在运行中的容器内执行命令。
基本上,您可以按照以下方式进行输入。
docker exec -it ${コンテナ名} ${コンテナで実行したいコマンド}
关于it有点复杂,但如果没有这个选项,标准输入和标准输出将无法正确进行。建议一开始先启用此选项,等到对Docker有一定理解后再进行详细学习。
使用这个命令后,您也可以在容器的shell中进行操作。
$ docker exec -it wp bash
root@7b979b065660:/var/www/html# ps x
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 apache2 -DFOREGROUND
28 pts/0 Ss 0:00 bash
38 pts/0 R+ 0:00 ps x
root@7b979b065660:/var/www/html#
Docker Compose:集成式容器编排工具。
在之前,我們一直通過每次運行命令來創建卷、網絡和容器。
但是,像docker run這樣的命令需要很多必要的選項,每次都要記錄下來是很麻煩的。
而且還需要考慮創建的順序(例如,在創建WordPress之前需要先創建數據庫)。
Docker Compose是一项能够轻松管理Docker的工具。
在Docker Compose中,可以使用”docker-compose.yml”文件来定义配置。对于本例,它将如下所示。
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
networks:
- my_net
env_file: ./db/.env
restart: always
wordpress:
depends_on:
- db
build: ./wp/
networks:
- my_net
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
env_file: ./wp/.env
restart: always
volumes:
db_data:
networks:
my_net:
restart: always : コンテナ終了時、常に再起動を行う(明示的な停止は例外)
目录结构
wordpress/
├── db
│ └── .env
├── docker-compose.yml
└── wp
├── .dockerignore
├── .env
└── Dockerfile
在准备好类似上述的文件之后
docker-compose up -d --build
执行此操作后,可以创建与之前所创建的相同环境。
请引用、参考以下内容。
-
- コンテナー内での複数サービス起動
-
- Docker コンテナ・ネットワークの理解
-
- Use bridge networks
-
- リポジトリ
-
- wordpress
- mysql