端口映射和容器互聯

7、端口映射和容器互聯
 
Docker 除了經過網絡訪間外, 還提供了兩個很方便的功能來知足服務訪問的基本需求:
一個是容許映射容器內應用的服務端口到本地宿主主機;
另外一個是互聯機制實現多個容器間經過容器名來快速訪問。
 

 
端口映射實現容器訪問
 
在啓動容器的時候, 若是不指定對應參數, 在容器外部是沒法經過網絡來訪問容器內的
網絡應用和服務的。
 
當容器中運行一些網絡應用, 要讓外部訪問這些應用時, 能夠經過 -P 或 -p 參數來指
定端口映射。 
 
-P(大寫的)標記時, Docker 會隨機映射一個 49000 ~ 49900 的端口到內部容器開放的網絡端口。
 
-p (小寫的)則能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定 一個容器。
支持的格式有 IP: HostPort: ContainerPort 或 IP:: ContainerPort  或  HostPort: ContainerPort。
 
HostPort: ContainerPort 格式(映射全部接口地址):默認會綁定本地全部接口上的全部地址。屢次使用-p標記能夠綁定多個端口。
IP: HostPort: ContainerPort 格式(映射到指定地址的指定端口):指定映射使用一個特定地址。
IP:: ContainerPort 格式(映射到指定地址的任意端口): 綁定IP的任意端口到容器的xxx端口,本地主機會自動分配一個端口。
 
注意:
  • 容器有本身的內部網絡和 ip 地址(使用 docker inspect 能夠獲取全部的變量,Docker 還能夠有一個可變的網絡配置。)
  • -p 標記能夠屢次使用來綁定多個端口
能夠經過 docker logs 命令來查看應用的信息。
使用docker port 來查看當前映射的端口配置,也能夠查看到綁定的地址。
 

 
互聯機制實現便捷互訪
 
容器的互聯是一種讓多個容器中的應用進行快速交互的方式。它會在源和接收容器之間建立鏈接關係,接收容器能夠經過容器名快速訪問到源容器,而不用指定具體的IP地址。
 
一、自定義容器名(使用 docker  run  --name標記能夠爲容器自定義命名)
鏈接系統依據容器的名稱來執行。所以,首先須要自定義一個好記的容器命名。雖然當建立容器的時候,系統默認會分配一個名字,但自定義命名容器有兩個好處:1、自定義的命名,比較好記;2、當要鏈接其餘容器時候(即使重啓),也可使用容器名而不用改變
 
注意:容器的名稱是惟一的。若是巳經命名了一個叫web的容器,當你要再次使用web這個名稱的時候,須要先用docker rm命令刪除以前建立的同名容器。
在執行docker  run的時候若是添加--rm標記,則容器在終止後會馬上刪除。注意,- -rm 和-d參數不能同時使用。
 
 
二、容器互聯
 
使用 docker  run --link參數可讓容器之間安全地進行交互
--link參數的格式爲 --link name: alias, 其中name是要連接的容器的名稱 ,alias是別名
docker  run  -d  -P  --name  web  --link db:db  training/webapp  python  app.py
Docker 至關於在兩個互聯的容器之間建立了一個虛機通道, 並且不用映射它們的端口到宿主主機上。
 
隨着 Docker 網絡的完善,強烈建議你們將容器加入自定義的 Docker 網絡來鏈接多個容器,而不是使用 --link 參數。
 
   2.1 建立一個新的 Docker 網絡。
$ docker network create -d bridge my-net
-d 參數指定 Docker 網絡類型,有 bridge overlay。其中 overlay 網絡類型用於  Swarm mode,在本小節中你能夠忽略它。
   
    2.2 鏈接容器。
運行一個容器並鏈接到新建的 my-net 網絡
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打開新的終端,再運行一個容器並加入到 my-net 網絡
$ docker run -it --rm --name busybox2 --network my-net busybox sh
這樣,busybox1 容器和 busybox2 容器創建了互聯關係。可經過 ping  容器名 來證實 busybox1 容器和 busybox2 容器創建了互聯關係。
若是你有多個容器之間須要互相鏈接,推薦使用  Docker Compose
 

 
DNS配置
 
cat /etc/resolv.conf
配置所有容器的 DNS ,也能夠在 /etc/docker/daemon.json 文件中增長如下內容來設置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
若是用戶想要手動指定容器的配置,能夠在使用 docker run 命令啓動容器時加入以下參數:
-h HOSTNAME 或者 --hostname=HOSTNAME 設定容器的主機名,它會被寫到容器內的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不會在 docker container ls 中顯示,也不會在其餘的容器的 /etc/hosts 看到。
--dns=IP_ADDRESS 添加 DNS 服務器到容器的 /etc/resolv.conf 中,讓容器用這個服務器來解析全部不在 /etc/hosts 中的主機名。
--dns-search=DOMAIN 設定容器的搜索域,當設定搜索域爲 . example.com 時,在搜索一個名爲 host 的主機時,DNS 不只搜索 host,還會搜索  host.example.com
注意:若是在容器啓動時沒有指定最後兩個參數,Docker 會默認用主機上的 /etc/resolv.conf 來配置容器。
相關文章
相關標籤/搜索