Docker 1.13
在 2017 年 1 月 18 日发布了。从 2016 年 7 月 29 日发布 1.12
发布以来,已经过去 5 个多月了,对于活跃的 Docker 社区来说,已经很久了,让我们看看都 1.13
都新增了什么内容吧。
1.13
有一千四百多个 issue/pull request,五千多个 commits,是 Docker 历史上最高的发布版本。这并不是一个简单的小版本变化,里面有大量的更新。
在发布之后,可以直接安装最新版本。在一个新的 Ubuntu / CentOS 系统中直接执行:
1
|
curl
-
fsSL
https
:
//get.docker.com/ | sh -s -- --mirror AzureChinaCloud
|
docker stack
docker plugin
secret
管理服务:docker secret
docker system
命令docker-compose.yml
进行服务部署docker service
滚动升级出故障后回滚的功能docker service update --force
docker service create
映射宿主端口,而不是边界负载均衡网络端口docker run
连入指定的 swarm mode 的 overlay
网络GFW
墙掉 docker-engine
apt
/yum
源的问题让我们来详细解读一下 1.13.0
新增功能 吧。
https://github.com/docker/docker/pull/26839
我们都知道使用 Dockerfile
构建镜像的时候,会充分利用分层存储的特性进行缓存,之前构建过的层,如果没有变化,那么会直接使用缓存的内容,避免没有意义的重复构建。不过使用缓存的前提条件是曾经在本地构建过这个镜像。这在 CI 进行集群构建时是一个比较麻烦的问题,因为构建任务可能会被分配到不同的机器上,而该机器没有构建过该镜像,因此缓存总是用不上,因此大量的时间浪费在了重复构建已经构建过的层上了。
在 1.13
中,为 docker build
增加了一个新的参数 --cache-from
,利用镜像中的 History 来判断该层是否和之前的镜像一致,从而避免重复构建。
比如我们先下载获取作为缓存的镜像:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$
docker
pull
mongo
:
3.2
3.2
:
Pulling
from
library
/
mongo
386a066cd84a
:
Pull
complete
524267bc200a
:
Pull
complete
476d61c7c43a
:
Pull
complete
0750d0e28b90
:
Pull
complete
4bedd83d0855
:
Pull
complete
b3b5d21a0eda
:
Pull
complete
7354b6c26240
:
Pull
complete
db792d386b51
:
Pull
complete
a867bd77950c
:
Pull
complete
Digest
:
sha256
:
532a19da83ee0e4e2a2ec6bc4212fc4af26357c040675d5c2629a4e4c4563cef
Status
:
Downloaded
newer
image
for
mongo
:
3.2
|
然后我们使用更新后的 Dockerfile
构建镜像时,如果加上 --cache-from mongo:3.2
后,会发现如果是已经在mongo:3.2
中存在并没有修改的层,就会用 mongo:3.2
中的该层做缓存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$
docker
build
--
cache
-
from
mongo
:
3.2
-
t
mongo
:
3.2.1
.
Sending
build
context
to
Docker
daemon
4.608
kB
Step
1
/
18
:
FROM
debian
:
jessie
--
-
&
gt
;
73e72bf822ca
Step
2
/
18
:
RUN
groupadd
-
r
mongodb
&
amp
;
&
amp
;
useradd
-
r
-
g
mongodb
mongodb
--
-
&
gt
;
Using
cache
--
-
&
gt
;
0f6297900a5e
Step
3
/
18
:
RUN
apt
-
get
update
&
amp
;
&
amp
;
apt
-
get
install
-
y
--
no
-
install
-
recommends
numactl
&
amp
;
&
amp
;
rm
-
rf
/
var
/
lib
/
apt
/
lists
/
*
--
-
&
gt
;
Using
cache
--
-
&
gt
;
a465f2e906fc
Step
4
/
18
:
ENV
GOSU
_VERSION
1.7
--
-
&
gt
;
Using
cache
--
-
&
gt
;
d448ddca2126
.
.
.
|
squash
)镜像(实验阶段)https://github.com/docker/docker/pull/22641
对于总是把 Dockerfile
当做 bash
文件来用的人,会发现很快由于太多的 RUN
导致镜像有特别多的层,镜像超级臃肿,而且甚至会碰到超出最大层数限制的问题。这些人往往不从自身找问题,反而去寻找旁门左道,比如导出镜像做一些特殊处理,合并为一层,然后再导入等等,这种做法是很错误的,除了导致构建缓存失败外,还导致docker history
丢失,导致镜像变为黑箱镜像。其实正确的做法是遵循 Dockerfile
最佳实践,应该把多个命令合并为一个 RUN
,每一个 RUN
要精心设计,确保安装构建最后进行清理。这样才可以降低镜像体积,以及最大化的利用构建缓存。
在 Docker 1.13 中,为了应对这群用户,实验性的提供了一个 --squash
参数给 docker build
,其功能就是如上所说,将 Dockerfile
中所有的操作,压缩为一层。不过,与旁门左道不同,它保留了 docker history
。
比如如下的 Dockerfile
:
1
2
3
4
5
6
|
FROM
busybox
RUN
echo
hello
&
gt
;
/
hello
RUN
echo
world
&
gt
;
&
gt
;
/
hello
RUN
touch
remove_me
/
remove_me
ENV
HELLO
world
RUN
rm
/
remove_me
|
如果我们正常的构建的话,比如 docker build -t my-not-squash .
,其 history
是这样子的:
1
2
3
4
5
6
7
8
9
|
$
docker
history
my
-
not
-
squash
IMAGE
CREATED
CREATED
BY
SIZE
COMMENT
305297a526e2
About
a
minute
ago
/
bin
/
sh
-
c
rm
/
remove
_me
0
B
60b8e896d443
About
a
minute
ago
/
bin
/
sh
-
c
#(nop) ENV HELLO=world 0 B
a21f3c75b6b0
About
a
minute
ago
/
bin
/
sh
-
c
touch
remove_me
/
remove
_me
0
B
038bca5b58cb
About
a
minute
ago
/
bin
/
sh
-
c
echo
world
&
gt
;
&
gt
;
/
hello
12
B
f81b1006f556
About
a
minute
ago
/
bin
/
sh
-
c
echo
hello
&
gt
;
/
hello
6
B
e02e811dd08f
5
weeks
ago
/
bin
/
sh
-
c
#(nop) CMD ["sh"] 0 B
&
lt
;
missing
&
gt
;
5
weeks
ago
/
bin
/
sh
-
c
#(nop) ADD file:ced3aa7577c8f97... 1.09 MB
|
而如果我们用 --squash
构建:
1
|
docker
build
-
t
mysquash
--
squash
.
|
其 history
则是这样子:
1
2
3
4
5
6
7
8
9
10
|
$
docker
history
mysquash
IMAGE
CREATED
CREATED
BY
SIZE
COMMENT
a557e397ff56
15
seconds
ago
12
B
merge
sha256
:
305297a526e218e77f1b4b273442f8ac6283e2907e6513ff36e9048aa130dea6
to
sha256
:
e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba
&
lt
;
missing
&
gt
;
15
seconds
ago
/
bin
/
sh
-
c
rm
/
remove
_me
0
B
&
lt
;
missing
&
gt
;
15
seconds
ago
/
bin
/
sh
-
c
#(nop) ENV HELLO=world 0 B
&
lt
;
missing
&
gt
;
15
seconds
ago
/
bin
/
sh
-
c
touch
remove_me
/
remove
_me
0
B
&
lt
;
missing
&
gt
;
16
seconds
ago
/
bin
/
sh
-
c
echo
world
&
gt
;
&
gt
;
/
hello
0
B
&
lt
;
missing
&
gt
;
16
seconds
ago
/
bin
/
sh
-
c
echo
hello
&
gt
;
/
hello
0
B
&
lt
;
missing
&
gt
;
5
weeks
ago
/
bin
/
sh
-
c
#(nop) CMD ["sh"] 0 B
&
lt
;
missing
&
gt
;
5
weeks
ago
/
bin
/
sh
-
c
#(nop) ADD file:ced3aa7577c8f97... 1.09 MB
|
我们可以注意到,所有层的层ID都
了,并且多了一层 merge
。
要注意,这并不是解决懒惰的办法,撰写 Dockerfile 的时候,依旧需要遵循最佳实践,不要试图用这种办法去压缩镜像。
--network
指定网络https://github.com/docker/docker/pull/27702 https://github.com/docker/docker/issues/10324
在一些网络环境中,我们可能需要定制 /etc/hosts
文件来提供特定的主机和 IP 地址映射关系,无论是应对 GFW,还是公司内部 Git 服务器,都有可能有这种需求,这个时候构建时修改 /etc/hosts
是一个比较麻烦的事情。使用内部 DNS 虽然是一种解决办法,但是这将是全引擎范围的,而且并非所有环境都会有内部 DNS。更好地做法是使用宿主网络进行构建。另外,有的时候,或许这个构建所需 Git 服务器位于容器内网络,我们需要指定某个 overlay
网络来给镜像构建所需。
在 1.13
中,为 docker build
提供了 --network
参数,可以指定构建时的网络。
比如,我们有一个 Dockerfile
内容为:
1
2
|
FROM
ubuntu
RUN
cat
/
etc
/
hosts
|
内容很简单,就是看看构建时的 /etc/hosts
的内容是什么。假设我们宿主的 /etc/hosts
中包含了一条 1.2.3.4
到example.com
的映射关系。
1
|
1.2.3.4
example
.
com
|
如果我们如同以往,使用默认网络进行构建。那么结果会是这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$
docker
build
--
no
-
cache
-
t
build
-
network
.
Sending
build
context
to
Docker
daemon
2.048
kB
Step
1
/
2
:
FROM
ubuntu
--
-
&
gt
;
104bec311bcd
Step
2
/
2
:
RUN
cat
/
etc
/
hosts
--
-
&
gt
;
Running
in
42f0c014500f
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
2866979c4d77
--
-
&
gt
;
5f0b3dd56a32
Removing
intermediate
container
42f0c014500f
Successfully
built
5f0b3dd56a32
|
可以注意到,这次构建所看到的是容器默认网络的 /etc/hosts
,其内没有宿主上添加的条目 1.2.3.4 example.com
。
然后我们使用 docker build --network=host
来使用宿主网络构建:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$
docker
build
--
no
-
cache
-
t
build
-
network
--
network
=
host
.
Sending
build
context
to
Docker
daemon
2.048
kB
Step
1
/
2
:
FROM
ubuntu
--
-
&
gt
;
104bec311bcd
Step
2
/
2
:
RUN
cat
/
etc
/
hosts
--
-
&
gt
;
Running
in
b990c4e55424
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
# /etc/cloud/cloud.cfg or cloud-config from user-data
#
127.0.1.1
d1
.
localdomain
d1
127.0.0.1
localhost
# The following lines are desirable for IPv6 capable hosts
::
1
ip6
-
localhost
ip6
-
loopback
fe00
::
0
ip6
-
localnet
ff00
::
0
ip6
-
mcastprefix
ff02
::
1
ip6
-
allnodes
ff02
::
2
ip6
-
allrouters
ff02
::
3
ip6
-
allhosts
1.2.3.4
example
.
com
--
-
&
gt
;
63ef6cb93316
Removing
intermediate
container
b990c4e55424
Successfully
built
63ef6cb93316
|
这次由于使用了 --network=host
参数,于是使用的是宿主的网络命名空间,因此 /etc/hosts
也是宿主的内容。我们可以在其中看到 1.2.3.4 example.com
条目。
docker build
中定义 Dockerfile
未使用的参数(ARG)https://github.com/docker/docker/pull/27412
我们都知道镜像构建时可以用 --build-arg
来定义参数,这样 Dockerfile
就会使用这个参数的值来进行构建。这对于 CI/CD 系统很重要,我们可以使用一套 Dockerfile
来构建不同条件下的镜像。
但在 1.13
以前,这里有个问题,在 CI 系统中,我们有时希望用一套构建命令、脚本,通过给入不同的 Dockerfile
来构建不同的镜像,而 --build-arg
的目的是定义一些有可能会用到的全局变量,但是如果有的 Dockerfile
中没用这个变量,那么构建就会失败。#26249
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$
cat
Dockerfile
FROM
ubuntu
RUN
env
$
docker
build
-
t
myapp
--
build
-
arg
VERSION
=
1.2.3
--
no
-
cache
.
Sending
build
context
to
Docker
daemon
2.048
kB
Step
1
:
FROM
ubuntu
--
-
&
gt
;
104bec311bcd
Step
2
:
RUN
env
--
-
&
gt
;
Running
in
81f4ba452a49
HOSTNAME
=
2866979c4d77
HOME
=
/
root
PATH
=
/
usr
/
local
/
sbin
:
/
usr
/
local
/
bin
:
/
usr
/
sbin
:
/
usr
/
bin
:
/
sbin
:
/
bin
PWD
=
/
--
-
&
gt
;
f78b4696a1ca
Removing
intermediate
container
81f4ba452a49
One
or
more
build
-
args
[
VERSION
]
were
not
consumed
,
failing
build
.
|
其背后的思想是,如果 --build-arg
指定了,但是没用,那么很可能是因为拼写错误、或者忘记了应该使用这个变量而出现的问题。最初 docker build
对于这类情况的处理,是直接报错退出,构建失败。
但是在上面的 CI 的案例中,--build-arg
只是定义一些可能用到的环境变量,并不强制使用,这种情况下,如果因为Dockerfile
没有使用可能用到的变量就报错就有些过了。因此在 1.13
中,将其降为警告,并不终止构建,只是提醒用户有些变量未使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$
docker
build
--
no
-
cache
-
t
myapp
--
build
-
arg
VERSION
=
1.2.3
.
Sending
build
context
to
Docker
daemon
2.048
kB
Step
1
/
2
:
FROM
ubuntu
--
-
&
gt
;
104bec311bcd
Step
2
/
2
:
RUN
env
--
-
&
gt
;
Running
in
bb5e605cb4d0
HOSTNAME
=
2866979c4d77
HOME
=
/
root
PATH
=
/
usr
/
local
/
sbin
:
/
usr
/
local
/
bin
:
/
usr
/
sbin
:
/
usr
/
bin
:
/
sbin
:
/
bin
PWD
=
/
--
-
&
gt
;
97207d784048
Removing
intermediate
container
bb5e605cb4d0
[
Warning
]
One
or
more
build
-
args
[
VERSION
]
were
not
consumed
Successfully
built
97207d784048
|
GFW
影响 Docker
安装问题https://github.com/docker/docker/pull/27005
官方的 apt
/yum
源使用的是 AWS
的服务,并且为了确保安全使用了 HTTPS
,因此伟大的墙很乐于干扰大家使用。没办法的情况下,各个云服务商纷纷建立自己官方源镜像,阿里云、DaoCloud、Azura 等等,并且自己做了个修订版的https://get.docker.com
的脚本来进行安装。
现在这个发生改变了,官方的 https://get.docker.com
将支持 --mirror
参数,你可以用这个参数指定国内镜像源,目前支持微软的 Azure 云,(或阿里云?(更新:由于阿里云镜像源不支持 HTTPS,所以不会支持阿里云))。使用方法如下,将原来官网安装命令:
1
|
curl
-
sSL
https
:
//get.docker.com/ | sh
|
替换为:
1
|
curl
-
sSL
https
:
//get.docker.com/ | sh -s -- --mirror AzureChinaCloud
|
在这次发布中,增加了 Ubuntu 16.10
的安装包,而且对 Ubuntu
系统增加了 PPC64LE
和 s390x
构架的安装包。此外,还正式支持了 VMWare Photon OS
系统的 RPM
安装包,以及在 https://get.docker.com
的支持。并且支持了Fedora 25
,甚至开始支持 arm64
。同时也由于一些系统生命周期的结束,而被移除支持,比如Ubuntu 15.10
、Fedora 22
都不在支持了。
docker run
连入指定的 swarm mode
的网络https://github.com/docker/docker/pull/25962
在 Docker 1.12 发布新的 Swarm Mode 之后,很多人都问过这样的问题,怎么才能让 docker run
的容器连入 Swarm Mode 服务的 overlay
网络中去?答案是不可以,因为 swarm
的 overlay
网络是为了 swarm mode service
准备的,相对更健壮,而直接使用 docker run
,会破坏了这里面的安全模型。
但是由于大家需求很多,于是提供了一种折衷的办法。1.13 允许建立网络的时候,设定该网络为 attachable
,允许之后的 docker run
的容器连接到该网络上。
我们创建一个默认的、不允许之后 attach
的网络:
1
2
|
$
docker
network
create
-
d
overlay
mynet1
xmgoco2vfrtp0ggc5r0p5z4mg
|
然后再创建一个允许 attach
的网络,这里会使用 1.13 新加入的 --attachable
参数:
1
2
|
$
docker
network
create
-
d
overlay
--
attachable
mynet2
yvcyhoc6ni0436jux9azc4cjt
|
然后我们启动一个 web
服务,连入这两个网络:
1
2
3
4
5
6
|
$
docker
service
create
\
--
name
web
\
--
network
mynet1
\
--
network
mynet2
\
nginx
vv91wd7166y80lbl833rugl2z
|
现在我们用 docker run
启动一个容器连入第一个网络:
1
2
|
$
docker
run
-
it
--
rm
--
network
mynet1
busybox
docker
:
Error
response
from
daemon
:
Could
not
attach
to
network
mynet1
:
rpc
error
:
code
=
7
desc
=
network
mynet1
not
manually
attachable
.
|
由于 mynet1
不允许手动 attach
所以这里报错了。
在 1.12 的情况下,会报告该网络无法给 docker run
使用:
1
2
|
docker
:
Error
response
from
daemon
:
swarm
-
scoped
network
(
mynet1
)
is
not
compatible
with
`
docker
create
`
or
`
docker
run
`
.
This
network
can
only
be
used
by
a
docker
service
.
See
'docker run --help'
.
|
不过,--attachable
实际上是将网络的安全模型打开了一个缺口,因此这不是默认设置,而且并不推荐使用。用户在使用这个选项建立网络的时候,一定要知道自己在做什么。
docker service create
映射宿主端口,而不是边界负载均衡网络端口https://github.com/docker/docker/pull/27917 https://github.com/docker/docker/pull/28943
docker service create
中的 --publish
格式有进一步的变化。(在 1.13 的 RC 期间,曾经去掉 --publish
,改为--port
,经过讨论后,决定保持一致性,继续使用 --publish
,不使用新的 --port
选项。)
在 1.12 中,docker service create
允许使用参数 --publish 80:80
这类形式映射边界(ingress)网络的端口,这样的映射会享受边界负载均衡,以及 routing mesh。
从 1.13 开始,增加另一种映射模式,被称为 host
模式,也就是说,用这种模式映射的端口,只会映射于容器所运行的主机上。这就和一代 Swarm 中一样了。虽然失去了边界负载均衡,但是确定了映射点,在有的时候这种情况是需要的。
现在 --publish
的新的参数形式和 --mount
差不多。参数值为 ,
逗号分隔的键值对,键值间以 =
等号分隔。目前支持 4 项内容:
protocol
: 支持 tcp
或者 udp
mode
: 支持 ingress
或者 host
target
: 容器的端口号published
: 映射到宿主的端口号 比如,与 -p 8080:80
等效的 --publish
新格式选项为:
1
|
--
publish
protocol
=
tcp
,
mode
=
ingress
,
published
=
8080
,
target
=
80
|
当然我们可以继续使用 -p 8080:80
,但是新的选项格式增加了更多的可能。比如,使用 1.13 开始加入的 host
映射模式:
1
2
3
|
ubuntu
@
d1
:
~
$
docker
service
create
--
name
web
\
--
publish
mode
=
host
,
published
=
80
,
target
=
80
\
nginx
|
运行成功后,查看一下服务容器运行的节点:
1
2
3
4
5
6
7
8
|
ubuntu
@
d1
:
~
$
docker
node
ls
ID
HOSTNAME
STATUS
AVAILABILITY
MANAGER
STATUS
ntjybj51u6zp44akeawuf3i05
d2
Ready
Active
tp7icvjzvxla2n18j3nztgjz6
d3
Ready
Active
vyf3mgcj3uonrnh5xxquasp38 *
d1
Ready
Active
Leader
ubuntu
@
d1
:
~
$
docker
service
ps
web
ID
NAME
IMAGE
NODE
DESIRED
STATE
CURRENT
STATE
ERROR
PORTS
5tij5sjvfpsf
web
.
1
nginx
:
latest
d3
Running
Running
5
minutes
ago *
:
80
-
&
gt
;
80
/
tcp
|
我们可以看到,集群有3个节点,而服务就一个副本,跑到了 d3
上。如果这是以前的使用边界负载均衡的网络 ingress
的话,那么我们访问任意节点的 80
端口都会看到页面。
但是,host
模式不同,它只映射容器所在宿主的端口。因此,如果我们 curl d1
的话,应该什么看不到网页,而curl d3
的话就会看到页面:
1
2
|
root
@
d1
:
~
$
curl
localhost
curl
:
(
7
)
Failed
to
connect
to
localhost
port
80
:
Connection
refused
|
1
2
3
4
5
6
|
root
@
d3
:
~
$
curl
localhost
&
lt
;
!
DOCTYPE
html
&
gt
;
&
lt
;
html
&
gt
;
&
lt
;
head
&
gt
;
&
lt
;
title
&
gt
;
Welcome
to
nginx
!
&
lt
;
/
title
&
gt
;
.
.
.
|
iptables
的转发规则将默认拒绝https://github.com/docker/docker/pull/28257
从默认 FORWARD
改为 DROP
,从而避免容器外露的安全问题。
docker network inspect
里显示连入的节点我们都是知道,在 swarm mode
中创建的 overlay
网络,并不是一下子就在集群中的每个节点上 docker network ls
就可以看到这个网络,这完全没有必要。只有当使用该网络的容器调度到某个节点上后,才会将该节点连入此 overlay
网络。在网络排障过程中,经常会有这种需求,需要得知现在连入该 overlay
网络中的节点到底有哪些,这在 1.13
之前不容易做到。
从 1.13
开始,docker network inspect
将显示连接到了这个网络的节点(宿主)有哪些。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
$
docker
network
inspect
mynet
[
{
"Name"
:
"mynet"
,
"Id"
:
"jjpnbdh8vu4onjojskntd2jhh"
,
"Created"
:
"2017-01-18T00:00:31.742146058Z"
,
"Scope"
:
"swarm"
,
"Driver"
:
"overlay"
,
"EnableIPv6"
:
false
,
"IPAM"
:
{
"Driver"
:
"default"
,
"Options"
:
null
,
"Config"
:
[
{
"Subnet"
:
"10.0.0.0/24"
,
"Gateway"
:
"10.0.0.1"
}
]
}
,
"Internal"
:
false
,
"Attachable"
:
false
,
"Containers"
:
{
"3cafea27c53de34724e46d4fe83c9e60311b628b82e9be66d8d2e0812669d575"
:
{
"Name"
:
"myapp.2.qz2hs1eqq3ikx59ydh0w7u1g4"
,
"EndpointID"
:
"0e26b08254e851b7b238215cec07acdd8b0b68dc4671f55235e203a0c260522f"
,
"MacAddress"
:
"02:42:0a:00:00:04"
,
"IPv4Address"
:
"10.0.0.4/24"
,
"IPv6Address"
:
""
}
}
,
"Options"
:
{
"com.docker.network.driver.overlay.vxlanid_list"
:
"4097"
}
,
"Labels"
:
{
}
,
"Peers"
:
[
{
"Name"
:
"d1-23348b84b134"
,
"IP"
:
"138.197.213.116"
}
,
{
"Name"
:
"d2-8964dea9e75c"
,
"IP"
:
"138.197.221.47"
}
]
}
]
|
从上面的例子可以看出,一共有两个宿主连入了这个 mynet
的 overlay
网络,分别为 138.197.213.116
和138.197.221.47
。
service
VIP
可以被 ping
https://github.com/docker/docker/pull/28019
在 1.12 的二代 Swarm 排障过程中,常见的一个问题就是跨节点的服务 VIP 不可以 ping
,所以很多时候很多时候搞不懂是 overlay
网络不通呢?还是服务没起来?还是服务发现有问题?这个问题在 1.13 解决了,VIP 可以随便ping
,跨宿主也没关系。
https://github.com/docker/docker/pull/28226
在 1.12 引入了插件概念后,作为试验特性得到了很多关注。包括 Docker Store 开始准备上线,以及第三方的插件的开发。现在 1.13 插件作为正式功能提供了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$
docker
plugin
Usage
:
docker
plugin
COMMAND
Manage
plugins
Options
:
--
help
Print
usage
Commands
:
create
Create
a
plugin
|