背景
ブリッジネットワークの使用で通信する際、相手コンテナのIPアドレスを意識しなくても良い。便利ですね。
一方、ブリッジネットワークを使用しない場合、どうなりますか。
もちろん、通信は大丈夫ですが、相手のIPアドレスを指定する必要があります。
固定IPアドレスなら、別に便利ではないとも言えないですが、
IPアドレスが頻繫に変動したり、コンテナを別のホストに移動したり数場合、通信ができなくなる場合はありますね
次はブリッジネットワークを使用しないで、Linux+nginx+php環境を構築してみます。
1. ブリッジネットワークを使用しないでphpコンテナを起動する
[root@localhost /]# docker run -p 9000:9000 --name php-fpm \
-v /work/www:/var/www/html \
-d php:7.1-fpm
6656876bfd4ef1f4f0c6f778622f11a7d027e4c98e9534aca5973af308de170e
[root@localhost /]#
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6656876bfd4e php:7.1-fpm "docker-php-entrypoi…" 3 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php-fpm
[root@localhost /]#
[root@localhost /]#
2. phpコンテナのネットワークを確認
[root@localhost /]# docker inspect php-fpm | tail -22
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "90f98361e6f902c50a07cf7806f623b540bd21471a9902b5d213bc70fbbae91d",
"EndpointID": "c4e763127a6d637a8b6d16df45f56e781e7c451cc7c3bbc44ca3b6471bbda41f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2", //ブリッジネットワークしない場合、このIPアドレスを使用することになる
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
3. nginxコンテナを起動
⇒失敗
[root@localhost /]# docker run -p 80:80 --name nginx \
-v /work/www:/usr/share/nginx/html \
-v /work/nginx/conf.d:/etc/nginx/conf.d \
--net lnmp \ //nginxコンテナはブリッジネットワークを使っています
-e TZ=Asia/Tokyo \
--privileged=true \
-d nginx
0a11ff8960e5fe40a7661067fa55ca37d2423d6cbb487efd29543ec9a69dd337
[root@localhost /]#
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6656876bfd4e php:7.1-fpm "docker-php-entrypoi…" 44 seconds ago Up 43 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php-fpm
[root@localhost /]#
4. ログを確認して、php-fpmに接続できない
[root@localhost /]# docker logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/03/11 22:08:31 [emerg] 1#1: host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:12
nginx: [emerg] host not found in upstream "php-fpm" in /etc/nginx/conf.d/default.conf:12
[root@localhost /]#
5. php-fpmをphpのIPアドレス(172.17.0.2)に修正
修正前:fastcgi_pass php-fpm:9000;
修正後:fastcgi_pass 172.17.0.2:9000;
[root@localhost /]# cat /work/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php(.*)$ {
root /var/www/html; # php コンテナのワークディレクトリ
fastcgi_pass 172.17.0.2:9000; #ここは修正箇所:phpコンテナのIPアドレスを記入
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@localhost /]#
6. nginxを再起動
⇒起動出来ました!
[root@localhost /]# docker restart nginx
nginx
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a11ff8960e5 nginx "/docker-entrypoint.…" 10 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx
6656876bfd4e php:7.1-fpm "docker-php-entrypoi…" 11 minutes ago Up 11 minutes 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php-fpm
[root@localhost /]#
[root@localhost /]#