Docker Composeでホスト名を設定する方法を知りたいですか?それをお見せします。
次のようなサービスで定義できます:
...
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
...
しかし、本当にそれが必要ですか?ホスト名の一般的な目標は、ネットワーク上のコンピューターが相互に認識し、相互に通信することです。
同様に、ここでの主な目標は、コンテナーがDockerネットワーク内で相互に正常に通信できるようにすることです。
これを可能にする方法について、2つの方法について説明します。
方法1:非明示的なコミュニケーション
Dockerネットワーク内では、Docker Composeファイル内で定義されたサービス名を使用して、コンテナーが相互に通信できるかどうかをテストできます。
たとえば、次のリバースプロキシ構成を考えてみましょう。
version: '3.7'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html
- ./dhparam:/etc/nginx/dhparam
- ./vhost:/etc/nginx/vhost.d
- ./certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
restart: always
networks:
- net
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
env_file:
- ./letsencrypt.env
depends_on:
- nginx-proxy
volumes:
- ./certs:/etc/nginx/certs:rw
- ./vhost:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: always
networks:
- net
networks:
net:
external: true
2つのサービス名はnginx-proxy
であることに注意してください およびletsencrypt
。これらの名前を使用して、コンテナーが相互に通信できるかどうかをテストできます。これは、トラブルシューティングの状況で非常に役立ちます。
まず、Nginxリバースプロキシコンテナ内にpingをインストールします:
[email protected]:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
これで、このコンテナー内でpingコマンドを使用して、Let's Encryptコンテナー(SSLに使用)と通信できるかどうかを確認できます。
[email protected]:~/nginx-proxy$ sudo docker-compose exec nginx-proxy ping letsencrypt
PING letsencrypt (172.18.0.3) 56(84) bytes of data.
64 bytes from nginx-proxy_letsencrypt_1.net (172.18.0.3): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from nginx-proxy_letsencrypt_1.net (172.18.0.3): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- letsencrypt ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 37ms
上記のように、リバースプロキシコンテナは、応答を返す2番目のSSLコンテナを「認識」します。 nginx-proxy_letsencrypt_1.net
内 、nginx-proxy_letsencrypt_1
SSLコンテナ名とnet
カスタムネットワークです。
簡単に確認しましょう:
[email protected]:~/nginx-proxy$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9ef56e22f58 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 7 minutes ago Up 7 minutes nginx-proxy_letsencrypt_1
563133f5d039 jwilder/nginx-proxy "/app/docker-entrypo…" 7 minutes ago Up 7 minutes nginx-proxy_nginx-proxy_1
ネットワークを確認するには、docker network ls
を使用できます コマンド。
[email protected]:~/nginx-proxy$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
018c50dc4fdc bridge bridge local
27fd2370e735 net bridge local
38ce8d11227b host host local
2440210d0fc5 none null local
方法2:明示的なコミュニケーション
何らかの理由で、コンテナにホスト名を明示的に指定したいとします。 Docker Composeを使用すると、それも可能になります!
hostname
を使用する 構成オプションを使用すると、以下のLet's Encryptサービスで行ったように、DockerComposeファイル内で定義された任意のサービスに別のホスト名を設定できます。
version: '3.7'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html
- ./dhparam:/etc/nginx/dhparam
- ./vhost:/etc/nginx/vhost.d
- ./certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
restart: always
networks:
- net
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
env_file:
- ./letsencrypt.env
depends_on:
- nginx-proxy
volumes:
- ./certs:/etc/nginx/certs:rw
- ./vhost:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: always
networks:
- net
networks:
net:
external: true
ここで、hostname: ledocker
を明示的に追加したことに注意してください。 Let'sEncryptサービス定義内。 ledocker
を使いたい SSLコンテナのホスト名として。
しかし、待ってください。pingコマンドを使用して再確認できますか?
[email protected]:~/nextcloud$ sudo docker-compose exec nginx-proxy ping ledocker
PING ledocker (172.18.0.3) 56(84) bytes of data.
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=4 ttl=64 time=0.093 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=5 ttl=64 time=0.078 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=6 ttl=64 time=0.075 ms
^C
--- ledocker ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 129ms
rtt min/avg/max/mdev = 0.034/0.070/0.093/0.018 ms
確かにそう。動作します!
この点に関する知識をもっと知りたいですか?この非常に有益なGitHubスレッドをチェックしてください。
この簡単なヒントを楽しんでいただけたでしょうか。以下のコメントセクションに質問、疑問、提案を残すことができます。