別々のdocker-composeに属するコンテナ同士で疎通させる
もう3ヶ月くらい前になるのですが、Dockerを雰囲気でやっていた自分が、ローカル上でそんなことをすることになりました。
当時の自分がこのタイトルを見ても「ハァ???」みたいな気持ちになったと思います。。。
dockerを理解するために読んだもの、読みたかったもの
最初の時点で、インフラに詳しいメンバーから
「たぶん network
を設定するんだと思いますよー」
と言われていたんですが、とにかく自分はDockerについての知識が浅かったので、まずは docker-compose.yml が読めるようになるまで勉強してみました。
読んだもの
読みたかったもの
いろいろ勉強して解決した後に読んだけど、これを先に読みたかったw
docker-compose のnetworkについて
DockerとComposeの基本的なところを勉強したら、インフラに詳しいメンバーから教えてもらった network
について調べつつ、疎通させる方法も一緒に調べていきました。
以下のドキュメント・記事を参考にさせていただきました。
Compose のネットワーク機能 — Docker-docs-ja 17.06.Beta ドキュメント
疎通の方法について
ということで、上記の記事と同じような話にはなりますが、別々のdocker-composeに属するコンテナ同士で疎通させる方法についてです。
それぞれ docker-compose がdefaultで持っているnetworkに加えて、疎通するための新しいdocker networkを作成します。
docker network create common_network
と、自分だけが開発しているものであればこれでいいのですが、開発しているRailsアプリケーションは、docker-composeコマンドを含めた一連の立ち上げコマンドをMakefileでまとめています。
なので、コンテナとRailsサーバーを起動するmakeコマンドの中に、上記のnetwork作成コマンドを入れておきました。
次に、docker-compose.ymlにnetworkまわりの設定を追加します。
今回は両方のdocker-compose.ymlのservice nameが全く同じ構成だったので、aliasを追加しました。
ひとつめのdocker-compose.yml
version: '3' services: db: image: mysql:5.7 ports: - "3306" environment: MYSQL_ROOT_PASSWORD: "hogehoge" volumes: - db:/var/lib/mysql web: build: context: . dockerfile: docker/web/Dockerfile command: bundle exec rails server --port=3000 --binding='0.0.0.0' volumes: - .:/first_web - bundle:/usr/local/bundle - ./node_modules:/second_web/node_modules:delegated ports: - "3000" depends_on: - db tty: true stdin_open: true networks: default: common_network: aliases: - first_web volumes: bundle: db: networks: common_network: external: true
ふたつめのdocker-compose.yml
version: '3' services: db: image: mysql:5.7 ports: - "3306" environment: MYSQL_ROOT_PASSWORD: "hogehoge" volumes: - db:/var/lib/mysql:delegated web: build: context: . dockerfile: docker/web/Dockerfile command: bundle exec rails server --port=3000 --binding='0.0.0.0' volumes: - .:/second_web - bundle:/usr/local/bundle - ./node_modules:/second_web/node_modules:delegated ports: - "3000" depends_on: - db tty: true stdin_open: true networks: default: common_network: aliases: - second_web volumes: bundle: db: networks: common_network: external: true