基于 Docker18.09.0
1. 容器之間彼此自動發(fā)布端口
假如兩個容器是在一個網(wǎng)絡(luò)中的話逃顶,一個容器的端口是會自動暴露給其他容器的。
比如下面的實例是運(yùn)行了一個 nginx
的容器育谬,之后再運(yùn)行一個客戶端容器
,再客戶端的容器中訪問其 80
端口帮哈。
$ docker run -itd --rm --name=nginx1 nginx:alpine
查看 nginx
的地址
部分內(nèi)容已截斷
$ docker network inspect bridge
{
"Name": "bridge",
"Containers": {
"5b9d71bc95fbae83eac03c0165ae871cc387caa1b8b35c4640a90f79524e8e73": {
"Name": "nginx1",
"EndpointID": "6192b427066ac0d269e209d0435b5832fdca58241f5ccdb97d3d166fae42fbdb",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
運(yùn)行另一個容器膛檀,并安裝 curl
軟件包,訪問 nginx
提供的 web
服務(wù)
$ docker run -it --rm --name=myurl alpine /bin/sh
/ # apk add curl
/ # curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...略...
由于兩個容器是連接到默認(rèn)網(wǎng)絡(luò),所以需要使用容器 IP 進(jìn)行通信咖刃。
假如是使用的自定義網(wǎng)絡(luò)泳炉,就可以直接使用容器名進(jìn)行通信了。
可以看到上面的情況只能通過彼此的端口訪問彼此提供的服務(wù)嚎杨,顯然這很不方便胡桃。
因為通常情況下我們都不能很方便的指的容器的 IP, 所以我們在創(chuàng)建一套完整的應(yīng)用程序的時候,都是把他們放在一個自定義的網(wǎng)絡(luò)中的磕潮。這樣就可以通過容器名來訪問這個容器提供的服務(wù)了。
比如下面的示例就是在一個自定義的網(wǎng)絡(luò)nginx-to-redis
中運(yùn)行了一個 nginx
和 一個 redis
容贝。
$ docker network create nginx-to-redis
0966519c68e2c1002194e6567d00a2af4601180b054b4d43fa05d58b3af3e231
$ docker run -itd --rm --name=nginx --network=nginx-to-redis nginx:alpine
4631cd452bba70e5d0227e8d1c33337ef2427036495ebb3e44faaa3e1a5cd4f3
$ docker run -itd --rm --name=redis --network=nginx-to-redis redis
e3e6d83c11c252cb824eb50b92156dafdc0bf6ba499a2ecb550193f7d11f7c7c
接下來自脯,進(jìn)入到 nginx
容器中,安裝 python3
以及 連接 redis
的模塊斤富,訪問 redis
的 6379
端口膏潮,并進(jìn)行一些簡單操作。
$ docker exec -it nginx /bin/sh
/ # apk add python3
...略...
/ # pip3 install redis
...略...
/ # python3
Python 3.6.6 (default, Aug 24 2018, 05:04:18)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> rs = redis.Redis(host='redis', port=6379)
>>> rs.set("name", 'shark')
True
>>> rs.get("name")
b'shark'
>>> exit()
/ # exit
請允許我無恥的插播一條廣告_, 這里有一整套完整的 Python3 基礎(chǔ)教程满力,圖文并茂焕参。點我傳送門:Python3 完整基礎(chǔ)教程
同時歡迎購買我的基礎(chǔ)全套視頻微我 y86000153優(yōu)惠100 點我
2. 發(fā)布一部分容器的服務(wù)端口給外部使用
容器中可以運(yùn)行一些應(yīng)用,要讓外部也可以訪問這些應(yīng)用油额,可以通過 -P
或 -p
參數(shù)來指定端口映射叠纷。
當(dāng)使用大寫的
-P
標(biāo)記時,Docker 會隨機(jī)映射一個物理機(jī)的49000~49900
之間的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口潦嘶。
-p
則可以指定想要映射的物理機(jī)端口涩嚣,并且,在一個指定端口上只可以綁定一個容器掂僵。
示例:
a. 映射指定的本地 IP 和端口到容器端口
ip:hostPort:containerPort
$ docker run -d -p 10.18.42.174:8080:80 --name mynginx2 nginx:alpine
b.映射本地指定 IP 的任意端口到容器的一個端口航厚,本地主機(jī)會自動分配一個端口
ip::containerPort
$ docker run -d -p 10.18.42.174::80 --name mynginx3 nginx:latest
c. 映射本機(jī)的所有的地址的指定端口到容器的指定端口
hostPort:containerPort
[root@docker ~]# docker run -d -p 8000:80 nginx:latest
-p
標(biāo)記還可以多次使用來綁定多個端口
例如:
$ docker run -d \
--name nginx110
-p 4430:443 \
-p 8000:80 \
nginx:alpine
查看端口映射配置信息
使用 docker port
來查看當(dāng)前映射的端口配置,也可以查看到綁定的地址
格式:
docker port 容器名/容器 ID 容器的端口號
$ docker port nginx110
4430/tcp -> 0.0.0.0:443
80/tcp -> 0.0.0.0:8000
$ docker port nginx110 80
0.0.0.0:8000
$ docker port nginx110 443
0.0.0.0:4430