Docker網絡模式
橋接網絡:你的網絡和宿主機的同等關係,連接了同一個路由器同一個交換機網段也是一樣的
nat:他把你宿主機的網絡做成了一個類似於路由器的設備,它實現了網絡地址轉換,宿主機能聯網,他就能聯網,但是他們的網段是不一樣的
僅主機:僅僅是讓你的宿主機和虛擬機進行連接
host模式
使用方法:docker run時使用--net=host指定
docker使用的網絡實際上和宿主機一樣,在容器內看到的網卡ip是宿主機ip
container模式
使用方法:--net=container:container_id/container_name
多個容器使用共同的網絡,看到的ip是一樣的
none模式
使用方法:--net=none指定
這種模式下,不會配置任何網絡,沒網卡,也不聯網
bridge模式
使用方法:--net=bridge指定默認模式,不用指定默認就是這種網絡模式。這種模式會爲每個容器分配一個獨立的Network Namespace。類似於vmware的nat網絡模式。同一個宿主機上的所有容器會在同一個網段下,相互之間是可以通信的。
Docker網絡管理-外部訪問容器
思路:首先使用centos鏡像新建一個容器,然後在該容器中安裝nginx服務,並啓動,再把該容器導成一個新的鏡像(centos_nginx),然後再使用新鏡像創建容器,並指定宿主機端口映射
創建新鏡像:docker run -itd -p 8888:80 centos_nginx bash //-p 可以指定端口映射,本例中將容器的80端口映射爲本地的8888端口
進入新鏡像:docker exec -it container_id bash
安裝nginx:yum install -y nginx
啓動nginx: systemctl start nginx
退出該容器:exit
測試: curl 127.0.0.1:8888
-p後面也支持IP:port:ip:port 的格式,比如
-p 127.0.0.1:8080:80
也可以不寫本地的端口,只寫ip,這樣會隨意分配一個端口
-p 127.0.0.1::80 //注意這裏是兩個冒號
另一臺機器訪問:docker租主機IP:8888也可以訪問了
解決啓動nginx時的報錯Operation not permitted
新建的容器,啓動nginx或者httpd服務的時候會報錯
[root@34b9c062b8d9 /]# systemctl start nginx
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to get D-Bus connection: Operation not permitted
這是因爲dbus-daemon沒有啓動,解決該問題可以這樣做
啓動容器時,要加上--privileged -e "container=docker" 參數,並且最後面的命令改爲/usr/sbin/init
格式:docker run -itd -p 8888:80 --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
或者加上:--privileged=true
docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init
[root@bogon ~]# docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init
20df5c59352256a8bae6d8e8315f65a1f06831a68ec4dc8fc51aa56d1d2bde60
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73bda065303e centos_nginx "/usr/sbin/init" 12 minutes ago Up 12 minutes 0.0.0.0:8888->80/tcp wizardly_taussig
df3b494539d4 300e315adb2f "bash" 31 minutes ago Up 31 minutes hopeful_haibt
f251f778055e registry "/entrypoint.sh /etc…" 57 minutes ago Up 57 minutes 0.0.0.0:5000->5000/tcp cranky_ramanujan
Docker網絡管理-配置橋接網絡
這種模式可以使你的docker容器和宿主機使用同一個交換機,他們在同一個網段下,這樣就可以直接跟外面的機器通信,也可以把這個docker看成是一個獨立的服務器一樣
爲了使本地網絡中的機器和Docker容器更方便的通信,我們經常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,我們只要將Docker容器和宿主機的網卡橋接起來,再給Docker容器配上IP就可以了。
首先進入到網卡配置目錄下:
cd /etc/sysconfig/network-scripts/
拷貝一個新的網卡出來
cp ifcfg-ens33 ifcfg-br0
更改br0配置:
vim ifcfg-br0
首先更改第一行TYPE=Bridge
再更改名字:NAME=br0;DEVICE=br0;UUID也註釋掉
更改ens33配置
vi ifcfg-ens33 //最後一行增加BRIDGE=br0,註釋掉:UUID,IPADDR,NETMASK,GATEWAY,DNS1
其實就是把ens33的ip配置到新的虛擬網卡br0上來,然後ens33在進行橋接
重啓網卡:systemctl restart network
配置成功以後br0網卡就會繼承ens33的ip,而ens33就沒有了
[root@localhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.18.141 netmask 255.255.255.0 broadcast 192.168.18.255
inet6 fe80::5b35:7d8a:d448:fcf1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b8:0f:33 txqueuelen 1000 (Ethernet)
RX packets 66 bytes 5379 (5.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73 bytes 8400 (8.2 KiB)
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:74ff:fe8a:e688 prefixlen 64 scopeid 0x20<link>
ether 02:42:74:8a:e6:88 txqueuelen 0 (Ethernet)
RX packets 7464 bytes 330335 (322.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12839 bytes 27117685 (25.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:b8:0f:33 txqueuelen 1000 (Ethernet)
RX packets 243167 bytes 341083270 (325.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 60420 bytes 5248917 (5.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
安裝pipwork
克隆:git clone https://github.com/jpetazzo/pipework
[root@localhost ~]# git clone https://github.com/jpetazzo/pipework
正克隆到 'pipework'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 518 (delta 2), reused 5 (delta 2), pack-reused 510
接收對象中: 100% (518/518), 182.72 KiB | 14.00 KiB/s, done.
處理 delta 中: 100% (272/272), done.
拷貝文件到可執行目錄下:
cp pipework/pipework /usr/local/bin/
開啓一個容器:(--net=none參數意思是不設置網絡)
docker run -itd --net=none centos_with_nettool bash
[root@localhost pipework]# docker run -itd --net=none 772d8347a1d7 bash
62cb0a73d01b26b4b3f7972f45806b8960c0762eacd486ff5e4f578c716051b0
進入到容器裏,現在是沒有網卡ip的
[root@localhost pipework]# docker exec -it 62cb0a bash
[root@62cb0a73d01b /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@62cb0a73d01b /]#
退出並設置IP:
pipework br0 62cb0a73d01b 192.168.18.142/[email protected] #192.168.18.142爲自定義容器的ip,@後面的ip爲網關ip
[root@localhost pipework]# pipework br0 62cb0a73d01b 192.168.18.142/[email protected]
在進入容器就有IP了,而且還能ping外網,其他機器也可以ping它,在裏邊安裝一些服務(nginx,httpd)就可以直接ip端口訪問了
[root@localhost pipework]# docker exec -it 62cb0a bash
[root@62cb0a73d01b /]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.18.142 netmask 255.255.255.0 broadcast 192.168.18.255
ether 2a:d0:c4:88:ba:63 txqueuelen 1000 (Ethernet)
RX packets 12 bytes 896 (896.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1 bytes 42 (42.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在容器ping外網
[root@62cb0a73d01b /]# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=128 time=47.4 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=128 time=44.6 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=128 time=46.10 ms
其他機器ping該容器
[root@localhost ~]# ping 192.168.18.141
PING 192.168.18.141 (192.168.18.141) 56(84) bytes of data.
64 bytes from 192.168.18.141: icmp_seq=42 ttl=64 time=0.486 ms
64 bytes from 192.168.18.141: icmp_seq=43 ttl=64 time=0.313 ms
64 bytes from 192.168.18.141: icmp_seq=44 ttl=64 time=0.296 ms
64 bytes from 192.168.18.141: icmp_seq=45 ttl=64 time=0.372 ms
64 bytes from 192.168.18.141: icmp_seq=46 ttl=64 time=0.220 ms
64 bytes from 192.168.18.141: icmp_seq=47 ttl=64 time=0.297 ms