繁体   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