这是本系列的第三篇文章, 将介绍如何访问Docker容器。
一、外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过
-P
或
-p
参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个
49000~49900
的端口到内部容器开放的网络端口。 (如果写了Dockerfile, 将会使用EXPOSE处来的端口)
使用
docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
1
2
3
4
5 1$ sudo docker run -d -P training/webapp python app.py
2$ sudo docker ps -l
3CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
5
-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
例如:
映射所有接口地址
使用
hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
1
2
3 1$ sudo docker run -d -p 5000:5000 training/webapp python app.py
2
3
此时默认会绑定本地所有接口上的所有地址。
二、容器互联
容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。
该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
使用 –link 参数可以让容器之间安全的进行交互。
下面先创建一个新的数据库容器。
1
2 1$ sudo docker run -d --name db training/postgres
2
然后创建一个 web 容器,并将它连接到 db 容器
1
2 1$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
2
此时,db 容器和 web 容器建立互联关系。
–link 参数的格式为
–link name:alias,其中
name 是要链接的容器的名称,
alias 是这个连接的别名。
使用
docker ps 来查看容器的连接
1
2
3
4
5 1$ docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
4aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web
5
可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。
Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用
-p 和
-P 标记,从而避免了暴露数据库端口到外部网络上。