hijikitaroのブログ

しがないSIerとして、日々プロジェクトを管理し、システムを育て、日々お子を見守り育てる中での出来事や学びを淡々と書いています。

Docker でコンテナ間通信ってどうやるの?

コンテナ間の通信ってどうやるのかという疑問が出たので、調べた内容を残しておく。

やりたいこと

  • コンテナ名でコンテナ間の通信を行う
    • wordpressコンテナ ⇔ mysqlコンテナ
    • 同一ホスト上(別ホストの場合はまた違う設定が必要っぽい)

環境

  • 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で接続可能。

おわりに

だいぶコンテナ使えるようになったかなと思っていたけど、調べれば調べるほど知らない、わからないが増えていく。 ネットワークに関してもまだまだ奥が深そう。 もう少しコンテナを触ったらサーバーレスに手を出していこうかと。 (機械学習も含めてサーバーレスでなんかアプリ作れないかな)

参考

tech-blog.rakus.co.jp

www.slideshare.net docs.docker.jp docs.docker.jp docs.docker.jp docs.docker.jp