1 Docker访问仓库
**第三方镜像 **
需要登陆docker账号
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
镜像来简单搭建一套本地私有仓库环境:
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
查看所有容器
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 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 ]
)
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
中的镜像:
# 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
,方便后续使用:
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
容器中的数据卷,例如创建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` 命令来指定同时删除关联的容器。
使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷,具体的操作见下一节.
利用数据卷容器来迁移数据
利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
- 备份
使用下面的命令来备份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
。
- 恢复
要恢复数据到一个容器,首先创建一个带有数据卷的容器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 网络的高级功能和配置。