[英]docker-compose : Why agent & app service fail due to hostname?
以下是 v2 规范中的工作 docker-compose 文件:
version: '2'
volumes:
webroot:
driver: local
services:
app: # Launch uwsgi application server
build:
context: ../../
dockerfile: docker/release/Dockerfile
links:
- dbc
volumes:
- webroot:/var/www/someapp
environment:
DJANGO_SETTINGS_MODULE: someapp.settings.release
MYSQL_HOST: dbc
MYSQL_USER: todo
MYSQL_PASSWORD: passwd
command:
- uwsgi
- "--socket /var/www/someapp/someapp.sock"
- "--chmod-socket=666"
- "--module someapp.wsgi"
- "--master"
- "--die-on-term"
test: # Run acceptance test cases
image: shamdockerhub/someapp-specs
links:
- nginx
environment:
URL: http://nginx:8000/todos
JUNIT_REPORT_PATH: /reports/acceptance.xml
JUNIT_REPORT_STACK: 1
command: --reporter mocha-jenkins-reporter
nginx: # Start nginx web server that forwards https packets to uwsgi server
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- "8000:8000"
links:
- app
volumes:
- webroot:/var/www/someapp
dbc: # Launch MySQL server
image: mysql:5.6
hostname: dbr
expose:
- "3306"
environment:
MYSQL_DATABASE: someapp
MYSQL_USER: todo
MYSQL_PASSWORD: passwd
MYSQL_ROOT_PASSWORD: passwd
agent: # Ensure DB server is runnin
image: shamdockerhub/ansible
links:
- dbc
environment:
PROBE_HOST: "dbc"
PROBE_PORT: "3306"
command: ["probe.yml"]
条目在哪里
MYSQL_HOST: dbc
PROBE_HOST: "dbc"
看起来不直观,因为在dbc
服务中hostname
设置为dbr
1)
app
服务在使用MYSQL_HOST: dbr
django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'dbr' (0)")
2)
当PROBE_HOST: "dbr"
时, agent
服务在 ansible 代码下也会失败
set_fact:
probe_host: "{{ lookup('env', 'PROBE_HOST') }}"
local_action: >
wait_for host={{ probe_host }}
1)
为什么这两项服务因价值dbr
而失败?
2)
如何使这两个服务与MYSQL_HOST: dbr
和PROBE_HOST: "dbr"
一起工作?
这就是 Docker 的工作方式,因为hostname
不是唯一的,如果给两个容器提供相同的主机名,这将导致问题,因此 compose 将始终使用服务名称进行 DNS 解析
设置hostname:
等效于普通 Linux 上的主机名(8) 命令:它会更改容器认为自己的主机名是什么,但不会影响容器外部可能试图访问它的任何内容。 例如,在普通 Linux 上运行hostname dbr
dbr 不会更改外部 DNS 服务器或其他机器的/etc/hosts
文件。 设置主机名可能会影响 shell 提示,在容器内获取交互式 shell 的异常情况下; 它对网络没有影响。
在单个 Docker Compose 文件中,如果您没有特殊的networks:
,任何容器都可以使用 YAML 文件中的块名称访问任何其他容器。 在您的文件中, app
、 nginx
、 test
、 dbc
和agent
是有效的主机名。 如果你手动指定一个container_name:
我相信这也是可以访问的; @asolanki 的回答中建议的网络别名给出了另一个名称; 和不推荐使用的links:
选项会给出另一个。 所有这些都是 Compose 为您提供的标准名称的补充。
Compose 中的网络对所有这些都有一些合理的解释。
在您的示例中, dbr
不是有效的主机名。 dbc
是容器的 Compose 服务名称,但上一个列表中的任何内容都不会导致主机名dbr
存在。 如果您docker-compose exec dlc sh
,它恰好是您将在提示中看到的名称,但没有其他人认为该容器具有该名称。
作为“ links:
已弃用”的特定推论,链接的形式links:
您拥有绝对没有任何作用。 links: [dbc]
使原本在名称dbc
下可见的容器对于该特定容器可见为相同的名称。 从客户端的角度来看,您可以使用它为容器提供替代名称,但我不会。
您的docker-compose.yml
文件没有任何networks:
块,因此 Compose 将创建一个default
网络并将所有容器附加到它。 这完全没问题,我不建议更改它。 如果您确实声明了多个网络,这里的另一个要求是客户端和服务器需要在同一网络上才能相互访问。 (没有networks:
块隐式有networks: [default]
。)
如果你想用另一个名字来引用服务,你可以使用网络别名。 修改 compose 文件以使用网络别名
version: '2'
volumes:
webroot:
driver: local
services:
app: # Launch uwsgi application server
build:
context: ../../
dockerfile: docker/release/Dockerfile
links:
- dbc
volumes:
- webroot:/var/www/someapp
environment:
DJANGO_SETTINGS_MODULE: someapp.settings.release
MYSQL_HOST: dbc
MYSQL_USER: todo
MYSQL_PASSWORD: passwd
command:
- uwsgi
- "--socket /var/www/someapp/someapp.sock"
- "--chmod-socket=666"
- "--module someapp.wsgi"
- "--master"
- "--die-on-term"
networks:
new:
aliases:
- myapp
test: # Run acceptance test cases
image: shamdockerhub/someapp-specs
links:
- nginx
environment:
URL: http://nginx:8000/todos
JUNIT_REPORT_PATH: /reports/acceptance.xml
JUNIT_REPORT_STACK: 1
command: --reporter mocha-jenkins-reporter
networks:
- new
nginx: # Start nginx web server that forwards https packets to uwsgi server
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- "8000:8000"
links:
- app
volumes:
- webroot:/var/www/someapp
networks:
- new
dbc: # Launch MySQL server
image: mysql:5.6
hostname: dbr
expose:
- "3306"
environment:
MYSQL_DATABASE: someapp
MYSQL_USER: todo
MYSQL_PASSWORD: passwd
MYSQL_ROOT_PASSWORD: passwd
networks:
new:
aliases:
- dbr
agent: # Ensure DB server is runnin
image: shamdockerhub/ansible
links:
- dbc
environment:
PROBE_HOST: "dbc"
PROBE_PORT: "3306"
command: ["probe.yml"]
networks:
- new
networks:
new:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.