天天看點

Docker 容器連接配接

前面我們實作了通過網絡端口來通路運作在 docker 容器内的服務。

容器中可以運作一些網絡應用,要讓外部也可以通路這些應用,可以通過 -P 或 -p 參數來指定端口映射。

下面我們來實作通過端口連接配接到一個 docker 容器。

我們建立了一個 python 應用的容器。

另外,我們可以指定容器綁定的網絡位址,比如綁定 127.0.0.1。

我們使用 -P 綁定端口号,使用 docker ps 可以看到容器端口 5000 綁定主機端口 32768。

我們也可以使用 -p 辨別來指定容器端口綁定到主機端口。

兩種方式的差別是:

-P :是容器内部端口随機映射到主機的高端口。

-p : 是容器内部端口綁定到指定的主機端口。

這樣我們就可以通過通路 127.0.0.1:5001 來通路容器的 5000 端口。

上面的例子中,預設都是綁定 tcp 端口,如果要綁定 UDP 端口,可以在端口後面加上 /udp。

docker port 指令可以讓我們快捷地檢視端口的綁定情況。

端口映射并不是唯一把 docker 連接配接到另一個容器的方法。

docker 有一個連接配接系統允許将多個容器連接配接在一起,共享連接配接資訊。

docker 連接配接會建立一個父子關系,其中父容器可以看到子容器的資訊。

當我們建立一個容器的時候,docker 會自動對它進行命名。另外,我們也可以使用 --name 辨別來命名容器,例如:

我們可以使用 docker ps 指令來檢視容器名稱。

下面先建立一個新的 Docker 網絡。

Docker 容器連接配接

參數說明:

-d:參數指定 Docker 網絡類型,有 bridge、overlay。

其中 overlay 網絡類型用于 Swarm mode,在本小節中你可以忽略它。

運作一個容器并連接配接到建立的 test-net 網絡:

打開新的終端,再運作一個容器并加入到 test-net 網絡:

點選圖檔檢視大圖:

Docker 容器連接配接

下面通過 ping 來證明 test1 容器和 test2 容器建立了互聯關系。

如果 test1、test2 容器内中無 ping 指令,則在容器内執行以下指令安裝 ping(即學即用:可以在一個容器裡安裝好,送出容器到鏡像,在以新的鏡像重新運作以上倆個容器)。

在 test1 容器輸入以下指令:

Docker 容器連接配接

同理在 test2 容器也會成功連接配接到:

Docker 容器連接配接

這樣,test1 容器和 test2 容器建立了互聯關系。

如果你有多個容器之間需要互相連接配接,推薦使用 Docker Compose,後面會介紹。

我們可以在主控端的 /etc/docker/daemon.json 檔案中增加以下内容來設定全部容器的 DNS:

設定後,啟動容器的 DNS 會自動配置為 114.114.114.114 和 8.8.8.8。

配置完,需要重新開機 docker 才能生效。

檢視容器的 DNS 是否生效可以使用以下指令,它會輸出容器的 DNS 資訊:

Docker 容器連接配接

手動指定容器的配置

如果隻想在指定的容器設定 DNS,則可以使用以下指令:

--rm:容器退出時自動清理容器内部的檔案系統。

-h HOSTNAME 或者 --hostname=HOSTNAME: 設定容器的主機名,它會被寫到容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 添加 DNS 伺服器到容器的 /etc/resolv.conf 中,讓容器用這個伺服器來解析所有不在 /etc/hosts 中的主機名。

--dns-search=DOMAIN: 設定容器的搜尋域,當設定搜尋域為 .example.com 時,在搜尋一個名為 host 的主機時,DNS 不僅搜尋 host,還會搜尋 host.example.com。

Docker 容器連接配接

如果在容器啟動時沒有指定 --dns 和 --dns-search,Docker 會預設用宿主主機上的 /etc/resolv.conf 來配置容器的 DNS。