terminal与docker与链接撰写

我想在桥接networking下将三个服务(db,nginx和web服务)连接在一起,并能够从本地主机或容器内部捅出不同的服务,并为web服务提供交互式terminal。 我怎样才能做到这一点?

我的docker组成configuration如下:

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 ,我可以访问一个交互式terminal,但db和nginx服务不能正确启动/链接。 我得到以下输出:

 Starting courseadmin_nginx_1 Starting courseadmin_db_1 bash-4.3# 

然后从容器内部进一步的networking取证发现nginx或db都不存在。 我可以进一步支持这个说法,因为使用docker-compose up实际上为db服务创build了一个端口冲突,这个db服务被授予了我在主机系统上安装了mysql的东西,它从来没有用docker-compose run报告过。

另一方面,如果我尝试docker-compose up ,我得到一个更活跃的轨迹,但没有交互式terminal:

 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 | 

我能做些什么来实现我的三个容器的交互式terminal和正确的链接?

我不完全确定我完全理解你的问题,所以我会尽力回答我可以做到的一部分:

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

其余的,我的build议是:

  • docker-compose up -d将以分离的模式运行所有的东西。 只要你有正确的configuration,Docker撰写会照顾隐式链接。 有关docker-compose跨容器networking的更多细节, 这对我来说是一个很好的资源。 docker-compose上真正的东西从3.3页开始。
  • 一旦一切正常运行, docker ps -a将显示活动容器
  • 要启动一个'交互式terminal',只要执行docker exec -it $container_id bash如果我记得正确。 这将在该容器中启动一个terminal。 exec在指定容器中执行命令,而i标志启动“交互式”terminal, t标志指定TTY层,并且bash shell的types。

如果我可以添加额外的build议,请在您的webconfiguration中添加depends_on: class。 这将使您的Web容器等待SQL和Nginx都完全启动。 像这样:

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