web開発は、複数のサーバー(コンテナ)を連携して、サービス開発を行います。
例えば、webサーバーやDBサーバー、キャッシュサーバー、loggingサーバーなど複数のサーバーを連携して、一つのアプリケーションを作成していきます。
docker-composeを使用すれば、それらの複数のサーバー(コンテナ)を同時に立ち上げて開発することが可能になります!
DBと連携したdocker-composeの作成
1 2 3 4 5 6 7 8 9 10 |
version: '3' services: app: image: ubuntu command: /bin/bash tty: true depends_on: - redis redis: image: redis |
docker-compose.yml
というファイルに上記の記述をして、そのファイルが有るディレクトリで、docker-compose up
コマンドを実行しましょう。
そうすると、
- ubuntuイメージを元にしたコンテナ
- redisイメージを元にしたコンテナ
の2つが立ち上がったことが以下のコマンドで確認できます。
1 |
docker container ls |
1 2 3 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3500d15563a6 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes docker-compose_app_1 b4e2d54f0cc4 redis "docker-entrypoint.s…" 4 minutes ago Up 2 minutes 6379/tcp docker-compose_redis_1 |
このように、docker composeを使用すれば、複数のコンテナを同時立ち上げて、それぞれの依存関係を定義することができます。
docker-compose.ymlの解説
services
一番上の階層のservicesというのは立ち上げるコンテナを定義します。
今回の例でいうと、ひとつ下のインデントである、
- app
- redis
の2つのコンテナが対象になります。
image
imageはコンテナの元になるimageを指定します。
今回は、ubuntuイメージとredisイメージを元に2つのコンテナを作成しました。
また、Dockerfileを指定することでDockerfileから作成されたimageを元にコンテナを作成することも可能です。
build【imageにDockerfileを指定する場合】
imageとしてDockerfileを指定する場合は、buildを使用します。
1 2 3 4 |
app: build: context: /dir dockerfile: Dockerfile-name |
上記の記述によって、【/dir/Dockerfile-name】という名前のDockerfileを元にコンテナを作成することができます。
command
コンテナが立ち上がった後に実行されるコマンドを指定します。
Dockerfileを元にコンテナを起動した場合、DockerfileのCMDは上書きされます。
tty: true
1 |
docker container run -it ubuntu /bin/bash |
上記の、【-it】のことです。
depends_on
コンテナ間の依存関係を定義するときに使用します。
今回の例でいうと、appコンテナがredisコンテナに依存していることを表しています。
一点だけ注意しなければいけないことは、depende_onはコンテナの開始の順序を制御するのみで、依存しているコンテナが実行可能になるまで待つことはしません。
その他のよく使う記述
networks
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
version: '3' services: web: build: . networks: - network_1 api: build: . networks: - network_1 networks: network_1: |
Dockerはコンテナ同士で通信する際に同一のnetworksに接続している必要があります。
上記の記述をすることで、webコンテナとapiコンテナを同一ネットワークに接続させた状態でDockerコンテナを立ち上げることができます。
environment
1 2 3 4 5 6 |
version: '3' services: mysql: image: mysql:5.7 environment: - TZ=Asia/Tokyo |
上記のよう記述すると、mysqlコンテナのTZをAsia/Tokyoに設定した状態で、Mysqlコンテナを立ち上げることができます。
このように、environmentを使用すると、環境変数の指定ができます。
また、env_fileを使用すると、ファイルパスを指定して、ファイルに環境変数を指定することも可能です。
ports
1 2 3 4 5 6 |
versions: '3' services: app: image: nginx ports: - 8080:80 |
portsを指定することで、ホストマシンのポートとコンテナのポートを指定して、Dockerコンテナを起動することが可能です。
上記のdocker-compose.ymlは以下のコマンドを実行したときと同じように、ホストマシンの8080ポートをnginxコンテナの80ポートを接続しています。
1 |
docker container run -p 8080:80 nginx |
volumes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
version: '3' services: mysql: image: mysql5.7 volumes: - mysqlvolume:/var/lib/mysql app: image: nginx volumes: - ./src:/usr/share/nginx/html volumes: mysqlvolume |
上記のdocker-compose.ymlを実行すると、
- mysqlコンテナでmysqlvolumeをコンテナ内の/var/lib/mysqlとバインド
- appコンテナで、./src配下のファイルを/usr/share/nginx/htmlとバインド
することができます。
また、volumes:の欄で、volumeを作成してコンテナが停止・削除されてもmysql内のデータを永続化されるようにしています。
実運用で覚えていくべき!
開発環境はwebサービスによって多種多様です。
そのため、各webサービスの仮想環境を作成するdocker-compose.ymlも多種多様なものになっています。
実運用で実際に使われているdocker-compose.ymlファイルをみることで、理解が深まるでしょう!
※幸いにもgithubを探れば、たくさんのプロジェクトのdocker-compose.ymlをみることができます!