1. 程式人生 > >Docker 外部訪問容器Pp、資料管理volume、網路network 介紹

Docker 外部訪問容器Pp、資料管理volume、網路network 介紹

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。部署叢集也是同樣好處。