端口映射實現容器訪問
從外部訪問容器應用
在啓動容器的時候,如果不指定對應參數,在容器外部是無法通過網絡來訪問容器內的網絡應用和服務的。
當容器中運行一些網絡應用,要讓外部訪問這些應用時,可以通過-P或者-p參數來指定端口映射。
當使用-P標記時,Docker會隨機映射一個49000~49900的端口到內部容器開發的網絡端口。
當使用-p標記時,可以指定要映射的端口,並且,在一個指定端口上只可以綁定一個容器。至此那個的格式有:IP:HostPort:ContainerPort 或者IP::ContainerPort或者HostPort:ContainerPort。
映射所有接口地址
使用HostPort:ContainerPort格式將本地的5000端口映射到容器的5000端口,可以執行如下命令:
docker run -d -p 5000:5000 training/webapp python app.py
此時默認會綁定本地所有接口上的所有地址。多次使用-p標記可以綁定多個端口。例如:
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
映射到指定地址的指定端口
可以使用IP:HostPort:ContainerPort格式指定映射使用一個特定地址。
例如指定ip是127.0.0.1,映射到5000端口:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用IP::ContainerPort綁定localhost的任意端口到容器的5000端口,本地主機會自動分配一個端口:
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還可以使用udp標記來指定udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用docker port
來查看當前映射的端口配置,也可以查看到綁定的地址:
注意:容器有自己的內部網絡和IP地址,使用docker inspect + 容器id可以獲取容器的具體信息。
容器之間的互聯
容器的互聯是一種讓多個容器中的應用進行快速交互的方式。它會在源容器和接收容器之間創建連接關係,接收容器可以通過容器名快速訪問源容器,而不用指定具體的IP地址。
自定義容器命名
連接系統依據容器的名稱來執行。因此非常有必要自定義一個好記的容器命名,使用–name標記可以爲容器自定義命名。注意:容器的名稱是唯一的。
容器互聯
使用–link參數可以讓容器之間安全地進行交互。
下面先創建一個新的數據庫容器:
docker run -d --name db training/postgres
創建一個新的web容器,並將它連接到db容器:
docker run -d -P --name web --link db:db training/webapp python app.py
–link參數的語法格式解析:–link name:alias,其中name是要連接的容器的名稱,alias是別名。
此時,db容器和web容器建立互聯關係,相當於在兩個互聯的容器之間創建了一個虛擬機通道,而且不用映射它們的端口到宿主主機上。在啓動db容器的時候並沒有使用-p或者-P標記,從而避免了暴露數據庫服務端口到外部網絡上。
可以在web容器中安裝ping命令來測試跟db容器的連通,此時ping db
就能成功。