😛

dockerComposeでコンテナをまとめて起動する

2021/02/19に公開

はじめに

くーばねてすをやっつけるために新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。今回はデータベースを使用したブログサーバーをdockerでまとめて構築してみる。まとめて構築するのにはdockerComposeを使用して構築する。

概要

■複数のコンテナを連動して一つ一つ構築する
■dockerComposeでまとめてコンテナを起動する
■コンテナを一括で停止および削除する

をまとめた!(>_<)

■複数のコンテナを連動して一つ一つ構築する

ブログサーバーを構築するのに、
①dockerネットワークの作成
②データベースコンテナの永続化ボリュームの作成
③Mysqlコンテナの作成
④WordPressコンテナの作成
をつくる。ここでは一つずつセットアップしていく。

①dockerネットワークの作成

ここではデフォルトのbridge ネットワークでもいいが、分かりやすくWordPress専用のネットワークを作成する。

$ docker network create wordpressnet

ネットワーク構成確認

$ docker network ls
fc96c2976a97   bridge         bridge    local
161ff55df66f   host           host      local
c95bc06da33f   none           null      local
fa72af2b721a   wordpressnet   bridge    local

②データベースコンテナの永続ボリュームを作成する

データベースコンテナが消えてしまってもデータを格納できる永続ボリュームを作成する。
コンテナの永続ボリュームを作成するにはdocker volume createを使用する。

$ docker volume create db_volume
db_volume

コンテナのボリュームを確認する。

$ docker volume ls
DRIVER    VOLUME NAME
local     db_volume

③Mysqlコンテナの作成

データベースコンテナを作成する。Mysqlの設定を環境変数でセットしてイメージを引っ張ってきて、先ほど作ったコンテナネットワークで起動する。

$ docker run --name wordpress-db -itd -dit -v db_volume:/var/lib/mysql -e MYSQL_LOOT_PASSWORD=管理者パスワード -e MYSQL_DATEBASE=データベース名 -e  MYSQL_USER=ユーザー名 -e MYSQL_PASSWORD=ユーザー名のパスワード --net wordpressnet mysql:5.7 bash
Unable to find image 'mysql:5.7' locally
略
5.7: Pulling from library/mysql
Digest: sha256:853105ad984a9fe87dd109be6756e1fbdba8b003b303d88ac0dda6b455f36556
Status: Downloaded newer image for mysql:5.7
9671b5199bf859132e9289a4756fec7f08472e0f65d983bb2ad59d1099072581

コンテナの起動を確認する

$ docker ps 
docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
2d35aea7cb8b   mysql:5.7   "docker-entrypoint.s…"   7 seconds ago   Up 5 seconds   3306/tcp, 33060/tcp   wordpress-db

④WordPressコンテナの作成

WordPressコンテナを起動する。

$ docker run --name wordpress-app -dit -p  8080:80 -e WORDPRESS_DB_HOST=接続データベースのホスト名 -e WORDPRESS_DB_NAME=接続データベース名 -e WORDPRESS_DB_USER=接続するユーザー名 -e WORDPRESS_DB_PASSWORD=接続するユーザー名のパスワード  --net wordpressnet wordpress
$  docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                  NAMES
bf033d068edc   wordpress   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   wordpress-app
2d35aea7cb8b   mysql:5.7   "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       3306/tcp, 33060/tcp    wordpress-db

ブラウザで

http://dockerホストIPアドレス:8080/

で検索し、WordPressのセットアップなどをする。

データベースコンテナと連携するWordPressコンテナを作成した。

■dockerComposeでまとめてコンテナを起動する

上記の設定はdockercomposeでコンテナをまとめて起動することができる。
ひとつひとつ起動やセットアップをしてもいいのだが、複数のコンテナを連携したいとき、コンテナの起動し忘れや、 セットアップの順番など一つでも抜けているとコンテナが連携しなくなることがある。
こんなときにdockerComposeが約にたつ。
dockerComposeを利用するときは、まずdockerComposeをインストールされているか確認。

Compose確認
$ docker-compose -v
docker-compose version 1.27.4, build 40524192

作業用ディレクトリでdockerComposeファイルを作成する。

$ vim docker-compose.yml
docker-compose.yml
version: "3"

services:
  wordpress-db:
    image: mysql:5.7
    networks:
      - wordpressnet
    volumes:
      - 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:latest
    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:
   db_volume:

dockerComposeYamlファイルを作成しWordPressコンテナ、Mysqlコンテナ、永続ボリューム、環境変数のセットアップをして、ファイルのあるディレクトリで起動
するには

$ docker-compose up    

で起動する。

$ docker-compose up  -d                                                         Creating network "user_wordpressnet" with the default driver
Creating volume "user_db_volume" with default driver
Creating user_wordpress-db_1 ... done                                           Creating user_wordpress-app_1 ... done  

起動の確認をする。

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

コンテナの名前は
作業用ディレクトリ名-コンテナ名-数字
というように名付けられている。
コンテナの起動を確認。

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                  NAMES
dc7431bdd453   wordpress:latest   "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   0.0.0.0:8080->80/tcp   user_wordpress-app_1
64796a8ae728   mysql:5.7          "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   3306/tcp, 33060/tcp    user_wordpress-db_1

ネットワークの確認

$ docker network ls
 docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
04bb0d4d26cc   api-net             bridge    local
a02a1cc2fda3   bridge              bridge    local
161ff55df66f   host                host      local
c95bc06da33f   none                null      local
fa72af2b721a   wordpressnet        bridge    local

ボリュームの確認

$ docker volume ls
docker volume ls
DRIVER    VOLUME NAME
local     42cde0ee0e7c4af7106bf649e67854a8116429398c5f3820172643eca5a4d8c9
略
local     db_volume

ここで作成できたコンテナは個々に停止したり削除したりできるが、dockerComposeで一括管理することができる。

■コンテナを一括で停止および削除する。

$ docker-compose down
Stopping user_wordpress-app_1 ... done                                            Stopping user_wordpress-db_1  ... done                                            Removing user_wordpress-app_1 ... done                                            Removing user_wordpress-db_1  ... done                                           Removing network user_wordpressnet

コンテナの確認をする。

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

dockerComposeで一括削除するときにdocker-compose.ymlファイルの内容に従って削除されるの一括で削除するときはファイルの書き換えのないように気をつける。

まとめ

すごいべんりだと思った(>_<)

Discussion