root@ruopu:~# docker run -d -P --name web1 nginx e962c7424359a76bb7c185de8acd401616f1854fee9a7768596a020b214aeebf # 使用-P选项可以随机选择一个端口映射到容器中的打开的端口 root@ruopu:~# docker container ls -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ef89a43297 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:32778->80/tcp web1 # 使用-l选项只会显示最上面一条运行的容器的信息。可以看到,本地主机的32778端口被映射到了容器的80端口,此时访问本机的32778端口即可访问容器内的80端口
root@ruopu:~# docker logs -f web 192.168.0.89 - - [23/Nov/2018:04:51:29 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" "-" 192.168.0.89 - - [23/Nov/2018:04:51:29 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.0.132:32778/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" "-" 2018/11/23 04:51:29 [error] 8#8: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.89, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.132:32778", referrer: "http://192.168.0.132:32778/" # 使用此命令后,会监听容器的log日志,如果有人访问本机的32778端口,日志就会有显示。-f选项表示Follow log output,跟踪日志输出。
映射所有接口地址
1 2 3 4 5 6
root@ruopu:~# docker run -d -p 5000:5000 nginx 74a78539f3ae4befc1a272a92432f547ab0476b7a3bcf1800451be292c7ba690 root@ruopu:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74a78539f3ae nginx "nginx -g 'daemon of…" 51 seconds ago Up 51 seconds 80/tcp, 0.0.0.0:5000->5000/tcp hungry_leakey # 使用-p选项,可以指定本地的某端口映射到容器中的某个端口,上面就是映射了本地的5000端口到容器的5000端口。这样定义会监听本地的所有地址。
映射到指定地址的指定端口
1 2 3 4 5 6
root@ruopu:~# docker run -d -p 127.0.0.1:6000:5000 nginx 13221c9107420a3c71a04ae2c6d4bcba8e4ea4c6616863ab085712c38b4821d6 root@ruopu:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 13221c910742 nginx "nginx -g 'daemon of…" 5 seconds ago Up 5 seconds 80/tcp, 127.0.0.1:6000->5000/tcp frosty_agnesi # 将本地的回环地址的6000端口映射到容器的5000端口
映射到指定地址的任意端口
1 2 3 4 5 6
root@ruopu:~# docker run -d -p 127.0.0.1::5000 nginx 762d1752599817dc0052080ecdb29543522a0f321bdaaee4ee2495516f92bfe2 root@ruopu:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 762d17525998 nginx "nginx -g 'daemon of…" 25 seconds ago Up 25 seconds 80/tcp, 127.0.0.1:32768->5000/tcp loving_borg # 将本地的任意端口映射到容器的5000端口,可以看到本地的端口用了32768
映射UDP端口
1 2 3 4 5
root@ruopu:~# docker run -d -p 127.0.0.1:4000:5000/udp nginx 1258d3b29d3de4aa8cdf4cced7c2575855d04dc5c53edd6c894bd5670f336e75 root@ruopu:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1258d3b29d3d nginx "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp, 127.0.0.1:4000->5000/udp infallible_aryabhata
查看映射端口配置
1 2 3 4 5 6 7 8 9 10
root@ruopu:~# docker port web1 80 0.0.0.0:32783 # 使用port指令可以查看容器内的端口映射到了本地的哪个地址和端口 root@ruopu:~# docker container port web 80 0.0.0.0:32771 root@ruopu:~# docker container port web 80/tcp -> 0.0.0.0:32771 # 使用上面命令也可以显示容器端口的映射情况 root@ruopu:~# docker inspect web1 # 使用inspect指令可以获取容器所有的变量
绑定多个端口
1 2 3 4 5 6
root@ruopu:~# docker run -d -p 5001:5000 -p 5002:80 nginx 85ef456480e7bcc0180a07e705a0d8d48c4f4d618ed7fffa5c7474a322dbee98 root@ruopu:~# docker container ls -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85ef456480e7 nginx "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 0.0.0.0:5002->80/tcp, 0.0.0.0:5001->5000/tcp affectionate_bell # 可以多次使用-p选项来绑定多个端口
root@ruopu:~# docker run -it --rm --name busybox1 --network my-net busybox sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 90e01955edcd: Pull complete Digest: sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812 Status: Downloaded newer image for busybox:latest # 运行一个容器连接到新建的my-net网络 ruopu@ruopu:~$ docker run -it --rm --name busybox2 --network my-net busybox sh / # # 打开一个新终端再创建一个连接my-net网络的容器 root@ruopu:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5097ae5dbbc2 busybox "sh" About a minute ago Up About a minute busybox2 c71c2f7646a6 busybox "sh" 2 minutes ago Up 2 minutes busybox1 # 打开一个新终端查看容器信息
/ # mount ... /dev/mapper/ubuntu--vg-ubuntu--lv on /etc/resolv.conf type ext4 (rw,relatime,data=ordered) /dev/mapper/ubuntu--vg-ubuntu--lv on /etc/hostname type ext4 (rw,relatime,data=ordered) /dev/mapper/ubuntu--vg-ubuntu--lv on /etc/hosts type ext4 (rw,relatime,data=ordered) ... # 在容器中使用mount命令可以查看到挂载信息,其中有上面三条,挂载了宿主机的三个文件到容器,当宿主机信息发生改变时,所有Docker容器的配置通过这些文件也随之改变。
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 brctl show 来查看网桥和端口连接信息。
1 2 3 4
$ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 vethdda6
*注: brctl 命令在 Debian、Ubuntu 中可以使用 sudo apt-get install bridge-utils 来安装。 每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。
1 2 3 4 5 6 7 8 9 10 11 12
$ sudo docker run -i -t --rm busybox sh $ ip addr show eth0 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qle n 1000 link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::306f:e0ff:fe35:5791/64 scope link valid_lft forever preferred_lft forever $ ip route default via 172.17.42.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
* 首先启动 2 个容器: $ docker run -i -t --rm --net=none base /bin/bash root@1f1f4c1f931a:/# $ docker run -i -t --rm --net=none base /bin/bash root@12e343489d2f:/# # 找到进程号,然后创建网络命名空间的跟踪文件。 $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a 2989 $ docker inspect -f '{{.State.Pid}}' 12e343489d2f 3004 $ sudo mkdir -p /var/run/netns $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989 $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004 # 创建一对 peer 接口,然后配置路由 $ sudo ip link add A type veth peer name B $ sudo ip linkset A netns 2989 $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A $ sudo ip netns exec 2989 ip linkset A up $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A $ sudo ip linkset B netns 3004 $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B $ sudo ip netns exec 3004 ip linkset B up $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B