您好,登錄后才能下訂單哦!
參考博客:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=11589&highlight=docker
一 四種網(wǎng)絡(luò)模式
1.host模式 使用docker run時(shí)使用--net=host指定docker使用的網(wǎng)絡(luò)實(shí)際上和宿主機(jī)一樣在容器內(nèi)看到的網(wǎng)卡ip是宿主機(jī)上的ip局限性例如容器開(kāi)啟80端口宿主機(jī)也開(kāi)啟80端口就會(huì)產(chǎn)生沖突。
[root@localhost ~]# docker run -it --rm --net=host centos_with_net_wget:daixuanlinux bash [root@localhost /]# ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.42.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::a091:9eff:fe00:8ef8 prefixlen 64 scopeid 0x20<link> ether 02:06:cb:61:4f:d6 txqueuelen 0 (Ethernet) RX packets 3341 bytes 213676 (208.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7699 bytes 11252108 (10.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 112.65.140.132 netmask 255.255.255.248 broadcast 112.65.140.135
2.container模式 使用--net=container:container_id/container_name多個(gè)容器使用共同的網(wǎng)絡(luò)看到的ip是一樣的與510b828f4ca9的IP都是172.17.42.1
[root@localhost ~]# docker run -it --rm --net=container:510b828f4ca9 centos_with_net_wget:daixuanlinux bash [root@localhost /]# ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.42.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::a091:9eff:fe00:8ef8 prefixlen 64 scopeid 0x20<link> ether 00:00:00:00:00:00 txqueuelen 0 (Ethernet) RX packets 3341 bytes 213676 (208.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7699 bytes 11252108 (10.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 112.65.140.132 netmask 255.255.255.248 broadcast 112.65.140.135
3. none模式使用--net=none指定這種模式下不會(huì)配置任何網(wǎng)絡(luò)
[root@localhost ~]# docker run -it --rm --net=none centos_with_net_wget:daixuanlinux bash [root@6db3a6e51687 /]# ifconfig lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (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@6db3a6e51687 /]# ping www.baidu.com ping: unknown host www.baidu.com
4. bridge模式默認(rèn)模式類似vmware的nat模式,使用--net=bridge指定,默認(rèn)模式不用指定,就是這種網(wǎng)絡(luò)模式。這種模式會(huì)為每個(gè)容器分配一個(gè)獨(dú)立的Network Namespace。同一個(gè)宿主機(jī)上的所有容器會(huì)在同一個(gè)網(wǎng)段下相互之間是可以通信的。
[root@localhost ~]# docker run -it --rm centos_with_net_wget:daixuanlinux bash [root@663660abecbb /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.28 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:1c prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:1c txqueuelen 0 (Ethernet) RX packets 3 bytes 238 (238.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 328 (328.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 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (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@663660abecbb /]# ping www.baidu.com PING www.a.shifen.com (14.215.177.37) 56(84) bytes of data. 64 bytes from 14.215.177.37: icmp_seq=1 ttl=52 time=29.6 ms ^C64 bytes from 14.215.177.37: icmp_seq=2 ttl=52 time=29.9 ms --- www.a.shifen.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 29.616/29.792/29.969/0.246 ms [root@663660abecbb /]# exit exit
二 docker 網(wǎng)橋
配置橋接網(wǎng)絡(luò)centos7
為了使本地網(wǎng)絡(luò)中的機(jī)器和Docker容器更方便的通信我們經(jīng)常會(huì)有將Docker容器配置到和主機(jī)同一網(wǎng)段的需求。這個(gè)需求其實(shí)很容易實(shí)現(xiàn)我們只要將Docker容器和宿主機(jī)的網(wǎng)卡橋接起來(lái)再給Docker容器配上IP就可以了。
安裝pipworkgit clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
開(kāi)啟一個(gè)容器 docker run -itd --net=none --name aming123 centos /bin/bash
pipework br0 aming123 172.7.15.201/24@172.7.15.107 #201為容器的ip@后面的ip為宿主機(jī)ip
brctl addif br0 eth0 #eth0為宿主機(jī)網(wǎng)卡這一步為把br0和eth0橋接起來(lái)
ip addr add 172.7.15.107/24 br0 #把107的ip綁定在br0上
docker exec -it aming123 /bin/bash #進(jìn)去后ifconfig查看就可以看到新添加的ip
centos6:
cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0
vi ifcfg-eth0 //增加BRIDGE=br0刪除IPADDR,NETMASK,GATEWAY,DNS1
vi ifcfg-br0//修改DEVICE為br0,Type為Bridge,把eth0的網(wǎng)絡(luò)設(shè)置設(shè)置到這里來(lái)
service network restart
安裝pipwork: git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
開(kāi)啟一個(gè)容器: docker run -itd --net=none --name aming123 centos /bin/bash
rpm -Uvh rpm -Uvh https://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm #不安會(huì)報(bào)錯(cuò)Object "netns" is unknown, try "ip help"
pipework br0 aming123 172.7.15.201/24
docker exec -it aming123 /bin/bash #進(jìn)去后ifconfig查看就可以看到新添加的ip
bridge 模式是 Docker 默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配 Network Namespace、設(shè)置 IP 等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。當(dāng) Docker server 啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為 docker0 的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的 Docker 容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。接下來(lái)就要為容器分配 IP 了,Docker 會(huì)從 RFC1918 所定義的私有 IP 網(wǎng)段中,選擇一個(gè)和宿主機(jī)不同的IP地址和子網(wǎng)分配給 docker0,連接到 docker0 的容器就從這個(gè)子網(wǎng)中選擇一個(gè)未占用的 IP 使用。如一般 Docker 會(huì)使用 172.17.0.0/16 這個(gè)網(wǎng)段,并將 172.17.42.1/16 分配給 docker0 網(wǎng)橋(在主機(jī)上使用 ifconfig 命令是可以看到 docker0 的,可以認(rèn)為它是網(wǎng)橋的管理接口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)
2.1 列出當(dāng)前主機(jī)網(wǎng)橋
# brctl show
或者
# brctl show docker0
brctl 工具依賴bridge-utils 包
查看當(dāng)前 docker0 ip
# ifconfig docker0
或者
# ip addr show docker0
自定義 docker0 網(wǎng)橋的網(wǎng)段
默認(rèn)情況下 docker0 會(huì)分配172.1.42 或者192.168.42 這個(gè)網(wǎng)段。
我們也可以手動(dòng)更改這個(gè)網(wǎng)段為 192.168.10.0/24。
要注意順序:
# /etc/init.d/docker stop #停掉docker服務(wù)
# ip link set dev docker0 down #停掉網(wǎng)橋docker0
# ip addr add 192.168.10.1/24 dev docker0 #給docker0添加地址
# ip addr del 192.168.42.1/24 dev docker0 #刪除docker0原有的地址
# ip link set dev docker0 up #啟動(dòng)網(wǎng)橋docker0
# /etc/init.d/docker start #啟動(dòng)服務(wù)
自定義網(wǎng)橋
Docker完成以上網(wǎng)絡(luò)配置的過(guò)程大致是這樣的:
1. 在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來(lái)。因此,veth設(shè)備常用來(lái)連接兩個(gè)網(wǎng)絡(luò)設(shè)備。
2. Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0。另一端放在主機(jī)中,以veth75f9這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中,可以通過(guò)brctl show命令查看。
3. 從 docker0 子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。
Docker 會(huì)嘗試尋找沒(méi)有被主機(jī)使用的 ip 段,盡管它適用于大多數(shù)情況下,但是它不是萬(wàn)能的,有時(shí)候我們還是需要對(duì) ip 進(jìn)一步規(guī)劃。在啟動(dòng) Docker 服務(wù)的時(shí)候,使用 -b BRIDGE 或 --bridge=BRIDGE 來(lái)指定使用的網(wǎng)橋,需要安裝 bridge-utils軟件包。
這里我們新建一個(gè)網(wǎng)橋 br0 作為 docker 的默認(rèn)網(wǎng)橋 基本步驟如下:
1. 停止服務(wù)刪除舊網(wǎng)橋
2. 創(chuàng)建自定義網(wǎng)橋
3. 確認(rèn)新網(wǎng)橋并啟動(dòng)
4. 配置 docker 默認(rèn)網(wǎng)橋
停止服務(wù)刪除舊網(wǎng)橋
# service docker stop
# ip link set dev docker0 down
# brctl delbr docker0
創(chuàng)建新網(wǎng)橋br0
# brctl addbr br0
# ip addr add 192.168.100.1/24 dev br0
查看確認(rèn)新網(wǎng)橋并啟動(dòng)
# ip addr show br0 或者 brctl show br0
# ip link set dev br0 up
配置 docker 服務(wù),默認(rèn)連接到 網(wǎng)橋br0 上 .并啟動(dòng)docker
# echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker
# service docker start
啟動(dòng) Docker 服務(wù)。 新建一個(gè)容器,可以看到它已經(jīng)橋接到了 br0 上。
可以繼續(xù)用 brctl show 命令查看橋接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令來(lái)查看 IP 地址配置和路由信息。
三 外部網(wǎng)絡(luò)訪問(wèn)容器
1 使用centos鏡像新建一個(gè)容器,然后在該容器中安裝httpd服務(wù)并啟動(dòng)
[root@localhost ~]# docker run -it centos_with_net_wget:daixuanlinux bash [root@0d76c137b3cc /]# yum install -y httpd [root@0d76c137b3cc /]# /usr/sbin/httpd //使用絕對(duì)路徑啟動(dòng)httpd服務(wù) AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.29. Set the 'ServerName' direc tive globally to suppress this message [root@0d76c137b3cc /]# ps aux | grep httpd //httpd服務(wù)已經(jīng)啟動(dòng) root 53 0.0 0.6 221852 3456 ? Ss 05:45 0:00 /usr/sbin/httpd apache 54 0.0 0.5 221852 2600 ? S 05:45 0:00 /usr/sbin/httpd apache 55 0.0 0.5 221852 2600 ? S 05:45 0:00 /usr/sbin/httpd apache 56 0.0 0.5 221852 2600 ? S 05:45 0:00 /usr/sbin/httpd apache 57 0.0 0.5 221852 2600 ? S 05:45 0:00 /usr/sbin/httpd apache 58 0.0 0.5 221852 2600 ? S 05:45 0:00 /usr/sbin/httpd root 60 0.0 0.1 8984 768 ? S+ 05:45 0:00 grep --color=auto httpd [root@0d76c137b3cc /]# netstat -lnp | grep 80 //監(jiān)聽(tīng)了80端口 tcp6 0 0 :::80 :::* LISTEN 53/httpd [root@0d76c137b3cc /]# exit exit [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0d76c137b3cc centos_with_net_wget:daixuanlinux "bash" 14 minutes ago Exited (130) About a minute ago compassionate_goodall
2 把該容器導(dǎo)成一個(gè)新的鏡像centos_with_httpd
[root@localhost ~]# docker commit -m "centos_with_httpd" -a "daixuan" 0d76c137b3cc centos_with_httpd 9fa4d394e3b6855a9c395d8313c43945fb0c0b8ce8ac99b4c5c20e831df672c4 [root@localhost ~]# docker p_w_picpaths REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos_with_httpd latest 9fa4d394e3b6 52 seconds ago 337.8 MB
3 再使用新鏡像創(chuàng)建容器并指定端口映射,網(wǎng)絡(luò)的映射是在啟動(dòng)容器的過(guò)程中實(shí)現(xiàn)的
docker run -itd -p 5123:80 centos_with_httpd:latest bash //-p 可以指定端口映射本例中將容器的80端口映射為本地的5123端口
docker exec -it container_id bash
啟動(dòng)httpd httpd -k start 或者使用絕對(duì)路徑啟動(dòng)/usr/sbin/httpd
編輯1.html vi /var/www/html/1.html 隨便寫點(diǎn)東西例如daixuanlinux.com
退出該容器exit
測(cè)試 curl 127.0.0.1:5123/1.html
[root@localhost ~]# docker run -itd -p 5123:80 centos_with_httpd:latest bash 754edd8655b86715e2f7b75db4f8503370960974b415ae6871f69f8c5bc2b12f [root@localhost ~]# docker exec -it 754edd865 bash [root@754edd8655b8 /]# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path [root@754edd8655b8 /]# /usr/sbin/httpd AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.30. Set the 'ServerName' directive globally to suppress this message [root@754edd8655b8 /]# ps aux | grep httpd root 29 0.0 0.6 221852 3436 ? Ss 06:00 0:00 /usr/sbin/httpd apache 30 0.0 0.5 221852 2600 ? S 06:00 0:00 /usr/sbin/httpd apache 31 0.0 0.5 221852 2600 ? S 06:00 0:00 /usr/sbin/httpd apache 32 0.0 0.5 221852 2600 ? S 06:00 0:00 /usr/sbin/httpd apache 33 0.0 0.5 221852 2600 ? S 06:00 0:00 /usr/sbin/httpd apache 34 0.0 0.5 221852 2600 ? S 06:00 0:00 /usr/sbin/httpd root 36 0.0 0.1 8984 772 ? S+ 06:00 0:00 grep --color=auto httpd [root@754edd8655b8 /]# vi /var/www/html/1.html 添加:daixuanlinux.com [root@754edd8655b8 /]# curl localhost/1.html daixuanlinux.com [root@754edd8655b8 /]# ^C [root@754edd8655b8 /]# exit exit [root@localhost ~]# curl 112.65.140.132:5123/1.html //外部訪問(wèn)5123轉(zhuǎn)到訪問(wèn)容器的80端口 daixuanlinux.com [root@localhost ~]# docker ps //可以看到轉(zhuǎn)換規(guī)則:5123->80 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 754edd8655b8 centos_with_httpd:latest "bash" 9 minutes ago Up 9 minutes 0.0.0.0:5123->80/tcp mad_goodall
四 容器互聯(lián)
下載一個(gè)mysql鏡像
docker pull mysql
新建一個(gè)容器命名為dbserver
docker run -it -d -p 13306:3306 --name dbserver mysql bash
在新建一個(gè)web容器并和db互聯(lián)
docker run -it -d -p 12308:80 --name web --link dbserver:db centos_with_httpd bash
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。