您好,登錄后才能下訂單哦!
一、創建容器時候的選項
--network xx:指定容器使用的網絡類型
--hostname xx:指定容器使用的主機名
--dns x.x.x.x:指定容器使用的DNS地址
--dns-search xxx:指定搜索域,默認搜索域是宿主機
--add-host 域名:地址 在hosts文件添加記錄
二、創建封閉式網絡容器
創建容器的時候,默認用none網絡
可以再創建容器的時候,用network選項來指定容器的類型是 none
創建容器
[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
此時這個容器是沒有地址的
三、暴露容器地址到網絡
安裝容器的目的是讓用戶訪問容器的服務
而容器通常是以nat方式工作,也就是隱藏在docker0網橋后,用戶無法訪問
因此需要將容器暴露在網絡中才可以
1、將容器端口指定暴露到宿主機的動態端口
案例:啟動一個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?"<h2>test?page</h2>">>/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
在其他主機上訪問這個主機上的容器
當這個容器被刪除了,這個端口映射規則自動刪除
2、將容器端口指定暴露到宿主機的指定端口
案例:創建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
3、將容器的指定端口暴漏到宿主機指定IP的動態端口
方法1中的效果是將容器的端口映射到宿主機的隨機端口,這個端口會綁定在宿主機的所有IP上面。
-p 宿主機ip::容器端口
4、將容器的指定端口暴漏到宿主機指定IP的指定端口
方法3中的效果是將容器的端口映射到宿主機的指定端口,這個端口會綁定在宿主機的所有IP上面。
-p 宿主機ip:宿主機端口:容器端口
?【如果需要暴漏出多個端口,那么就可以使用多次-p選項】
四、創建聯盟式網絡容器
聯盟式容器,其實就是讓多個容器共享網絡等三個名稱空間
1、將容加入其它容器的名稱空間
先創建容器
[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來訪問
但是兩個容器的文件系統不是共享的,比如在一個主機中創建的文件或者目錄,在另一個主機中是訪問不到的
2、將容器加入到宿主機的名稱空間
[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 /?#
五、修改的默認網絡和網橋
1、修改Docker0
docker0網橋的默認地址是172.17的
修改這個需要修改配置文件:/etc/docker/daemon.json
??
bip是知道docker0的ip地址
2、創建自定義網橋
創建一個網橋,名稱為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規則。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。