docker-composeで複数のコンテナを同時に起動する
目的
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