[英]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.