在前面的例子里我们已经用过一些网络配置的部分功能了。
这边再一起说一下。
docker可以给镜像做端口映射,基本的命令是 -P(大写)
docker run -d -P tomcat:7.0.55
当使用-P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口:
这里的22端口自动做好了映射。但这里有几个问题。1是映射的端口号随机,不好管理;在这个镜像里还有一个tomcat的服务,打开了8080端口,但是这自动映射并没有识别出来。
所以还是得要手动的配置映射内容,-p(小写的P)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。
docker run -d -p 80:8080 tomcat:7.0.55 //本地的80端口到容器的8080端口(所有地址) docker run -d -p 127.0.0.1::8080/udp tomcat:7.0.55 //127地址的随机端口到容器的8080端口(UDP协议)
可以通过port指令查看内部端口的映射信息:
docker port 83b1e0 8080
多个端口映射可以用多个-p
docker run -d -p 80:8080 -p 22:22 tomcat:7.0.55
当Docker启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。
当创建一个Docker容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI 2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了在主机和所有容器之间一个虚拟共享网络。