3.docker網絡模式,橋接模式

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章