1、建立容器時候的選項
html
--network xx:指定容器使用的網絡類型linux
--hostname xx:指定容器使用的主機名nginx
--dns x.x.x.x:指定容器使用的DNS地址docker
--dns-search xxx:指定搜索域,默認搜索域是宿主機apache
--add-host 域名:地址 在hosts文件添加記錄
json
2、建立封閉式網絡容器bash
建立容器的時候,默認用none網絡網絡
能夠再建立容器的時候,用network選項來指定容器的類型是 nonecurl
建立容器tcp
[root@host1 ~]# docker run --name t1 -it --rm \ > --network none --hostname t1 --dns 114.114.114.114 \ > --dns-search linux.io \ > --add-host www.baidu.com:1.2.3.4 > busybox
此時這個容器是沒有地址的
3、暴露容器地址到網絡
安裝容器的目的是讓用戶訪問容器的服務
而容器一般是以nat方式工做,也就是隱藏在docker0網橋後,用戶沒法訪問
所以須要將容器暴露在網絡中才能夠
一、將容器端口指定暴露到宿主機的動態端口
案例:啓動一個apache,並將其80端口暴露出來
[root@host1 ~]# docker run --name httpd1 -it -p 80 --rm busybox WARNING: IPv4 forwarding is disabled. Networking will not work. / # / # mkdir /html / # echo "<h1>test page</h1>">>/html/index.html / # / # httpd -h /html/ / # / # netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 :::80 :::* LISTEN
此時,就能夠在宿主機訪問了
[root@host1 ~]# curl 172.17.0.2 test page
在其餘主機上想訪問這個nginx的頁面,須要宿主機上的個動態端口
將docker的端口暴漏到外面,須要iptables規則來實現的,因此查看nat表規則以下
[root@host1 ~]# iptables -L -n -t nat ... ... ... Chain DOCKER (2 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:32770 to:172.17.0.2:80
docker命令能夠查看端口映射關係
[root@host1 ~]# docker port httpd1 80/tcp -> 0.0.0.0:32770
在其餘主機上訪問這個主機上的容器
當這個容器被刪除了,這個端口映射規則自動刪除
二、將容器端口指定暴露到宿主機的指定端口
案例:建立apache容器,將80端口映射到宿主機的8081端口
[root@host1 ~]# docker run --name httpd1 -it -p 80:8081 --rm busybox / #
[root@host1 ~]# docker port httpd1 8081/tcp -> 0.0.0.0:80
三、將容器的指定端口暴漏到宿主機指定IP的動態端口
方法1中的效果是將容器的端口映射到宿主機的隨機端口,這個端口會綁定在宿主機的全部IP上面。
-p 宿主機ip::容器端口
四、將容器的指定端口暴漏到宿主機指定IP的指定端口
方法3中的效果是將容器的端口映射到宿主機的指定端口,這個端口會綁定在宿主機的全部IP上面。
-p 宿主機ip:宿主機端口:容器端口
【若是須要暴漏出多個端口,那麼就能夠使用屢次-p選項】
4、建立聯盟式網絡容器
聯盟式容器,其實就是讓多個容器共享網絡等三個名稱空間
一、將容加入其它容器的名稱空間
先建立容器
[root@host1 ~]# docker run --name httpd1 -it --rm busybox / # / # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # / # hostname 2ce8cf2a2f28 / # / # mkdir /html / # echo "test page">/html/index.html / # httpd -h /html/ / # / # wget -O - -q 127.0.0.1 test page / #
再建立一個容器,並加入上個容器的名稱空間中
[root@host1 ~]# docker run --name httpd2 --network container:httpd1 --rm -it busybox / # / # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # / # hostname 2ce8cf2a2f28 / # / # wget -O - -q 127.0.0.1 test page / #
兩個容器的主機名、地址、IPC都是相同的
在一個容器裏啓動進程,在另外一個容器裏是能夠用127.0.0.1來訪問
可是兩個容器的文件系統不是共享的,好比在一個主機中建立的文件或者目錄,在另外一個主機中是訪問不到的
二、將容器加入到宿主機的名稱空間
[root@host1 ~]# docker run --name httpd1 -it --rm --network host busybox / # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:3f:bf:cf brd ff:ff:ff:ff:ff:ff inet 192.168.114.132/24 brd 192.168.114.255 scope global dynamic ens33 valid_lft 1653sec preferred_lft 1653sec inet6 fe80::b487:3618:3453:eabe/64 scope link valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:3f:bf:d9 brd ff:ff:ff:ff:ff:ff inet 192.168.64.130/24 brd 192.168.64.255 scope global dynamic ens37 valid_lft 1648sec preferred_lft 1648sec inet 172.16.100.5/24 brd 172.16.100.255 scope global ens37 valid_lft forever preferred_lft forever inet6 fe80::e81:e5e0:505:f39b/64 scope link valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue link/ether 02:42:37:b9:09:55 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:37ff:feb9:955/64 scope link valid_lft forever preferred_lft forever / # / # / # hostname host1 / #
五、修改的默認網絡和網橋
一、修改Docker0
docker0網橋的默認地址是172.17的
修改這個須要修改配置文件:/etc/docker/daemon.json
bip是知道docker0的ip地址
二、建立自定義網橋
建立一個網橋,名稱爲mybr0
[root@host1 ~]# docker network create \ > --subnet "30.0.0.0/8" --gateway "30.0.0.1" \ > mybr0
[root@host1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 5e905c47ac51 bridge bridge local 386d8dc4beb8 host host local 256a8b6832cb mybr0 bridge local eb7b7cf29f29 none null local
mybr0是網絡名稱,不是網絡接口名稱
[root@host1 ~]# ip addr ... ... ... 15: br-256a8b6832cb: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c9:f6:5d:cd brd ff:ff:ff:ff:ff:ff inet 30.0.0.1/8 brd 30.255.255.255 scope global br-256a8b6832cb valid_lft forever preferred_lft forever
建立容器使用這個網橋設備
[root@host1 ~]# docker run --name httpd1 -it --rm --network mybr0 busybox / # / # / # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:1e:00:00:02 brd ff:ff:ff:ff:ff:ff inet 30.0.0.2/8 brd 30.255.255.255 scope global eth0 valid_lft forever preferred_lft forever / #
擴展:在一個主機上作了兩個網橋(其實就至關於兩個虛擬交換機),而後每一個交換機上安裝一個容器,這兩個容器不在同一個網段
想實現兩個容器通訊,其實只須要在宿主機上啓動路由轉發功能就能夠了,緣由 有兩個
容器的網關指向了虛擬交換機地址
虛擬交換機自己就在宿主機上
有一點須要注意,默認會在防火牆上添加一些規則阻止這種狀況下的容器之間的通訊,因此,要想實現容器之間的通訊,須要去修改itpables規則。