簡體   English   中英

docker-compose:為什么代理和應用服務因主機名而失敗?

[英]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: dbrPROBE_HOST: "dbr"一起工作?

這就是 Docker 的工作方式,因為hostname不是唯一的,如果給兩個容器提供相同的主機名,這將導致問題,因此 compose 將始終使用服務名稱進行 DNS 解析

設置hostname:等效於普通 Linux 上的主機名(8) 命令:它會更改容器認為自己的主機名是什么,但不會影響容器外部可能試圖訪問它的任何內容。 例如,在普通 Linux 上運行hostname dbr dbr 不會更改外部 DNS 服務器或其他機器的/etc/hosts文件。 設置主機名可能會影響 shell 提示,在容器內獲取交互式 shell 的異常情況下; 它對網絡沒有影響。

在單個 Docker Compose 文件中,如果您沒有特殊的networks: ,任何容器都可以使用 YAML 文件中的塊名稱訪問任何其他容器。 在您的文件中, appnginxtestdbcagent是有效的主機名。 如果你手動指定一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM