Dockerを触り始めました2 - Docker Compose -

前回からDockerを触り始めました。
今回は、「Docker Compose」を調べつつ触ります。

参考資料

後々追加されますが、入口はこの資料から。

今回はDocker-docs-ja Docker Composeを主に参考にして、最終的にDocker Composeを使用したWordpress環境の立ち上げをしてみたいと思います。

Docker Compose導入

mac環境では、docker導入によって使用可能になっていた。
Qiita DockerをMacにインストールするを参考参考にして、dockerの導入をしたので、この通りでよいと思う。

インストール確認

1
docker-compose --version

コマンド

Docker Composeのコマンド群は、docker-Composeから始まる。
docker-Compose --helpでオプションを見ることができる。
とりあえず今回は以下しか使わなかった。

Docker Composeでアプリケーションを起動

docker-compose.ymlの内容に基づいて各コンテナを起動

1
2
3
4
5
6
7
docker-compose up
# -d
# バックグラウンド実行モード
docker-compose up -d
# -build
# docker-compose.ymlにbuildの記載があればイメージのビルドをすることになってるみたいだけど入れなくてもビルドした。
docker-compose up --build

コンテナ群の実行状況

1
docker-compose ps

docker container ls(docker ps)とは表示が異なる。

Docker Composeでアプリケーションを再起動

docker-compose.ymlの内容に基づいて各コンテナを再起動

1
docker-compose restart

Docker Composeでアプリケーションを停止

docker-compose.ymlの内容に基づいて各コンテナを停止

1
docker-compose down

Docker Composeを使ってみる。

docker-compose.yml

すごく難しいのですこれが…。
とりあえず、こういう時はシンプルに見よう見まねで1つだけサーバを立ててみます。
(オーケストレーションツールが泣くかな・・・。)

docker-compose.ymlでコンテナを作成 一つだけ

以下のdocker-compose.ymlを作成してみる。

docker-compose.yml
1
2
3
4
5
6
version: '3'
services:
webserver:
image: nginx
ports:
- 80:80

docker-compose.ymlを作成したので、コンテナを作ってアクセスしてみる。

1
2
3
4
5
6
7
8
9
10
# コンテナ群(ここでは1つ)を起動
docker-compose up -d
# コンテナの状況確認
docker-compose ps

# ここでブラウザでlocalhostにアクセスし、
# "Welcome to nginx!"が表示さえていることを確認

# コンテナ群を停止
docker-compose down

できた。
Welcome to nginx!の表示を確認できる。


docker-compose.ymlでコンテナを作成 二つそしてbuildしてみる

今度は、コンテナを2つを別のdokerfileでビルドされたイメージから作ってみたいと思います。
以下のディレクトリ・ファイル構成です。

1
2
3
4
5
6
7
8
--compose2
|--docker-compose.yml
|--server1
| |--dockerfile
| |--index.html
|--server2
|--dockerfile
|--index.html

dockerfileはそれぞれとも同じ内容ですが、
index.htmlの内容はserver1とserver2のそれぞれ変えておきます。

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3'
services:
webserver1:
build: ./server1
ports:
- 5000:80
webserver2:
build: ./server2
ports:
- 5001:80

```bash
# コンテナ群を起動
docker-compose up -d

# ここでブラウザでlocalhost:5000とlocalhost:5001にアクセスし、
# "それぞれのイメージに組み込んだindex.html"が表示さえていることを確認

# コンテナ群を停止
docker-compose down

アプリケーションを起動して、localhost:5000とlocalhost:5001にアクセスすると、それぞれのindex.htmlを確認できた。


Wordpress環境を作ってみる

Docker-docs-ja クイックスタート・ガイド:Docker Compose と Wordpressを参考に作ってみる。

一旦以下のサンプルそのまま入れてみる。

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest
links:
- db
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress

こちらで、docker-compose up -dで起動してみる。
失敗した。
localhost:8000にアクセスすると、Error establishing a database connectionと表示されるなぜなのかと、以下を調べてみる。

Docker-docs-ja クイックスタート・ガイド:Docker Compose と Wordpressdocker-compose.ymlとは結構違っている・・・。(日付古かったしな・・・。)

これらの資料を参考にdocker-compose.ymlを以下のように書き換えてみる。

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./.data/db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: adminwordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress

もう一度docker-compose up -dをするが、
うまくいかない。
気になって./.data/dbを一旦すべて削除。
docker-compose up -dし、localhost:8000にアクセス。
成功!

wordpressの初期設定画面が開きました。
一旦docker-compose downで停止し、再度docker-compose up -dを実行し、再度アクセス。
データベースがホストマシンの./.data/dbに展開さ、wordpressの初期設定が表示されないこと確認。

ここで、もう一度docker-compose downし、./.data/dbを削除。
docker-compose up -dでコンテナ群を起動。
localhost:8000にアクセスすると初期設定が表示、./.data/dbにデータが展開されていることを確認できた。


今回は、サンプルを参考にdocker Composeを使ってWordpress環境立ち上げまでやってみた。
ここまでで、「dockerって便利だな」とか「今更かよ!」な感想を持ってしまったりしている。
docker hubにMQTTサーバーのeclipse-mosquittoのdockerイメージを見つけたりしたので、IoT的にも使いようがありそうだなと思う。
(moscaで拡張するのも、もうつらいなって)

こういうのものを使いこなして開発の本業の人たちは、本来作りたいアプリケーションだったり、サービスのコアになるべく早く着手しているんだろうなと理解。

ではでは。