【问题标题】:Terminal with Docker Compose with Links带有 Docker 的终端 Compose with Links
【发布时间】:2017-02-17 13:36:19
【问题描述】:

我想在一个桥接网络下将三个服务(db、nginx 和 web 服务)链接在一起,并且能够从我的本地主机或容器内部戳不同的服务,并有一个用于 web 的交互式终端服务。我怎样才能做到这一点?

我的 docker-compose 配置如下:

version: '2'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile-alpine
    command: /bin/bash
    ports:
      - "5000:5000"
    volumes:
      - $REPO_DIR:/repository
    links:
      - db
      - nginx
  nginx:
    image: nginx:stable-alpine
    ports:
      - "8080:8080"
    volumes:
      - $NGINX_STATIC_DIR:/var/www/static
      - $NGINX_CONFIG_FILE:/etc/nginx/nginx.conf
  db:
    image: mysql/mysql-server
    ports:
      - "3307:3306"
    environment:
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      MYSQL_DATABASE: $MYSQL_DATABASE
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
    volumes:
      - $DB_DATA_DIR:/var/lib/mysql
      - $DB_LOG_DIR:/var/log/mysql

Web 服务使用 mhart/alpine-node:6.7.0 作为基础,并进一步添加了一些实用程序以及 Python3.5 和 Flask。

如果我执行docker-compose run web,我可以访问交互式终端,但 db 和 nginx 服务未正确启动/链接。我得到以下输出:

Starting courseadmin_nginx_1
Starting courseadmin_db_1
bash-4.3#

然后从容器内部进行进一步的网络取证,发现 nginx 或 db 都不存在。我可以进一步支持这一说法,因为使用 docker-compose up 实际上会为我在主机系统上安装 mysql 的 db 服务创建端口冲突,而 docker-compose run 从未报告过。

另一方面,如果我尝试docker-compose up,我会得到更活跃的跟踪,但没有交互式终端:

Starting courseadmin_nginx_1
Recreating courseadmin_db_1
Recreating courseadmin_web_1
Attaching to courseadmin_nginx_1, courseadmin_db_1, courseadmin_web_1
db_1     | Initializing database
courseadmin_web_1 exited with code 0
db_1     | Database initialized
db_1     | MySQL init process in progress...
db_1     | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db_1     | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | 
db_1     | /entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_1     | 
db_1     | 
db_1     | MySQL init process done. Ready for start up.
db_1     | 

如何实现交互式终端和正确链接我的三个容器?

【问题讨论】:

    标签: networking docker docker-compose environment docker-container


    【解决方案1】:

    我不完全确定我完全理解你的问题,所以我会尽量回答我能回答的部分:

    乍一看,您的docker-compose.yml 文件看起来不错,而docker-compose up 命令的正确运行似乎证实了这一点。但是,您指定version: '2'。从docker-compose 文档,从版本2 开始,链接由docker-compose 本身隐式完成(我将在cmets 中添加链接,因为我没有足够的声誉)。这意味着您可以删除 links: 部分(除非您寻求明确指定这些别名,在这种情况下您可以忽略此部分)。我认为解释 V1 和 V2 之间区别的一个很好的资源是 this(他在帖子的第 2 步中介绍了 links),但您当然也可以查看 docker-compose docs

    对于其余的,我的建议:

    • docker-compose up -d 将以分离模式运行所有内容。 Docker compose 将处理隐式链接,只要您正确配置了这些链接。有关docker-compose 的容器间网络的更多详细信息,this 对我来说是一个很好的资源。 docker-compose 上的真正内容始于该页面的第 3.3 节。
    • 一切就绪并运行后,docker ps -a 将向您显示活动容器
    • 要启动“交互式终端”,如果我没记错的话,只需执行docker exec -it $container_id bash。这将在该容器中启动一个终端。 exec 在指定容器中执行命令,而i 标志启动“交互式”终端,t 标志指定 TTY 层,bash 指定外壳类型。

    如果我可以添加其他建议,请在您的 web 配置中添加 depends_on: 类。这将使您的 Web 容器等待 SQL 和 Nginx 完全启动。像这样:

    services:
      web:
        [...]
        depends_on:
          - nginx
          - db
    

    【讨论】:

    • 我一直在谈论的docker-compose文档可以在这里找到,特别是关于links的部分:docs.docker.com/compose/networking/#/links
    • 好帖子!它肯定对我进步有很大帮助。但是我不能执行 docker exec -ti $container_id 因为我的 web 容器一直在死亡,因为 /bin/bash 没有任何事情可做。有什么方法可以在不通过任何入口点的情况下让它保持活力?
    • 如果您不清楚为什么您的web 容器会死机,请参阅here。剩下的,您能否在您的 OP 中详细说明您想要通过web 服务实现的目标?对我来说,您似乎可以简单地执行image: alpine,它会设置一个容器,然后您可以在其中使用exec 启动一个shell?
    • 啊,我想我误会了。要运行您的 alpine 容器,按照this 的回答,只需执行command: tail -f /dev/null 以保持容器运行。
    • 太棒了!这可以解决我的问题。不幸的是,像这样的小细节没有像 docker 文档的其余部分那样有据可查
    猜你喜欢
    • 2019-02-10
    • 2022-01-16
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2017-01-19
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多