第三方鏡像
須要登錄docker帳號node
root@slave1:/home/xxx/Documents# docker pull index.tenxcloud.com/docker_library/node:latest Error response from daemon: pull access denied for index.tenxcloud.com/docker_library/node, repository does not exist or may require 'docker login'
搭建本地私有倉庫
1)使用registry 鏡像建立私高倉庫
安裝Docker 後, 能夠經過官方提供的registry
鏡像來簡單搭建一套本地私有倉庫環境:python
root@slave1:/home/xxx/Documents# docker run -d -p 5000:5000 registry:2 #自動下載井啓動一個registry容器,建立本地的私有倉庫服務。 Unable to find image 'registry:2' locally 2: Pulling from library/registry c87736221ed0: Pull complete 1cc8e0bb44df: Pull complete 54d33bcb37f5: Pull complete e8afc091c171: Pull complete b4541f6d3db6: Pull complete Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146 Status: Downloaded newer image for registry:2 40761724cd46b129753d1d74bf51a4744d609b68a00edfc5179a922510fab1e7
查看全部容器web
root@slave1:/home/xxx/Documents# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40761724cd46 registry:2 "/entrypoint.sh /etc…" 10 minutes ago Up 10 minutes 0.0.0.0:5000->5000/tcp dazzling_hopper
默認狀況下,倉庫會被建立在容器的/var/lib/registry
目錄下。能夠經過-v
參數來將鏡像文件存放在本地的指定路徑。將上傳的鏡像放到/opt/data/registry
目錄:docker
docker run -d -p 5000 5000 -v /opt / data/registry:/var/l ib/registry registry :2
此時在本地將啓動一個私有倉庫服務,監聽端口爲5000 。
2)管理倉庫
查看已有鏡像數據庫
root@slave1:/home/xxx/Documents# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 16.04 5e13f8dd4c1a 6 weeks ago 120MB
使用docker tag
命令將這個鏡像標記爲10.0.2.2:5000/test
(格式爲docker tag IMAGE [:TAG] [REGISTRY.HOST/] [USERNAME/] NAME [:TAG ]
)ubuntu
root@slave1:/home/xxx/Documents# docker tag ubuntu:16.04 10.0.2.2:5000/test root@slave1:/home/xxx/Documents# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.2.2:5000/test latest 5e13f8dd4c1a 6 weeks ago 120MB ubuntu 16.04 5e13f8dd4c1a 6 weeks ago 120MB
使用docker push
上傳標記的鏡像:安全
# docker push 10.0.2.2:5000/test
用curl
查看倉庫10.0.2.2:5000
中的鏡像:bash
# curl http://10.0.2.2:5000/v2/search
上傳成功後,能夠到任意一臺能訪問到10.0.2.2
地址的機器去下載這個鏡像。比較新的Docker 版本對安全性要求較高,會要求倉庫支持SSL/TLS
證書。對於內部使用的私有倉庫,能夠自行配置證書或關閉對倉庫的安全性檢查。首先,修改Docker daemon
的啓動參數,添加以下參數,表示信任這個私有倉庫,不進行安全證書檢查:DOCKER_OPTS;」-- insecure-registry 10.0.2.2:500 」
以後重啓Docker 服務,並從私有倉庫中下載鏡像到本地網絡
root@slave1:/home/xxx/Documents# service docker restart root@slave1:/home/xxx/Documents# docker pull 10.0.2.2:5000/test root@slave1:/home/xxx/Documents# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.2.2:5000/test latest 5e13f8dd4c1a 6 weeks ago 120MB
下載後,還能夠添加一個更通用的標籤ubuntu: 16. 04
,方便後續使用:app
root@slave1:/home/xxx/Documents# docker tag 10.0.2.2:5000/test ubuntu:16.04
在生產環境中使用Docker ,每每須要對數據進行持久化,或者須要在多個容器之間進行數據共享,這必然涉及容器的數據管理操做。
容器中的管理數據主要有兩種方式:
口數據卷(Data Volumes
) : 容器內數據直接映射到本地主機環境;
口數據卷容器( Data Volume Containers
) : 使用特定容器維護數據卷。
介紹如何在容器內建立數據卷,而且把本地的目錄或文件掛載到容器內的數據卷中。接下來,介紹如何使用數據卷容器在容器和主機、容器和容器之間共享數據,並實現數據的備份和恢復。
數據卷
數據卷( Data Volumes
) 是一個可供容器使用的特殊目錄,它將主機操做系統目錄直接映射進容器,相似於Linux 中的mount
行爲。
數據卷能夠提供不少有用的特性:
口數據卷能夠在容器之間共事和重用,容器間傳遞數據將變得高效與方便;
口對數據卷內數據的修改會立馬生效,不管是容器內操做仍是本地操做;
口對數據卷的更新不會影響鏡像,解摘開應用和數據;
口卷會一直存在,直到沒有容器使用,能夠安全地卸載它。
建立數據卷
Docker 提供了volume
子命令來管理數據卷,以下命令能夠快速在本地建立一個數據卷:
root@slave1:/home/xxx/Documents# docker volume create -d local test test
查看/var/lib/docker /volumes
路徑下,會發現所建立的數據卷位置:
root@slave1:/home/xxx/Documents# ls -l /var/lib/docker/volumes -rw------- 1 root root 32768 9月 10 11:04 metadata.db drwxr-xr-x 3 root root 4096 9月 10 11:04 test
除了create
子命令外, docker volume
還支持inspect
(查看詳細信息)、ls
(列出已有數據卷)、prune
(清理無用數據卷)、rm
(刪除數據卷)等
root@slave1:/home/xxx/Documents# docker volume inspect test #數據卷查看詳細信息 [ { "CreatedAt": "2019-09-10T11:04:12+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/test/_data", "Name": "test", "Options": {}, "Scope": "local" } ]
root@slave1:/home/xxx/Documents# docker volume ls #列出已有數據卷 DRIVER VOLUME NAME local 8ed823897243d9ef96538d5362760c81c8612e7a35380dfb599178e612325b93 local test
綁定數據卷
除了使用volume
子命令來管理數據卷外,還能夠在建立容器時將主機本地的任意路徑掛載到容器內做爲數據卷,這種形式建立的數據卷稱爲綁定數據卷。
在用docker [container] run
命令的時候,可使用-mount
選項來使用數據卷。
- mount
選項支持三種類型的數據卷,包括:
口 volume
: 普通數據卷,映射到主機/var/ lib /docke r /volumes
路徑下;
口bind
:綁定數據卷,映射到主機指定路徑下;
口 tmpfs
:臨時數據卷,只存在於內存中。
下面使用training/webapp
鏡像建立一個Web 容器,並建立一個數據卷掛載到容器的/opt/webapp
目錄:
root@slave1:/home/xxx/Documents# docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py #報錯 不存在/webapp 使 用下面命令以後 再試一下
上述命令等同於使用舊的-v
標記能夠在容器內建立一個數據卷:
root@slave1:/home/xxx/Documents# docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py Unable to find image 'training/webapp:latest' locally latest: Pulling from training/webapp e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d Status: Downloaded newer image for training/webapp:latest 4bcc83dac6efb860a4590fb1c3540759876417714c52bb33a73013ec38414a1f
使用training/webapp
鏡像建立一個Web1 容器,並建立一個數據卷掛載到容器的/opt/webapp
目錄:
root@slave1:/home/xxx/Documents# docker run -d -P --name web1 --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py d7a066b7f5aaf384ac5871d50c94e4985107869b34129181d9ebd188f010501c
這個功能在進行應用測試的時候十分方便,好比用戶能夠放置一些程序或數據到本地目錄中實時進行更新,而後在容器內運行和使用。
另外,本地目錄的路徑必須是絕對路徑,容器內路徑能夠爲相對路徑。若是目錄不存在, Docker 會自動建立。
Docker 掛載數據卷的默認權限是讀寫(rw
) ,用戶也能夠經過ro
指定爲只讀:
root@slave1:/home/xxx/Documents# docker run -d -P --name d7a066b7f5aaf384ac5871d50c94e4985107869b34129181d9ebd188f010501c -v /webapp:/opt/webapp:ro training/webapp python app.py ee35606b7e5dec26e544d60878f94137973c691ad0821a8604730a95f97f3863
加了:ro
以後,容器內對所掛載數據卷內的數據就沒法修改了。
若是直接掛載一個文件到容器,使用文件編輯工具,包括vi
或者sed - - in place
的時候,可能會形成文件inode
的改變。從Docker 1.1.0 起,這會致使報錯誤信息。因此推薦的方式是直接掛載文件所在的目錄到容器內。
數據卷容器
若是用戶須要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,可是它的目的是專門提供數據卷給其餘容器掛載。
首先,建立一個數據卷容器dbdata
, 並在其中建立一個數據卷掛載到/dbdata
:
root@slave1:/home/xxx/Documents# docker run -it -v /dbdata --name dbdata ubuntu root@257d18f2f4dd:/#
查看/dbdata
目錄:
root@257d18f2f4dd:/# ls bin dbdata etc lib media opt root sbin sys usr boot dev home lib64 mnt proc run srv tmp var
而後,能夠在其餘容器中使用--volumes-from
來掛載dbdata
容器中的數據卷,例如建立dbl
和db2
兩個容器,並從dbdata
容器掛載數據卷:
root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name db1 ubuntu root@1709a48e760e:/# exit exit root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name db2 ubuntu root@94eeab14f62c:/# exit exit
此時, 容器dbl
和db2
都掛載同一個數據捲到相同的/dbdata
目錄,三個容器任何一方在該目錄下的寫人,其餘容器均可以看到
在dbdata
容器中建立一個test
文件:
root@slave1:/home/xxx/Documents# docker start 94eeab14f62c #啓動db2容器 94eeab14f62c root@slave1:/home/xxx/Documents# docker attach 94eeab14f62c #進入容器 root@94eeab14f62c:/# ls #查看目錄 bin dbdata etc lib media opt root sbin sys usr boot dev home lib64 mnt proc run srv tmp var root@94eeab14f62c:/# cd /dbdata #進入dbdata目錄 root@94eeab14f62c:/dbdata# touch test #建立test文件 root@94eeab14f62c:/dbdata# ls test
在dbl1
容器內查看它:
root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name 1709a48e760e ubuntu #db1容器 root@6cc5d2d5ad79:/# ls bin dbdata etc lib media opt root sbin sys usr boot dev home lib64 mnt proc run srv tmp var root@6cc5d2d5ad79:/# cd dbdata root@6cc5d2d5ad79:/dbdata# ls test
或者使用前面提到的attach
命令進入db1
容器內查看:
root@slave1:/home/xxx/Documents# docker start 1709a48e760e #啓動db1容器 1709a48e760e root@slave1:/home/xxx/Documents# docker attach 1709a48e760e root@6cc5d2d5ad79:/# ls bin dbdata etc lib media opt root sbin sys usr boot dev home lib64 mnt proc run srv tmp var root@6cc5d2d5ad79:/# cd dbdata root@6cc5d2d5ad79:/dbdata# ls test
注意:使用attach
進入容器時,須要先啓動容器,不然會出現如下提示:
root@slave1:/home/xxx/Documents# docker attach 1709a48e760e You cannot attach to a stopped container, start it first
能夠屢次使用--volumes-from
參數來從多個容器掛載多個數據卷,還能夠從其餘已經掛載了容器卷的容器來掛載數據卷
root@slave1:/home/xxx/Documents# docker run -d --name db3 --volumes-from db1 training/postgres Unable to find image 'training/postgres:latest' locally latest: Pulling from training/postgres a3ed95caeb02: Pull complete 6e71c809542e: Pull complete 2978d9af87ba: Pull complete e1bca35b062f: Pull complete 500b6decf741: Pull complete 74b14ef2151f: Pull complete 7afd5ed3826e: Pull complete 3c69bb244f5e: Pull complete d86f9ec5aedf: Pull complete 010fabf20157: Pull complete Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e Status: Downloaded newer image for training/postgres:latest c06bced08bd6946ce2167eb7f02dcf3da796c540b0eafb380951d57a3ae4ecd2
注意,使用--volumes-from
參數所掛載數據卷的容器自身並不須要保持再運行狀態。
若是刪除了掛載的容器(包括dbdata
、db ``和
db2),數據卷並不會被自動刪除。若是要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時顯式使用
dock er rm -v` 命令來指定同時刪除關聯的容器。
使用數據卷容器可讓用戶在容器之間自由地升級和移動數據卷,具體的操做見下一節.
利用數據卷容器來遷移數據
利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
1) 備份
使用下面的命令來備份dbdata
數據卷容器內的數據卷:
root@slave1:/home/xxx/Documents# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用ubuntu 鏡像建立了一個容器worker 。使用--volumes-from dbdata
參數來讓worker 容器掛載dbdata
容器的數據卷( 即dbdata
數據卷);使用-v$ (pwd) : /bac kup
參數來掛載本地的當前目錄到worker 容器的/backup 目錄。
worker 容器啓動後,使用tar cvf /backup/backup.tar /dbdata
命令將/dbdata
下內容備份爲容器內的/backup/backup. tar
,即宿主主機當前目錄下的backup.tar
。
2) 恢復
要恢復數據到一個容器,首先建立一個帶有數據卷的容器dbdata2
:
root@slave1:/home/xxx/Documents# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
而後建立另外一個新的容器,掛載dbdata2
的容器,並使用untar
解壓備份文件到所掛載的容器卷中:
root@slave1:/home/xxx/Documents# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 7c9d20b9b6cd: Pull complete Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e Status: Downloaded newer image for busybox:latest dbdata/ dbdata/test
經過數據卷和數據卷容器對容器內的數據進行共享、備份和恢復等操做,經過這些機制,即便容器在運行中出現故障,用戶也沒必要擔憂數據發生丟失,只須要快速地從新建立容器便可。
在實踐中, 常常會碰到須要多個服務組件容器共同協做的狀況, 這每每須要多個容器之間可以互相訪問到對方的服務。Docker 除了經過網絡訪間外, 還提供了兩個很方便的功能來知足服務訪問的基本需求:一個是容許映射容器內應用的服務端口到本地宿主主機;另外一個是互聯機制實現多個容器間經過容器名來快速訪問。
端口映射實現容器訪問
1)從外部訪問容器應用
在啓動容器時, 若是不指定對應參數, 在容器外部是沒法經過網絡來訪問容器內的網絡應用和服務的。當容器中運行一些網絡應用, 要讓外部訪問這些應用時, 能夠經過-P或-p參數來指
定端口映射。
root@slave1:/home/xxx/Documents# docker run -d -P training/webapp python app.py 419bf896b24023396c411dc6e9718c415505f69184fa807074b4a9b0eeec7ab3 root@slave1:/home/zyy/Documents# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 419bf896b240 training/webapp "python app.py" 9 seconds ago Up 7 seconds 0.0.0.0:32771->5000/tcp hardcore_shamir
可使用docker ps
看到, 本地主機的32771 被映射到了容器的5000 端口。訪間宿主主機的32771 端口便可訪問容器內web 應用提供的界面。
一樣, 能夠經過docker logs
命令來查看應用的信息:
root@slave1:/home/xxx/Documents# docker logs -f hardcore_shamir * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
注意:-p
能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器。支持的格式有IP:HostPort:ContainerPortIIP:: ContainerPortIHostPort:ContainerPort
。
2)映射全部接口地址
使用HostPort:ContainerPort
格式本地的5000端口映射到容器的5000端口,能夠執行以下命令:
root@slave1:/home/xxx/Documents# docker run -d -p 5000:5000 training/webapp python app.py 2ebb57dad1d4430133f56c8a9e238b9c0622d4036c2fd063fd01cc2d8de70e5d
此時默認會綁定本地全部接口上的全部地址。屢次使用-p
標記能夠綁定多個端口。例如:
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
3)映射到指定地址的指定端口
可使用IP:HostPart:ContainerPort
格式指定映射使用一個特定地址,好比localhost地址127.0.0.1
:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4)映射到指定地址的任意端口
使用IP::ContainerPort
綁定localhost的任意端口到容器的5000端口,本地主機會自動分配一個端口:
root@slave1:/home/xxx/Documents# docker run -d -p 127.0.0.1::5000 training/webapp python app.py 13c8e9e5123b6731c91b7e60cd95050d8067dd23420c828cb7508ee711320170
還可使用udp
標記來指定udp
端口:
root@slave1:/home/xxx/Documents# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 2f0c22deff8877fe1b711446e536edee1117a4e27b4b00f2e8787267d18a3059
5)查看映射端口配置
使用docker port
來查看當前映射的端口配置,也能夠查看到綁定的地址:
root@slave1:/home/xxx/Documents# docker port hardcore_shamir 5000 0.0.0.0:32771
另外,容器有本身的內部網絡和IP地址,使用docker [container] inspect+容器ID
能夠獲取容器的具體信息。
互聯網機制實現快捷互訪
容器的互聯(linking)是一種讓多個容器中的應用進行快速交互的方式。它會在源和接收容器之間建立鏈接關係,接收容器能夠經過容器名快速訪問到源容器,而不用指定具體的IP地址。
1)自定義容器命名
鏈接系統依據容器的名稱來執行。首先須要自定義一個好記的容器命名。雖然當建立容器的時候,系統默認會分配一個名字,但自定義命名容器有兩個好處:
- 自定義的命名,比較好記,好比一個Web應用容器能夠給它起名叫web, 一目瞭然;
- 當要鏈接其餘容器時候(即使重啓),也可使用容器名而不用改變,好比鏈接web容器到db容器。
使用--name
標記能夠爲容器自定義命名:
root@slave1:/home/xxx/Documents# docker run -d -P --name web training/webapp python app.py 511678ee937939e33c935d364375edc3b61acd3e299c6b2b63e65b2a2523f48a
使用docker ps
來驗證設定的命名:
root@slave1:/home/xxx/Documents# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 511678ee9379 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32772->5000/tcp web
也使用docker [container) inspect
來查看容器的名字:
root@slave1:/home/xxx/Documents# docker inspect -f "{{.Name}}" 511678ee9379 /web
注意:容器的名稱是惟一的。若是已經命名了一個叫web的容器,當你要再次使用web這個名稱的時候,須要先用docker rm
命令刪除以前建立的同名容器。
2)容器互聯
使用--link
參數可讓容器之間安全地進行交互。建立一個新的數據庫容器:
root@slave1:/home/xxx/Documents# docker run -d --name db training/postgres 048e7b6c61e9ec56e0462c5076d09d00255d932c380bfc4c9127958143777e42 root@slave1:/home/xxx/Documents# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 048e7b6c61e9 training/postgres "su postgres -c '/us…" About a minute ago Up About a minute 5432/tcp db
刪除以前建立的web容器:
root@slave1:/home/xxx/Documents# docker rm -f web web
建立一個新的web容器,並將它鏈接到db容器:
root@slave1:/home/xxx/Documents# docker run -d -P --name web --link db:db training/webapp python app.py e88a580668bc18733f6f685817430b37e8f072a1aaf08462f7cb3c0dc3c9fc3b
此時,db容器和web容器創建互聯關係。--link
參數的格式爲--link name: alias
, 其中name是要連接的容器的名稱,alias是別名。如今使用docker ps
來查看容器的鏈接:
root@slave1:/home/xxx/Documents# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e88a580668bc training/webapp "python app.py" 2 minutes ago Up About a minute 0.0.0.0:32773->5000/tcp web 048e7b6c61e9 training/postgres "su postgres -c '/us…" 5 minutes ago Up 5 minutes 5432/tcp db
看到自定義命名的容器: db 和web, db 容器的names 列有db 也有web/db。這表示web 容器連接到db 容器, web 容器將被容許訪問db 容器的信息。
Docker 至關於在兩個互聯的容器之間建立了一個虛機通道, 並且不用映射它們的端口到宿主主機上。在啓動db 容器的時候並無使用-p
和-P
標記, 從而避免了暴露數據庫服務端口到外部網絡上。
Docker 經過兩種方式爲容器公開鏈接信息:
口更新環境變量;
口 更新/etc/hosts
文件。
使用env
命令來查看web 容器的環境變量:
root@slave1:/home/xxx/Documents# docker run --rm --name web2 --link db:db training/webapp env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=226b133d997a DB_PORT=tcp://172.17.0.2:5432 DB_PORT_5432_TCP=tcp://172.17.0.2:5432 DB_PORT_5432_TCP_ADDR=172.17.0.2 DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_PROTO=tcp DB_NAME=/web2/db DB_ENV_PG_VERSION=9.3 HOME=/root
其中DB_開頭的環境變量是供web 容器鏈接db 容器使用, 前綴採用大寫的鏈接別名。除了環境變量, Docker 還添加host信息到父容器的/etc/hosts
的文件。下面是父容器web的hosts
文件:
root@slave1:/home/xxx/Documents# docker run -t -i --rm --link db:db training/webapp /bin/bash root@e9e98e537bec:/opt/webapp# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 db b3c84640e83a 172.17.0.4 e9e98e537bec
這裏有2 個hosts 信息, 第一個是db 容器的IP 和主機名,第二個是web 容器, web 容器用本身的id 做爲默認主機名。
能夠在web 容器中安裝ping
命令來測試跟db 容器的連通:
root@e9e98e537bec:/opt/webapp# apt-get install -yqq inetutils-ping (Reading database ... 18233 files and directories currently installed.) Removing ubuntu-minimal (1.325) ... Removing iputils-ping (3:20121221-4ubuntu1.1) ... Selecting previously unselected package inetutils-ping. (Reading database ... 18221 files and directories currently installed.) Preparing to unpack .../inetutils-ping_2%3a1.9.2-1_amd64.deb ... Unpacking inetutils-ping (2:1.9.2-1) ... Setting up inetutils-ping (2:1.9.2-1) ... root@e9e98e537bec:/opt/webapp# ping db PING db (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.528 ms 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.193 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.112 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.207 ms 64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.114 ms 64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.175 ms 64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.115 ms 64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.113 ms 64 bytes from 172.17.0.2: icmp_seq=8 ttl=64 time=0.114 ms 64 bytes from 172.17.0.2: icmp_seq=9 ttl=64 time=0.115 ms 64 bytes from 172.17.0.2: icmp_seq=10 ttl=64 time=0.115 ms 64 bytes from 172.17.0.2: icmp_seq=11 ttl=64 time=0.222 ms 64 bytes from 172.17.0.2: icmp_seq=12 ttl=64 time=0.287 ms 64 bytes from 172.17.0.2: icmp_seq=13 ttl=64 time=0.116 ms 64 bytes from 172.17.0.2: icmp_seq=14 ttl=64 time=0.210 ms 64 bytes from 172.17.0.2: icmp_seq=15 ttl=64 time=0.115 ms ^C--- db ping statistics --- 16 packets transmitted, 16 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.112/0.178/0.528/0.105 ms
用ping
來測試db容器, 它會解析成172.17.0.2。用戶能夠連接多個子容器到父容器, 好比能夠連接多個web到同一個db容器上。
在生產環境中, 網絡方面的需求更加複雜和多變, 包括跨主機甚至跨數據中心的通訊,這時候每每就須要引入額外的機制, 例如SDN (軟件定義網絡)或NFV (網絡功能虛擬化)的相關技術。
後面小節將進一步探討如何經過libnetwork
來實現跨主機的容器通訊, 以及Docker 網絡的高級功能和配置。