docker run -d -P nginx #映射隨機端口 docker run -d -p 80:80 nginx #映射指定端口 docker run -d -p 80:80 -p 5000:5000 nginx #映射多個指定端口 docker run -d -p 127.0.0.1:80:50 #映射指定地址的指定端口,默認會綁定本地全部接口上的全部地址 docker run -d -p 127.0.0.1::80 nginx #映射到指定地址的任意端口 docker port 610889eaab4b 80 #查看映射端口配置,610889eaab4b爲容器ID,80爲容器端口。
docker run -d -p 80:80 --name web nginx
docker inspect -f "{{.Name}}" 8f3c7f469b18
docker run -d --name db mysql docker run -d -p 80:80 --name web2 --link web1:web1 nginx --link參數的格式爲--link name:alias,其中name是要連接的容器名稱,alias是這個鏈接的別名。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' web1 docker inspect web1|awk -F\" '/"IPAddress/{print $--NF}' docker exec -ti web1 awk 'END{print $1}' /etc/hosts
# docker network ls NETWORK ID NAME DRIVER SCOPE aaa59fabf719 bridge bridge local 1b89626fd45a host host local fe1dc2ce9a7c none null local
docker network create my_network
# docker network inspect my_network [ { "Name": "my_network", "Id": "421dae49712391e4f45c1397ee62281022eea83077f51696a2391a1ab36df53c", "Created": "2017-07-04T23:37:02.611184435+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "Containers": {}, "Options": {}, "Labels": {} } ]
二、建立容器並鏈接到網絡mysql
docker run -ti --name system1 --network=my_network centos /bin/bash docker run -ti --name system2 --network=my_network centos /bin/bash docker network inspect my_network #能夠查看新建容器的IP "Containers": { "612e416f671fd90d9a0b644dcfd2870b4b8c15e0651e6636dd062d6c33125c75": { "Name": "system2", "EndpointID": "1b8e7ffe5cbbdd246239ea8aedf0fc04ed8c16ab838551eae5e9d7e3af98b536", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "bca3b58af0a265399822f1d476744e627e2f629be5cc3e6c1084271600171457": { "Name": "system1", "EndpointID": "b25b67251cc93d5cbf3821dc2e33954ae8142aa8ab380ed59f8ce83ceacc6c11", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }
# ping 172.18.0.2 PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data. 64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.463 ms 64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.068 ms 64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.093 ms
# ping system1 PING system1 (172.18.0.2) 56(84) bytes of data. 64 bytes from system1.my_network (172.18.0.2): icmp_seq=1 ttl=64 time=0.719 ms 64 bytes from system1.my_network (172.18.0.2): icmp_seq=2 ttl=64 time=0.095 ms 64 bytes from system1.my_network (172.18.0.2): icmp_seq=3 ttl=64 time=0.077 ms
docker network disconnect my_network system1
docker network rm my_network
3、docker高級網絡設置
一、配置 DNS在docker run時使用如下參數:nginx
參數 | 說明 |
---|---|
-h HOSTNAME or --hostname=HOSTNAME | 設定容器的主機名,它會被寫到容器內的 /etc/hostname 和/etc/hosts。但它在容器外部看不到,既不會在 docker ps 中顯示,也不會在其餘的容器的/etc/hosts 看到。 |
--link=CONTAINER_NAME:ALIAS | 選項會在建立容器的時候,添加一個其餘容器的主機名到 /etc/hosts 文件中,讓新容器的進程可使用主機名 ALIAS 就能夠鏈接它。 |
--dns=IP_ADDRESS | 添加 DNS 服務器到容器的 /etc/resolv.conf 中,讓容器用這個服務器來解析全部不在 /etc/hosts 中的主機名。 |
--dns-search=DOMAIN | 設定容器的搜索域,當設定搜索域爲 .example.com 時,在搜索一個名爲 host 的主機時,DNS 不只搜索host,還會搜索 host.example.com。 注意:若是沒有上述最後 2 個選項,Docker 會默認用主機上的 /etc/resolv.conf 來配置容器。 |
二、容器訪問控制
容器訪問外部網絡
容器要想訪問外部網絡,須要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。web
sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
容器之間訪問
容器之間相互訪問,須要兩方面的支持。
容器的網絡拓撲是否已經互聯。默認狀況下,全部容器都會被鏈接到 docker0 網橋上。
本地系統的防火牆軟件 -- iptables 是否容許經過。
訪問全部端口
當啓動 Docker 服務時候,默認會添加一條轉發策略到 iptables 的 FORWARD 鏈上。策略爲經過(ACCEPT)仍是禁止(DROP)取決於配置 --icc=true(缺省值)仍是 --icc=false。固然,若是手動指定 --iptables=false 則不會添加 iptables 規則。
可見,默認狀況下,不一樣容器之間是容許網絡互通的。若是爲了安全考慮,能夠在docker服務修改/usr/lib/systemd/system/docker.service啓動時添加--icc=false。
訪問指定端口在經過 -icc=false 關閉網絡訪問後,能夠經過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口。
例如,在啓動 Docker 服務時,能夠同時使用 --icc=false --iptables=true 參數來關閉容許相互的網絡訪問,並讓 Docker 能夠修改系統中的 iptables 規則。
此時,系統中的 iptables 規則多是相似:sql
iptables -nL ... Chain FORWARD (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 0.0.0.0/0...
以後,啓動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。Docker 會在 iptable中爲 兩個容器分別添加一條 ACCEPT 規則,容許相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE 行)。當添加了 --link=CONTAINER_NAME:ALIAS 選項後,添加了 iptables 規則。docker
iptables -nL ... Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80 ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80 DROP all -- 0.0.0.0/0 0.0.0.0/0