Docker使用小結(二)Docker倉庫 Docker數據管理 端口映射與容器互聯

1 Docker訪問倉庫

第三方鏡像
須要登錄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

2 Docker數據管理

在生產環境中使用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 容器中的數據卷,例如建立dbldb2 兩個容器,並從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

此時, 容器dbldb2 都掛載同一個數據捲到相同的/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 參數所掛載數據卷的容器自身並不須要保持再運行狀態。
若是刪除了掛載的容器(包括dbdatadb ``和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

經過數據卷和數據卷容器對容器內的數據進行共享、備份和恢復等操做,經過這些機制,即便容器在運行中出現故障,用戶也沒必要擔憂數據發生丟失,只須要快速地從新建立容器便可。

3 端口映射與容器互聯

在實踐中, 常常會碰到須要多個服務組件容器共同協做的狀況, 這每每須要多個容器之間可以互相訪問到對方的服務。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 網絡的高級功能和配置。

相關文章
相關標籤/搜索