docker允许通过外部访问容器或容器互联的方式来提供网络服务。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P
或-p
参数来指定端口映射。
当使用-P
参数时
1 2 3 4 5 | docker run -d -P training/webapp python app.py 查看 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6068ede204d training/webapp "python app.py" 21 seconds ago Up 19 seconds 0.0.0.0:32768->5000/tcp festive_agnesi |
---|
通过docker logs -f NAMES
来查看
1 2 | [root@xs_test01 wwwlogs]# docker logs -f festive_agnesi * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) |
---|
使用-p
时,需要单独指定地址,且在一个端口上只能绑定一个容器,否则会报错
1 2 3 4 5 6 7 8 | docker run -d -p 1111:11 training/webapp python app.py #这个是将本地的1111端口映射到容器的11端口 docker run -d -p 127.0.0.1:1112:12 training/webapp python app.py #映射到指定地址的指定端口 docker run -d -p 127.0.0.1::5000 training/webapp python app.py #映射到指定地址的任意端口 docker run -d -p 127.0.0.1::5000/udp training/webapp python app.py #使用udp来标记udp端口 docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #绑定多个端口 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51c9ba211f9c training/webapp "python app.py" 9 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp musing_albattani |
---|
查看端口映射
使用ddocker port NAMES PORT
来查看
1 2 | [root@xs_test01 wwwlogs]# docker port compassionate_ptolemy 5000 127.0.0.1:32769 |
---|
新建网络
1 2 | [root@xs_test01 wwwlogs]# docker network create -d bridge my-net a1822b830e76d490f27fcdf5ac0b93595c9de4726a801b703d6ed06db5b78c59 |
---|
新建容器并连接刚创建的网络
1 2 3 4 5 6 | [root@xs_test01 wwwlogs]# docker run -it --rm --name busybox1 --network my-net busybox sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox d070b8ef96fc: Pull complete Digest: sha256:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21 Status: Downloaded newer image for busybox:latest |
---|
打开另一个终端再新建一个容器并加入到刚创建的网络
1 2 | [root@xs_test01 ~]# docker run -it --rm --name busybox2 --network my-net busybox sh / # |
---|
在第一个终端中测试连通性
1 2 3 4 | / # ping busybox2 PING busybox2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.441 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.202 ms |
---|
同样在第二个终端中测试
1 2 3 4 | / # ping busybox1 PING busybox1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.338 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.188 ms |
---|
如果有多个容器要互联,可以使用docker compose
如何自定义配置容器的主机名和DNS?
在容器中使用mount
来查看挂载信息:
1 2 3 4 | mount /dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota) |
---|
如果退出容器可以使用docker exec
来进入
1 | docker exec -it busybox1 sh |
---|
修改/etc/docker/daemon.json
1 2 3 4 | [root@xs_test01 docker]# cat daemon.json { "dns": ["114.114.114.114","8.8.8.8"] } |
---|
修改完成后一定后重启docker
1 | systemctl restart docker |
---|
启动一个容器查看dns是否生效
1 2 3 | [root@xs_test01 docker]# docker run -it --rm ubuntu:17.10 cat etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8 |
---|
这种修改方式,所有的容器都会生效,当然也可以手动对单个容器做修改。
1 2 3 | [root@xs_test01 docker]# docker run -it --rm --name web_server -h webserver --dns=8.8.8.8 centos /bin/bash [root@webserver /]# cat /etc/resolv.conf nameserver 8.8.8.8 |
---|
-h HOSTNAME
或--hostname=HOSTNAME
设定容器的主机名,会被写到容器的/etc/hostname
和/etc/hosts
--dns=IP
添加dns服务器到容器的/etc/resolv.conf
中
当docker启动时,会自动在主机上创建一个docker0
虚拟网桥,实际上是linux的一个bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间进行转发,同时docker随机分配一个本地未占用的私有网段中的一个地址给docker0
接口,然后我们在启动容器的时候也会自动分配一个同一网段的地址。
当我们创建了一个容器的时候,同时也会创建一个veth
pair接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,这两个接口一个是在容器中被绑定,名字为eth0,另一个在被挂载到docker0网桥上,以veth开头,这就是容器和主机之间进行通讯的原理。
手动起一个容器看下主机网卡变化:
1 2 | # docker start musing_albattani musing_albattani |
---|
ifconfig
查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # ifconfig veth637e217: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::b827:18ff:fe04:b918 prefixlen 64 scopeid 0x20<link> ether ba:27:18:04:b9:18 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:66ff:fec3:a078 prefixlen 64 scopeid 0x20<link> ether 02:42:66:c3:a0:78 txqueuelen 0 (Ethernet) RX packets 3511 bytes 199800 (195.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4628 bytes 73413939 (70.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
---|
看到docker0网桥和在启动容器后起的网卡名是以veth开头的网卡被挂载到了docker0上,也可以验证容器在启动时会自动分配一个同一网段的地址。