В этом кратком совете по Docker вы узнаете, как задать имя хоста для вашего контейнера с помощью Docker Compose.
Вы можете задать его под сервисом следующим образом:
...
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
...
Но действительно ли вам это нужно?
Общая цель имени хоста заключается в том, чтобы компьютеры в сети знали друг друга и таким образом общались между собой.
🐳 Объяснение концепции сетей в Docker
Аналогично, основная цель здесь – обеспечить успешное взаимодействие контейнеров друг с другом в сети Docker.
🐳 Как определить DNS в контейнерах Docker
Далее будут показаны два способа, как сделать это возможным:
Метод 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
Обратите внимание, что имена двух служб – nginx-proxy и letsencrypt.
Вы можете использовать эти имена для проверки того, могут ли контейнеры взаимодействовать друг с другом.
🐳 Как запускать удаленные команды Docker с помощью SSH
Это может оказаться очень полезным в ситуациях поиска и устранения неисправностей.
Сначала установите ping внутри контейнера Nginx Reverse Proxy:
$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
Теперь вы можете использовать команду ping внутри этого контейнера, чтобы проверить, может ли он взаимодействовать с Let’s Encrypt Container (используемым для SSL).
y$ 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
Как вы можете видеть выше, контейнер обратного прокси “видит” второй SSL-контейнер, который отправляет ответ обратно!
🐳 Как узнать IP-адрес Docker контейнера
В nginx-proxy_letsencrypt_1.net, nginx-proxy_letsencrypt_1 – это имя SSL-контейнера, а net – наша пользовательская сеть.
Давайте быстро проверим это:
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.
$ 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, вы можете задать другое имя хоста для любой службы, определенной в файле Docker Compose, как это сделано для службы Let’s Encrypt:
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’s Encrypt.
Я хочу использовать ledocker в качестве имени хоста для контейнера SSL.
Но подождите, можем ли мы еще раз проверить с помощью команды ping?
$ 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
см. также:
- 🐳 Docker Compose Up или Start и Down или Stop: в чем разница
- 🐳 Как удалить все Docker контейнеры с помощью одной команды
- 🐳 Как запустить службу Docker при загрузке системы
- 🐳 Справочное руководство по командам Docker – новые команды по сравнению со старыми
- 🐳 Управление Docker контейнерами с помощью Docker Compose
- 🐳 Docker сетевое взаимодействие 101
- 🐳 Топ самых важных команд Docker