DamienKarrus’s blog

プログラミングとクライミングの足跡

複数の手続きを定義ファイルを使って実行する Docker入門-8

Docker Composeは、あらかじめコンテナの起動豊富や、ネットワークの定義、ボリュームの定義などをYAML形式で書いた手続きファイルを読み込んでを実行するしくみである。
大型計算機で使われていたJCLのコンテナ版のようなもの。
いま、Wordpressサーバを立てる手順でこのDocker Composeを使ってみる

まずはDocker Composeを使わずに立ててみる

使用するコンテナは、
 *Wordpress(httpd入り)
 *Mysql
の2個。これにDBのデータを格納するボリュームが1個
※実際にはアップロードされた情報を格納する外部記憶をVolumeかBindでアタッチする必要があるが今は上記3個とする。
手順としては
 1. 独自ネットワーク構築
 2. ボリューム作成
 3. Mysqlコンテナ作成・起動
 4. Wordpressコンテナ作成・起動

という順序で作業するものとする。

$ docker network create wordpressnet
$ docker volume create wordpress_db_volume
$ docker container run --name wordpress-db -dit --mount type=volume,src=wordpress_db_volume,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=myrootpassword -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=wordpressuser -e MYSQL_PASSWORD=wordpresspass --net wordpressnet mysql:5.7
$ docker container run --name wordpress-app -dit -p 8080:80 -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_NAME=wordpressdb -e WORDPRESS_DB_USER=wordpressuser -e WORDPRESS_DB_PASSWORD=wordpresspass --net wordpressnet wordpress

動作確認方法はブラウザで上記wordpressの管理画面に入り、動作することを確認する。
ここまで確認できたら一旦削除する。

$ docker container stop wordpress-app  
$ docker container stop wordpress-db  
$ docker container rm wordpress-app  
$ docker container rm wordpress-db  
$ docker volume rm wordpress_db_volume  
$ docker network rm wordpressnet  

つぎにDocker Compose を使って実行してみる

Docker Composeのインストール

まずは Docker Compose をインストールするが、言語パッケージのpythonが必要なのでそれを最初にインストールする。

$ sudo apt install -y python3 python3-pip
$ sudo pip3 install docker-compose
↑書籍ではこのように記述されていたが、
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-c_36wcxj/cryptography/
というエラーが出たため、
$ sudo apt install docker-compose
を実行した
$ docker-compose --version
docker-compose version 1.17.1, build unknown
少し古いようだがこれ進めてみる
作業用ディレクトリと定義ファイルの作成

作業用のディレクトリを作成する

$ cd
$ mkdir wp
$ cd wp

定義ファイルを作る。ファイル名称はデフォルト値の'docker-compose.yml'とする
内容は次の通り

version: "3"

services:
  wordpress-db:
    image: mysql:5.7
    networks:
      - wordpressnet
    volumes:
      - wordpress_db_volume:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpassword
      MYSQL_DATABASE: wordpressdb
      MYSQL_USER: wordpressuser
      MYSQL_PASSWORD: wordpresspass

  wordpress-app:
    depends_on:
      - wordpress-db
    image: wordpress
    networks:
      - wordpressnet
    ports:
      - 8080:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: wordpress-db
      WORDPRESS_DB_NAME: wordpressdb
      WORDPRESS_DB_USER: wordpressuser
      WORDPRESS_DB_PASSWORD: wordpresspass

networks:
  wordpressnet:

volumes:
  wordpress_db_volume:

ネストを間違えただけで構文エラーになるので注意する。ちなみにnetworks:の前にスペースをつけてネストするとエラーになる(おそらく直前のwordpress-app内の設定として理解しようとしたのだろう)
networks:の指定はなくてもよい。ない場合は、このcompose用のネットワーク(上記の場合wp_default)を作るので、上記と同等の動作をする。

docker-compose の実行

ymlファイルのあるディレクトリでdocker-composeを実行する

$ docker-compose up -d ←デタッチモード
Creating network "wp_wordpressnet" with the default driver
Creating volume "wp_wordpress_db_volume" with default driver
Creating wp_wordpress-db_1 ...
Creating wp_wordpress-db_1 ... done
Creating wp_wordpress-app_1 ...
Creating wp_wordpress-app_1 ... done

稼働状況を確認してみる

$ docker-compose ps
       Name                     Command               State                  Ports
--------------------------------------------------------------------------------------------------
wp_wordpress-app_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp,:::8080->80/tcp
wp_wordpress-db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp

コンテナ名称の前に作業ディレクトリ名がつけられる。
また、末尾の1は1つめのという意味で、scaleオプションをつけた場合は2,_3が生成される。

コンテナの停止と破棄

docker-composeから起動されたコンテナやボリュームはdockerコマンドで停止や削除が出来るが、管理上の反故が生じるのでdocker-composeコマンドで操作すべきである。
上記コンテナにブラウザでアクセスしてwordpressが正常に動作することを確認したらコンテナを停止して破棄する

$ docker-compose down
Stopping wp_wordpress-app_1 ... done
Stopping wp_wordpress-db_1  ... done
Removing wp_wordpress-app_1 ... done
Removing wp_wordpress-db_1  ... done
Removing network wp_wordpressnet

ボリュームは削除されずに残っているので、次回起動時に使用することが出来る。

!!ただし、docker volume prune で消去されてしまうので要注意だ!!

$ docker volume ls
DRIVER    VOLUME NAME
local     f42f26184e4653d0210841a88de2b147e536242fe28c740dcb16dd308e308cf7
local     wp_wordpress_db_volume

何か、ワークのボリュームが残ってしまうようだ・・・

docker-composeのオプションやコマンド

docker-composeコマンドの書式は

 docker-compose オプション コマンド 引数

オプションはあまり使用することがない。引数はコマンドごとに異なる。

docker-composeのコマンド
コマンド 説明
up コンテナを作成し起動する
down コンテナ、ネットワーク、イメージ、ボリュームをまとめて停止し削除する
ps コンテナ一覧を表示する
config Composeファイルの確認と表示をする
port ポートの割り当てを表示する
logs コンテナの出力を表示する
start サービスを開始する
stop サービスを停止する
kill コンテナを強制停止する
exec コマンドを実行する
run コンテナを実行する
create サービスを生成する
restart サービスを再起動する
pause サービスを一時停止する
unpause サービスを再開する
rm 停止中のコンテナを削除する
build サービス用のイメージを構築または再起動する
pull サービス用のイメージをダウンロードする
scale サービス用のコンテナの数を指定する
events コンテナからリアルタイムにイベントを受信する
help ヘルプ

次の記事

damienkarrus.hatenablog.com