Docker 外部訪問容器Pp、數據管理volume、網絡network 介紹
外部訪問容器
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 參數來 指定端口映射。
當使用 -P 標記時,Docker 會隨機映射一個端口到內部容器開放的網絡端口。
╭─will in ~ 11:11:27 ╰─(。ŏ_ŏ) docker run -tid --name redis -P redis 344ea0c6b48a9db551f530998ce901347d72ba9b03a82628979aaddd53189fe7 ╭─will in ~ 11:11:32 ╰─ヾ(;゚;Д;゚;)ノ゙ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 344ea0c6b48a redis "docker-entrypoint.s…" Less than a second ago Up 2 seconds 0.0.0.0:32769->6379/tcp redis
當使用-p標記時,Docker會映射一個指定端口到內部容器開放的網絡端口。
╭─will in ~ 11:11:34 ╰─╰(*°▽°*)╯ docker run -tid --name redis-1 -p 6380:6379 redis 4b10e4b28fe7125fb40b8a338f6bb225ef3e4e5917722d63af61e300857a2220 ╭─will in ~ 11:13:27 ╰─(。ŏ_ŏ) docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4b10e4b28fe7 redis "docker-entrypoint.s…" Less than a second ago Up 2 seconds 0.0.0.0:6380->6379/tcp redis-1
數據卷
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特 性:
- 數據卷 可以在容器之間共享和重用
- 對 數據卷 的修改會立馬生效
- 數據卷 默認會一直存在,即使容器被刪除
啓動一個掛載數據卷的容器並映射端口,將宿主機的 8088映射到nginx容器的80端口,將指定目錄/Users/will映射到宿主機的根目錄。
╭─will in ~ 11:00:50 ╰─ε=ε=ヾ(;゚д゚)/ docker run -tid --name nginx -v /Users/will:/usr/share/nginx/html -p 8088:80 nginx 4d95127b3a60393fe8e078bce8919a53c8f2566066e4968b6a7f73cc1e22176d
通過inspect查看mounts,ports。
"Mounts": [ { "Type": "bind", "Source": "/Users/will", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8088" } ] }
通過在宿主機創建文件測試,在終端顯示“helloworld”,則完成。
╭─will in ~ 11:02:52 ╰─(ง๑ •̀_•́)ง touch index.html ╭─will in ~ 11:03:02 ╰─٩(ŏ﹏ŏ、)۶ echo "helloworld" > index.html ╭─will in ~ 11:03:09 ╰─(*´・д・)? curl localhost:8088 helloworld
容器互聯network
隨着 Docker 網絡的完善,強烈建議大家將容器加入自定義的 Docker 網絡來連接多個容器, 而不是使用 --link 參數。
下面先創建一個新的 Docker 網絡。
╭─will in ~ 11:19:21 ╰─(ノ˚Д˚)ノ docker network create -d bridge my-net c90d0b1e79783e673f58f1ec2b2c472f034693eca54296adb364351091f0b9fb
- -d 參數指定 Docker 網絡類型,有 bridge overlay 。
創建2個容器並連接到新建的 my-net 網絡,通過第2個容器ping第一個容器,如:在busybox2中pingbusybox1,查看是否能夠連接成功。
╭─will in ~ 11:19:22 ╰─(º﹃º) docker run -it --rm --name busybox1 --network my-net busybox sh / # ╭─will in ~ 11:09:29 ╰─ε=ε=ヾ(;゚д゚)/ docker run -it --rm --name busybox2 --network my-net busybox sh / # ping busybox1 PING busybox1 (172.26.0.2): 56 data bytes 64 bytes from 172.26.0.2: seq=0 ttl=64 time=0.148 ms 64 bytes from 172.26.0.2: seq=1 ttl=64 time=0.291 ms
- 這樣, busybox1 容器和 busybox2 容器建立了互聯關係。
╭─will in ~/will/project/cluster 11:23:33 ╰─(゚3゚)~♪ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 47215f45415c busybox "sh" About a minute ago Up About a minute busybox2 4af85ed6478c busybox "sh" 2 minutes ago Up 2 minutes busybox1
總結
- 通過宿主機端口映射到容器,可以在宿主機方便的開啓多個服務,例如多個redis、mysql、nginx服務,而不再需要在宿主機做更多配置的變更。
- 通過數據卷可以將宿主機的數據目錄掛載到容器中,利用容器的環境各種服務運行已有的數據目錄,而不在需求在宿主機部署環境,docker環境也容易部署,減少了宿主機環境部署的複雜性。
- 通過網絡network可以將多個容器連接在一起,容器間的通信即可以使用容器名,而不再使用IP,IP的變動的,而容器名是可以自定義的,例如我們在使用nginx配置的時候,需要關聯php環境的配置,則此時,我們就可以通過容器名在docker-compose中定義好,而不再需要使用IP。部署集羣也是同樣好處。