Docker 终端与链接组合
Terminal with Docker Compose with Links
我想 link 桥接网络下的三个服务(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 服务没有 booted/linked 正确。我得到以下输出:
Starting courseadmin_nginx_1
Starting courseadmin_db_1
bash-4.3#
然后从容器内部进行进一步的网络取证,发现 nginx 或 db 都不存在。我可以进一步支持这一说法,因为使用 docker-compose up
实际上为 db 服务创建了一个端口冲突,我已经在我的主机系统上安装了 mysql,它从未用 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 |
我该怎么做才能实现交互式终端并正确 link 我的三个容器?
我不完全确定我完全理解你的问题,所以我会尽量回答我能回答的部分:
乍一看,您的 docker-compose.yml
文件看起来不错,docker-compose up
命令的正确 运行ning 似乎证实了这一点。但是,您指定 version: '2'
。从 docker-compose
文档,从版本 2 开始,链接由 docker-compose
本身隐式完成(我将在评论中添加链接,因为我没有足够的声誉)。这意味着您可以删除 links:
部分(除非您试图明确指定这些别名,在这种情况下您可以忽略此部分)。我认为解释 V1 和 V2 之间区别的一个很好的资源是 this(他在 post 的第 2 步中介绍了 links
),但您当然也可以检查 docker-compose docs
.
剩下的,我的建议是:
docker-compose up -d
将 运行 一切都处于分离模式。 Docker compose 将处理隐式链接,只要您正确配置了这些链接。有关使用 docker-compose
进行容器间网络的更多详细信息,this 对我来说是一个很好的资源。 docker-compose
上的真正内容从该页面的第 3.3 节开始。
- 一切就绪后 运行ning,
docker ps -a
将显示活动容器
- 要开始 'interactive terminal',如果我没记错的话,只需执行
docker exec -it $container_id bash
。这将在该容器中启动一个终端。 exec
在指定的容器中执行命令,而 i
标志启动一个 'interactive' 终端, t
标志指定 TTY 层, bash
类型shell.
如果我可以添加其他建议,请在您的 web
配置中添加 depends_on:
class。这将使您的 Web 容器等待 SQL 和 Nginx 完全启动。像这样:
services:
web:
[...]
depends_on:
- nginx
- db
我想 link 桥接网络下的三个服务(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 服务没有 booted/linked 正确。我得到以下输出:
Starting courseadmin_nginx_1
Starting courseadmin_db_1
bash-4.3#
然后从容器内部进行进一步的网络取证,发现 nginx 或 db 都不存在。我可以进一步支持这一说法,因为使用 docker-compose up
实际上为 db 服务创建了一个端口冲突,我已经在我的主机系统上安装了 mysql,它从未用 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 |
我该怎么做才能实现交互式终端并正确 link 我的三个容器?
我不完全确定我完全理解你的问题,所以我会尽量回答我能回答的部分:
乍一看,您的 docker-compose.yml
文件看起来不错,docker-compose up
命令的正确 运行ning 似乎证实了这一点。但是,您指定 version: '2'
。从 docker-compose
文档,从版本 2 开始,链接由 docker-compose
本身隐式完成(我将在评论中添加链接,因为我没有足够的声誉)。这意味着您可以删除 links:
部分(除非您试图明确指定这些别名,在这种情况下您可以忽略此部分)。我认为解释 V1 和 V2 之间区别的一个很好的资源是 this(他在 post 的第 2 步中介绍了 links
),但您当然也可以检查 docker-compose docs
.
剩下的,我的建议是:
docker-compose up -d
将 运行 一切都处于分离模式。 Docker compose 将处理隐式链接,只要您正确配置了这些链接。有关使用docker-compose
进行容器间网络的更多详细信息,this 对我来说是一个很好的资源。docker-compose
上的真正内容从该页面的第 3.3 节开始。- 一切就绪后 运行ning,
docker ps -a
将显示活动容器 - 要开始 'interactive terminal',如果我没记错的话,只需执行
docker exec -it $container_id bash
。这将在该容器中启动一个终端。exec
在指定的容器中执行命令,而i
标志启动一个 'interactive' 终端,t
标志指定 TTY 层,bash
类型shell.
如果我可以添加其他建议,请在您的 web
配置中添加 depends_on:
class。这将使您的 Web 容器等待 SQL 和 Nginx 完全启动。像这样:
services:
web:
[...]
depends_on:
- nginx
- db