天天看點

實作docker之跨主機container通信的方法

一、實驗環境準備

準備好兩台主機作為主控端,主機應設靜态ip,且在同一網段并能聯網。

主控端資訊:

Host1-ip:192.168.135.77(網卡裝置為ens33,作為私有倉庫服務端)

Host2-ip:192.168.135.75(網卡裝置為ens33,作為私有倉庫用戶端)

gateway:192.168.128.1

netmask:255.255.248.0

二、安裝docker與搭建本地私有鏡像倉庫

1、關閉防火牆和Selinux

vi /etc/selinux/config 将enforceing改為disabled

chkconfig firewall off      關閉防火牆

reboot 重新開機系統使之生效

步驟1的主要作用是便于安裝docker和其他系統設定

2、安裝docker

yum install docker

service docker restart       重新開機docker服務

3、搭建docker本地私有庫

docker pull registry   拉取倉庫鏡像

docker run –d –p5000:5000 –v /opt/data/registry:/tmp/registry registry 

這裡要注意的是,docker的本地私有倉庫鏡像預設放在容器内的/tmp/registry,要想儲存該倉庫内的鏡像,必須将本地的某個檔案夾挂載在該目錄下。

docker runregistry_iamge_id /bin/sh          啟動該倉庫鏡像

啟動該倉庫鏡像後才能在本地pull和push鏡像

push鏡像時可能會失敗,可執行如下操作解決:在”/etc/docker/“目錄下,編輯”daemon.json“檔案。

在檔案中寫入{ "insecure-registries":["192.168.135.77:5000"]}

注意:私有倉庫的服務端和用戶端都要進行這一操作。

三、制作自己需要的基礎鏡像

大多數情況下,可以去官方倉庫拉取基礎鏡像。

docker  pull linux_image

也可以自己制作基礎鏡像

1、制作docker的基礎的Linux系統鏡像

運作下面指令

tar-cvpf /tmp/system.tar --directory=/ --exclude=proc --exclude=sys --exclude=dev--exclude=run --exclude=boot .(“不要忽略結尾處的”.””)

此指令是,将主控端的根目錄下大部分檔案打成tar包并存放在目前目錄,也可以設定其他目錄替換“.”。

将tar檔案導入到docker

dockerimport system.tar centos:7 system.tar為tar包名,centos:7為導入docker後的鏡像名。

2、啟動該鏡像制作容器

通過Dockerfile的方式啟動鏡像,制作容器,此為其中一種方式。

dockerbuild –t=’centos’ .

這一操作可以啟動定制的容器,且Dockerfile與其他需要配合的軟體需處于目前目錄。(注意:不要落下最後的“.”,它表示dockerfile所處位置)

在dockerfile内,可以配置容器的ssh服務,以及安裝其他軟體和配置其運作環境。

另一種方式為直接啟動建立的docker基礎系統鏡像

dockerrun -it centos:7 /bin/bash

可以選擇重命名容器名

dockerrename old容器名  new容器名

登入第一個方法建立的容器

dockerexec –it 容器id/bin/bash

可以選擇對容器進行操作,然後将容器狀态制作成新的image。

docker  commit container_id new_image_name

四、push剛建好的新鏡像至本地私有倉庫

在push鏡像之前需要對目标鏡像tag。

docker tag des_image localhost_ip:5000/des_image

然後push鏡像

docker push local_ip:5000/des_image

檢視上傳的image

curl-XGET 192.168.135.77:5000/v2/_catalog

從私有倉庫pull鏡像

dockerpull 192.168.135.77:5000/centos:tag_name

五、安裝pipework并建立網橋

1、安裝各類工具

安裝git

yum install git

安裝pipework

git clone https://github.com/jpetazzo/pipework

使pipework指令生效

cp ~/pipework/pipework /usr/local/bin/

安裝相應依賴軟體bridge-utils(網橋)

yum install iputils-arping bridge-utils –y

2、更改主控端網絡配置檔案

網絡配置如下:

cd /etc/sysconfig/network-scripts/ifcfg-ens33

cp ifcfg-ens33 ifcfg-br0

vi  ifcfg-ens33删除ip,netmask,新增BRIDGE=br0。

vi  ifcfg-br0 設TYPE=Bridge,DEVICE=br0。

Service network restart

Service docker restart

六、開啟容器并為容器配置ip

開啟一個image并指定網絡模式為none(這樣,建立的容器就不會通過docker0自動配置設定ip了,而是根據pipework工具自定ip指定)

docker run -itd --net=none --name=my_centos image_id /bin/bash

給該容器配置網絡(注意網卡裡的gateway不能缺失)

pipework  br0 –i ens33 my_centos192.168.135.73/[email protected]

-i指定網卡名,後面為指定container的ip,netmask,gateway。

登入該容器

docker exec -it my_centos /bin/bash

ifconfig ens33 若無ifconfig則可yum安裝net-tools工具

七、Host-2制作docker的container

從私有倉庫pull鏡像

dockerpull 192.168.135.77:5000/centos:tag_name

安裝docker,重複步驟五、六。

八、Host-1和Host-2内的docker container互相ping

驗證是否能ping通。

網際網路參考資料:

1、https://blog.csdn.net/linux_player_c/article/details/53117238

2、https://www.cnblogs.com/chen110xi/p/6349454.html