Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
Docker 在 1.13 版本引进了新的管理命令(management commands)
Docker 1.13+ 推 荐使用 docker network 子命令来管理 Docker 网络。
外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
- -P 随机映射端口(49000~49900)
- -p 指定映射端口
$ docker run -d -P training/webapp python app.py
$ docker ps -l
同样的,可以通过 docker logs 命令来查看应用的信息。
$ docker logs -f nostalgic_morse
-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口:
$ docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ docker port nostalgic_morse 5000
注意:
- 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker还可以有一个可变的网络配置。)
- -p 标记可以多次使用来绑定多个端口
$ docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py
容器互联
如果你之前有 使用经验,你可能已经习惯了使用 参数来使容器互联。 随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器。 容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。 该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
新建网络
下面先创建一个新的 Docker 网络。
$ docker network create -d bridge my-net
连接容器
创建一个容器并连接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --net my-net busybox sh
打开新的终端,再新建一个容器,加入 my-net 网络
$ docker run -it --rm --name busybox2 --net my-net busybox sh
查看容器
$ docker ps
下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。
在 busybox1容器输入以下命令。
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。
同理在 busybox2 容器执行 ping busybox1 ,也会成功连接到。
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
这样,busybox1 容器和 busybox2 容器建立了互联关系。
Docker Compose
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。