Docker终端与链接组合

时间:2016-10-08 18:51:28

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

我想在桥接网络下将三个服务(db,nginx和web服务)链接在一起,并能够从我的localhost或容器内部查看不同的服务,并为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     | 

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

1 个答案:

答案 0 :(得分:2)

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

乍一看,您的docker-compose.yml文件看起来很好,正确运行docker-compose up命令似乎证实了这一点。但是,您指定version: '2'。从docker-compose文档,从版本2开始,链接由docker-compose本身隐式完成(我将在评论中添加链接,因为我没有足够的声誉)。这意味着您可以删除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标志启动'interactive'终端,t标志指定TTY层,bash shell类型

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

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