讓外網可否訪問容器的端口映射方法:html
1.手動指定端口映射關係
兩臺虛擬機,第一臺映射端口(第二臺訪問宿主機端口,就是訪問容器端口 curl 192.168.1.1:90 。)
docker run -itd --name web1 -p 90:80 nginx:latest
2>從宿主機隨機映射端口到容器,
docker run -itd --name web2 -p 80 nginx:latest
3》從宿主機隨機映射端口到容器,容器內全部暴漏端口,都會一一映射。
docker run -itd --name web4 -P nginx:latest linux
Join容器:container(共享網絡協議棧)
容器和容器之間。
docker run -itd --name web5 busybox
docker run -itd --name web6 --network container:web5 busybox:latestnginx
docker exec -it web6 /bin/sh
echo 6666666 > /tmp/index.html
httpd -h /tmp/web
docker exec -it web5 /bin/sh
get -O - -q 127.0.0.1
6666666docker
這時會發現,兩個容器的ip地址同樣。bootstrap
PS:這種方法的使用場景:
因爲這種網絡的特殊性,通常在運行同一服務,而且合格服務須要作監控,以及日誌收集,或者網絡監控的時候,能夠選擇這種網絡。vim
Docker的跨主機網絡解決方案。
瀏覽器
overlay 的解決方案。
實驗:
做業:
1)實現容器的跨主機通訊,使用Overlay網絡的方式實現。
2)準備3臺dockerHost,基於上述建立的Overlay網絡建立容器服務。 docker01上基於busybox鏡像運行服務,名稱爲:本身名稱+t1. docker02上基於busybox鏡像運行服務,名稱爲:本身名稱+t2. docker03上基於busybox鏡像運行服務,名稱爲:本身名稱+t3.
3)要求容器使用指定網段,10.10.10.0/16網段。 IP地址分別爲:
t1: 10.10.10.6 t2: 10.10.10.8 t3: 10.10.10.10
4) 要求3個容器能夠分別實現IP和容器名稱的通訊。
myprogrium-consul.tar
實驗環境consul :是數據中心
docker01 docker02 docker03
192.168.1.1 ,192.168.1.20 ,192.168.1.30安全暫時不考慮防火牆,和selinux安全問題。
將三臺dockerhost防火牆和selinux所有關閉,而且分別更改主機名爲,docker01 docker02 docker03網絡更改主機名。
hostnamectl set-hostname docker01
su -
關閉防火牆。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
在docker上操作
導入
docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
PS:容器生產,以後,咱們能夠經過瀏覽器訪問consul服務,驗證consul服務是否正常,訪問dockerHost加映射端口。
若是出現這個,是由於剛更改防火牆需重啓docker
systemctl restart docker
docker start consul
訪問consul
http://192.168.1.1:8500/ui/#/dc1/services
修改docker02和docker03上的docker配置文件,
vim /usr/lib/systemd/system/docker.service (加)
/var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store
=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
保存退出
重啓
systemctl daemon-reload
systemctl restart docker (重啓docker)
返回瀏覽器192.168.1.1的consul界面
在,docker02上建立一個自定義網絡,
docker network create -d overlay --subnet 10.10.10.0/16 ov_net1
docker network create -d overlay ov_net1
docker network ls(2,3臺都會有)
在docker02上建立的網絡,咱們能夠看到它的scope定義的是global(全局),意味着加入到consul這個服務的docker服務,均可以看到咱們自定義的網絡,同理若是是用此網絡建立的容器,會有兩張網卡。
默認這張網卡,的網段是10.0.0.0網段,若是想要docker01也可能看到這個網絡,那麼也只在docker01的docker配置文件添加相應內容便可
注意global;表示全局的意思同理,由於是自定義網絡,符合自定義網絡的特性,能夠直接經過docker容器的名稱相互通訊,固然也能夠在自定義網絡的時候,指定它的網段,那麼使用此網絡的容器也能夠指定IP地址。
在docker01上也添加
並重啓
systemctl stop docker.service
systemctl start docker.service
在docker01 -----docker03上建立t1,t2,t3
本身的名稱+t1,t2,t3
指定IP地址
docker run -itd --name lbst1 --network ov_net1 --ip 10.10.10.6 busybox:latest
docker run -itd --name lbst1 --network ov_net1 --ip 10.10.10.8 busybox:latest
docker run -itd --name lbst1 --network ov_net1 --ip 10.10.10.10 busybox:latest
不指定IP地址
docker run -itd --name t1 --network ov_net1 busybox:latest
docker run -itd --name t2 --network ov_net1 busybox:latest
docker run -itd --name t3 --network ov_net1 busybox:latest進入t1 ping docke02到03
docker exec -it t1 /bin/sh
進入t2ping docker01與 03
進入t3ping docker01與 02
另外一種跨主機網絡MacVlan
Docker 跨主機網絡方案之MacVlan
實驗環境:vlan(局域網)
Docker01 docker02
192.168.1.1 192.168.1.20
關閉防火牆和禁用selinux,更改主機名。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
關閉防火牆與selinux,須要重啓一下docker
systemctl daemon-reload
systemctl restart docker
Macvlan的單網絡通訊
1》打開網卡的混雜模式(須要在docker02到docker01都須要開啓)
ip link show ens33(查看網卡)
開啓混雜模式
ip link set ens33 promisc on
2》在docker01上建立macvlan網絡
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1PS: -o parent=綁定在那張網卡之上。
3》基於建立的macvlan網絡運行一個容器
docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox
4>在dcker02上建立的macvlan網絡,注意與docker1上的macvlan網絡一摸同樣
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
5》在docker2上,基於建立的macvlan網絡運行一個容器,驗證與docker01容器的通訊
docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
Macvlan的多網絡通訊(真實接口不夠用的問題)
驗證內核模塊8021q封裝
Macvlan須要解決的問題,基於真實的ens33網卡,生產新的虛擬網卡
1》Docker01到docker02驗證內核模塊
modinfo 8021q若是內核模塊沒有開啓,加載內核模塊
modprobe 8021q
> 2》基於ens33建立虛擬網卡
cd /etc/sysconfig/network-scripts/
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改ens33網卡的配置文件
手動添加虛擬網卡的配置文件
cp -p ifcfg-ens33 ifcfg-ens33.10
PS: -p保留源文件或目錄的屬性
修改ens33.10
建立第二個虛擬網卡配置文件
cp -p ifcfg-ens33.10 ifcfg-ens33.20
vim ifcfg-ens33.20
3》Docker01上的操作啓用建立的虛擬網卡
ifup ifcfg-ens33.10
ifup ifcfg-ens33.20
4》基於虛擬網卡,建立macvlan的網絡
docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
scp -p ifcfg-ens33.10 ifcfg-ens33.20 192.168.1.20:/etc/sysconfig/network-scripts/
建立容器(docker01到docker02)
docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.1:5000/test:latestdocker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.1:5000/test:latest
5》基於上述建立的macvlan網絡,運行對應的容器,不過這裏須要注意,運行的容器與網絡對應的網段相符合,還需注意,ip地址的惟一性。
6》在docker02上進行操作,建立網絡機容器
這裏只須要,咱們在這裏的操作跟docker01上的一摸同樣,操作順序大體爲:
1.驗證8021q內核封裝
2.基於ens33網卡建立新的虛擬網卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必須是在同一網段,且ip不能衝突)
3.基於此網絡運行容器,(注意和docker01上的容器,都是基於剛剛建立的macvlan網絡,但ip地址不能衝突)
7》驗證:
注意:Vmware的網絡必須是橋接(Bridge)
在docker01上進入容器bbox10和docker02上的bbox1進行通訊
在docker01上進入容器bbox20和docker02上的bbox21進行通訊
我的總結:macVlan網絡的實現原理及步驟原理:1.基於宿主機的網卡的修改配置多個虛擬網卡。2.基於虛擬網卡建立macvlan網絡3.基於虛擬網絡建立要求的容器步驟:1.驗證8021q內核封裝2.基於ens33網卡建立新的虛擬網卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必須是在同一網段,且ip不能衝突)3.基於此網絡運行容器,(注意和docker01上的容器,都是基於剛剛建立的macvlan網絡,但ip地址不能衝突)