Docker でコンテナ間通信ってどうやるの?
コンテナ間の通信ってどうやるのかという疑問が出たので、調べた内容を残しておく。
やりたいこと
環境
- Windows 10 Home (64bit)
- Visuali Sutdio Code
- Docker Toolbox
- ポート:8090
コンテナ間通信
同じホスト内でコンテナ間をコンテナ名で通信する場合は、コンテナを同じネットワーク内で起動しておく必要があるらしい。
下記を参考(そのまままねて)にしてやってみる。 knowledge.sakura.ad.jp
ついでに、 docker compose を使った場合もやってみる。
Docker でコンテナ間通信
ざっくりとして手順。
1:コンテナネットワーク作成
2:1で作成したネットワーク上でコンテナを起動する
- ネットワーク作成
「wordpress-network」でコンテナネットワークを作成する。
docker network create wordpress-network
コンテナネットワークが作成されているか確認する。
$ docker network ls NETWORK ID NAME DRIVER SCOPE 548044c5d811 bridge bridge local 7987b453fc8c host host local 2a179bb52592 none null local 0b1105eef469 wordpress-network bridge local
作成されたコンテナネットワークの中身を確認する。
$ docker network inspect wordpress-network [ { "Name": "wordpress-network", "Id": "0b1105eef469596d1280b20d05550aa5d0ece6255d3bfa2fefe264e7b74bc8e7", "Created": "2019-12-15T11:44:28.044695246Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]
- コンテナ作成(コンテナ間通信する2つのコンテナ)
コンテナ名を「sample-mysql」とした mysql コンテナを起動する。(dockerイメージはrun時に持ってくる)
docker run --name sample-mysql --network wordpress-network -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
コンテナ名を「wordpress 」とした wordpress コンテナを起動する。(dockerイメージはrun時に持ってくる)
"WORDPRESS_DB_HOST" は WordPress のDBのホスト名の設定
"WORDPRESS_DB_PASSWORD" は WordPress の接続するDBのパスワードの設定
※"-e"のオプションは環境変数の設定
docker run --name wordpress --network wordpress-network -e WORDPRESS_DB_HOST=sample-mysql -e WORDPRESS_DB_PASSWORD=my-secret-pw -p 8080:80 -d wordpress
作成されたコンテナイメージを確認する。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE wordpress latest b9db6e8f3175 2 days ago 539MB mysql 5.7 1e4405fe1ea9 3 weeks ago 437MB
起動しているコンテナを確認する。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d7d2f43976fd mysql:5.7 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 3306/tcp, 33060/tcp sample-mysql 7308049993a2 wordpress "docker-entrypoint.s…" 21 minutes ago Up 13 minutes 0.0.0.0:8080->80/tcp wordpress
- 通信確認(ホストから接続)
http://localhost:8090/
で接続する。ただし、本ブログではDocker Toolboxで接続しているため、ポート番号が8090となっている。
Docker Toolboxを使用しない場合は、ホストOSからポート8080で接続可能。
Docker Compose でコンテナ間通信
- docker-compose.yml 作成
version: '3' services: wordpress: image: wordpress container_name: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: sample-mysql WORDPRESS_DB_PASSWORD: my-secret-pw mysql: image: mysql:5.7 container_name: sample-mysql environment: MYSQL_ROOT_PASSWORD: my-secret-pw
- コンテナ作成
docker compose を実行する。
※docker-compose.yml を配置しているディレクトリで実行すること。
docker-compose up -d
コンテナネットワークを確認する。
※docker compose ではコンテナネットワークをデフォルトで作成してくれるらしい。ネットワーク名は、「ディレクトリ名 & "_default"」っぽい。
$ docker network ls NETWORK ID NAME DRIVER SCOPE 548044c5d811 bridge bridge local 7987b453fc8c host host local 2a179bb52592 none null local 0abd1b08fdc9 test-docker-network_default bridge local 0b1105eef469 wordpress-network bridge local
作成されたコンテナイメージを確認する。
$ docker-compose images Container Repository Tag Image Id Size ---------------------------------------------------------- sample-mysql mysql 5.7 1e4405fe1ea9 416 MB wordpress wordpress latest b9db6e8f3175 514 MB
起動しているコンテナを確認する。
$ docker-compose ps Name Command State Ports ---------------------------------------------------------------------------- sample-mysql docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp wordpress docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0022bd9d0e0f mysql:5.7 "docker-entrypoint.s…" 8 hours ago Up 25 seconds 3306/tcp, 33060/tcp sample-mysql 53d349af16dd wordpress "docker-entrypoint.s…" 8 hours ago Up 25 seconds 0.0.0.0:8080->80/tcp wordpress
- 通信確認(ホストから接続)
http://localhost:8090/
で接続する。ただし、本ブログではDocker Toolboxで接続しているため、ポート番号が8090となっている。
Docker Toolboxを使用しない場合は、ホストOSからポート8080で接続可能。
おわりに
だいぶコンテナ使えるようになったかなと思っていたけど、調べれば調べるほど知らない、わからないが増えていく。 ネットワークに関してもまだまだ奥が深そう。 もう少しコンテナを触ったらサーバーレスに手を出していこうかと。 (機械学習も含めてサーバーレスでなんかアプリ作れないかな)