🛸

docker-composeで複数のコンテナを同時に起動する

2022/06/25に公開

目的

docker-composeで複数のコンテナを起動します。

環境

OS:Windows 10 Pro
Docker Desctop:4.9.1
Docker:20.10.16
作業ディレクトリ:C:\Users\pcuser
※Docker Desctopの起動をお忘れなく。

コンテナ起動状況、イメージ確認

docker ps -a
docker images


コンテナは何も動いていません。
イメージはamazon linux:latestとal2_nginx:latestのバージョンがあります。
al2_nginx:latestコンテナイメージの作成はこちらから

docker-composeがインストールされているか確認

docker-composeコマンドが利用できるか確認します

docker-compose version
docker-compose start --help


docker-composeのバージョンとstartオプションのヘルプを確認してみました。
これで利用準備が整いました。

docker-composeコマンドがインストールされていない

WindowsやmacOSの方でDocker Desktopをインストールしている方はDockerに必要なToolがまるっとインストールされているはずです。その他のOSやpipでDockerをインストールしている方はdocker-composeコマンドがインストールされていない可能性があります。
docker-composeコマンドの公式を参照してインストールしてみてください

Nginxを2台同時に立ち上げてみる

55005ポート、55006ポートで受信できるNginxのコンテナイメージを作成し
docker-composeで同時に起動します

55005,55006ポートを公開するコンテナイメージを作成する

詳しくはDockerfileでコンテナ破壊しほうだいを参照ください。
ここではDockerfileの内容とbuildだけ記載します。

55005ポート公開のコンテナイメージ
FROM amazonlinux:2

# install amazon-linux-extras
RUN amazon-linux-extras install -y

# install nginx
RUN amazon-linux-extras install nginx1 -y

# open port 55005
EXPOSE 55005

# container cmd Nginxを起動します
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
docker build --no-cache -t al2_nginx_55005:latest .
55006ポート公開のコンテナイメージ
FROM amazonlinux:2

# install amazon-linux-extras
RUN amazon-linux-extras install -y

# install nginx
RUN amazon-linux-extras install nginx1 -y

# open port 55006
EXPOSE 55006

# container cmd Nginxを起動します
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
docker build --no-cache -t al2_nginx_55006:latest -f Dockerfile_55006 ./
Dockerfileの指定方法

docker build時に「.」を指定する=Dockerfileを指している。と、なります
任意のDockerfile(例:Dockerfile_55006)を指定する場合は
docker build --no-cache -t al2_nginx_55006:latest -f Dockerfile_55006 ./
-f ファイル名 格納場所 と、書き換えることでDockerfileを指定できます。

コンテナイメージ確認

docker images


al2_nginx_55005,al2_nginx_55006のコンテナイメージができました

docker-compose.ymlを作成

docker-composeを実施する際の設計図を作成します。

version: "3"

services:
  # サービス名
  amazon-linux-nginx55005:
    # 利用するイメージ
    image: al2_nginx_55005:latest
    # コンテナ名
    container_name: al2_nginx_55005
    # マウントするファイル ※ホスト→dockerコンテナへ
    volumes:
      - type: bind
        source: ./nginx_conf/al2_nginx_55005.conf
        target: /etc/nginx/nginx.conf
      - type: bind
        source: ./nginx_html/test55005.html
        target: /usr/share/nginx/html/test.html
    ports:
      - "55005:55005"

  # サービス名
  amazon-linux-nginx55006:
    # 利用するイメージ
    image: al2_nginx_55006:latest
    # コンテナ名
    container_name: al2_nginx_55006
    # マウントするファイル ※ホスト→dockerコンテナへ
    volumes:
      - type: bind
        source: ./nginx_conf/al2_nginx_55006.conf
        target: /etc/nginx/nginx.conf
      - type: bind
        source: ./nginx_html/test55006.html
        target: /usr/share/nginx/html/test.html
    ports:
      - "55006:55006"
docker-composeの用語

docker-compose.ymlのオプションは公式を参照してください
自分でもよく使うオプションを記載します

オプション 役割
version Dockerのバージョンを指定します。今回は3と指定します バージョンを詳しく
services コンテナサービスを指定します
amazon-linux-nginx55005 サービス名を指定します。名称は好きな文言で指定できます
image どのコンテナイメージを利用するか指定します
container_name コンテナが起動した時に名前を指定します
volumes マウントするファイルを指定します ※Windowsから起動するコンテナの中へファイルを繋ぎ合わせます

source: ./nginx_conf/al2_nginx_55006.conf ※Windowsにあるconfファイルを
target: /etc/nginx/nginx.conf ※コンテナのtargetへ繋ぎ合わせます

Nginxのconfファイルを作成

al2_nginx_55005.confとal2_nginx_55006.confを作成します。
私はC:\Users\pcuserにnginx_confフォルダを作成しその中に作成しました。
作成したhtmlファイルを以下に記載します

al2_nginx_55005.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       55005;
        listen       [::]:55005;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
al2_nginx_55006.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       55006;
        listen       [::]:55006;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

test.htmlを作成

al2_nginx_55005とal2_nginx_55006でアクセスした時にわかりやすいように
それぞれにtest.htmlを作成します。
私はC:\Users\pcuserにnginx_htmlフォルダを作成しその中に作成しました。
作成したhtmlファイルを以下に記載します。

al2_nginx_55005に設置するtest55005.html

access al2_nginx_55005

al2_nginx_55006に設置するtest55006.html

access al2_nginx_55006 !!

Docker Desktopの設定変更

WindowsはDockerとbindする際、設定をしないとbindできませんでした。
Docker Desktopを開き、画面右上の歯車からResourceのFileSharingを選択し
Dockerとbindするフォルダを選択してください。
※私はC:\Users\pcuser配下のどれかのファイルとbindしたかったので、C:\Users\pcuserを指定しました。


指定が完了したらApply & Restartを選択し、Docker Desktopを再起動してください。

準備が整いました

一度確認します

コンテナイメージ

nginxのconfファイル

test用のhtmlファイル

docker-composeコマンドを叩きます

docker-compose up -d


無事al2_nginx_55005とal2_nginx_55006のコンテナが起動しました。

al2_nginx_55005コンテナへ接続してみます

localhost:55005/test.htmlへ接続すると
「access al2_nginx_55005」が表示されます。
-これは、al2_nginx_55005コンテナが
-55005ポートで受信するNginxが起動している ※Nginx
-55005ポートを公開したコンテナが起動している ※Container
-55005ポートにアクセスが来たら55005ポートで受信する ※docker-compose
al2_nginx_55005コンテナが動いていることになります。

al2_nginx_55006コンテナへ接続してみます

localhost:55006/test.htmlへ接続すると
「access al2_nginx_55006」が表示されます。
-これは、al2_nginx_55006コンテナが
-55006ポートで受信するNginxが起動している ※Nginx
-55006ポートを公開したコンテナが起動している ※Container
-55006ポートにアクセスが来たら55006ポートで受信する ※docker-compose
al2_nginx_55006コンテナが動いていることになります。

ポート指定無しで接続してみます

localhost/test.htmlへ接続すると
「このサイトにアクセスできません」が表示されます。
-これは
-80ポートで受信するNginxが起動していない
-80ポートを公開したコンテナが起動していない
-80ポートにアクセスが来たらどのポートで受信していいか解らない
80ポートを受信できるコンテナが動いていないので当然の結果となりました。

docker-composeを破壊しましょう

docker-compose down


見事に破壊できました。

最後までお読みいただき、ありがとうございます。

今回はdocker-composeに触れてみました。
昨今のWEB業界は複数のサービスを起動させ、マイクロサービス化することが主流となりつつあります。
そんな中、テスト環境としてdocker-composeを利用すればローカル環境で開発が出来るのでとても便利で素敵ですね。

よろしければ「***の説明、下手っぴ」や「***の言い回し変」など
ご意見、ご批判頂ければ幸いです。

Discussion