Docker命令行参考(37) – docker service create创建一个服务

  1. Usage:  docker service create [OPTIONS] IMAGE [COMMAND] [ARG…]
  2.  
  3. Create a new service
  4.  
  5. Options:
  6.       –constraint value               Placement constraints (default [])
  7.       –container-label value          Service container labels (default [])
  8.       –endpoint-mode string           Endpoint mode (vip or dnsrr)
  9.   -e, –env value                      Set environment variables (default [])
  10.       –help                           Print usage
  11.   -l, –label value                    Service labels (default [])
  12.       –limit-cpu value                Limit CPUs (default 0.000)
  13.       –limit-memory value             Limit Memory (default 0 B)
  14.       –log-driver string              Logging driver for service
  15.       –log-opt value                  Logging driver options (default [])
  16.       –mode string                    Service mode (replicated or global) (default "replicated")
  17.       –mount value                    Attach a mount to the service
  18.       –name string                    Service name
  19.       –network value                  Network attachments (default [])
  20.   -p, –publish value                  Publish a port as a node port (default [])
  21.       –replicas value                 Number of tasks (default none)
  22.       –reserve-cpu value              Reserve CPUs (default 0.000)
  23.       –reserve-memory value           Reserve Memory (default 0 B)
  24.       –restart-condition string       Restart when condition is met (none, on-failure, or any)
  25.       –restart-delay value            Delay between restart attempts (default none)
  26.       –restart-max-attempts value     Maximum number of restarts before giving up (default none)
  27.       –restart-window value           Window used to evaluate the restart policy (default none)
  28.       –stop-grace-period value        Time to wait before force killing a container (default none)
  29.       –update-delay duration          Delay between updates
  30.       –update-failure-action string   Action on update failure (pause|continue) (default "pause")
  31.       –update-parallelism uint        Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
  32.   -u, –user string                    Username or UID
  33.       –with-registry-auth             Send registry authentication details to Swarm agents
  34.   -w, –workdir string                 Working directory inside the container

按指定参数所述创建服务。这个命令必须运行在manager节点上。

示例

创建一个服务

  1. $ docker service create –name redis redis:3.0.6
  2. dmu1ept4cxcfe8k8lhtux3ro3
  3.  
  4. $ docker service ls
  5. ID            NAME   REPLICAS  IMAGE        COMMAND
  6. dmu1ept4cxcf  redis  1/1       redis:3.0.6

创建一个5个副本任务的服务(–replicas)

使用–replicas参数设置副本服务的副本任务数。下面的命令创建一个5个副本任务的redis服务:

  1. $ docker service create –name redis –replicas=5 redis:3.0.6
  2. 4cdgfyky7ozwh3htjfw0d12qv

上面的命令设置了服务期望的任务数。虽然命令立即返回了,实际上完成服务部署需要一定的时间。REPLICAS列显示了实际上部署的和期望部署的副本任务数。

下面的示例中期望的副本数是5,不过副本运行的任务数是3:

  1. $ docker service ls
  2. ID            NAME    REPLICAS  IMAGE        COMMAND
  3. 4cdgfyky7ozw  redis   3/5       redis:3.0.7

一旦创建了所有的任务且为RUNNING状态,任务的实际数量就等于期望的数量:

  1. $ docker service ls
  2. ID            NAME    REPLICAS  IMAGE        COMMAND
  3. 4cdgfyky7ozw  redis   5/5       redis:3.0.7

指定滚动更新策略创建一个服务

  1. $ docker service create
  2.   –replicas 10
  3.   –name redis
  4.   –update-delay 10s
  5.   –update-parallelism 2
  6.   redis:3.0.6

当执行上面的service update命令时,调度器同时更新最大2个任务,间隔更新时间为10s。

设置环境变量(-e,–env)

为在一个服务中的所有任务设置环境变量。例如:

  1. $ docker service create –name redis_2 –replicas 5 –env MYVAR=foo redis:3.0.6

设置服务的metadata(-l,–label)

一个label是key=value键值对应用到服务的元数据。要为服务设置两个labels,执行:

  1. $ docker service create
  2.   –name redis_2
  3.   –label com.example.foo="bar"
  4.   –label bar=baz
  5.   redis:3.0.6

添加bind-mounts或volumes

docker支持两种不同的挂载,允许容器从其他容器或主机操作系统上的文件或目录读取或写入。这些类型是data volumes和bind-mounts。

bind-mount容器可以直接操作主机上的文件。bind-mount可以是只读或读写。例如,一个容器可能通过绑定挂载主机的/etc/resolv.conf来共享主机的DNS信息或一个容器可能写入日志到主机的/var/log/myContainerLogs目录。如果使用了bind-mounts且你的主机与容器有不同的权限概念,访问控制或其它这样的信息,你可能会遇到可移植性的问题。

一个命名数据卷是从用于创建容器的镜像和主机分离出容器所需的持久化数据的一个机制。命名数据卷由docker创建和管理,即使当没有容器使用它时,一个命名数据卷仍然会存在。在命名数据卷的数据可以在容器和主机之间共享,也可以在多个容器之间共享。docker使用一个数据卷驱动来创建,管理和挂载数据卷。可以使用docker的相关命令备份或恢复数据卷。

考虑这样一个情景,你有一个镜像是用来启动一个轻量级的web server的,然后你用这个镜像作为base镜像,把网站的HTML文件复制到这个镜像。每个网站有更新时,你需要更新这个镜像并重新部署容器。一个更好的解决方案是把网站存储到一个命名数据卷中,当容器启动时这个数据卷就会附着到你的web server。要更新这个网站,只需要更新命名数据卷。

下面的表格是应用到bind-mounts和named volumes的选项:

选项 必要 描述
type mount的类型,可以是volume或bind。如果不指定type,默认是volume。

  • volume: 挂载一个数据卷到容器中。
  • bind: 从主机绑定挂载一个目录或文件到容器中。
  • src或source 用在当type=bind时
  • type=volume: src是指定数据卷名称的可选的一种方式(例如,src=my-volume)。如果命名数据卷不存在,则docker会自动创建它。如果没有指定src,则分配一个随机的名称给数据卷,并保证这个名称在主机上是唯一的,不过可能在集群范围不是唯一的。一个随机命名数据卷与容器有相同的生命周期,当容器被销毁时此数据卷也将销毁(销毁取决于service update或当scaling或重新负载均衡服务时)。
  • type=bind: src是必须的,并需要指定文件或目录的绝对路径(例如src=/path/on/host/)。如果文件或目录不存在将会报错。
  • dst 或 destination 或 target 容器内挂载的路径。例如/some/path/in/container/。如果在容器文件系统不存在这个路径,engine将在挂载数据卷或绑定挂载之前先创建这个目录。
    readonly 或 ro Engine挂载绑定和数据卷默认是读写的,除非设置了readonly选项。

  • true或1或no:挂载绑定或数据卷只读。
  • false或0: 挂载绑定或数据卷读写。
  • 绑定传播(Bind Propagation)

    绑定传播指的是在给定的绑定挂载或命名数据卷内创建的挂载是否可以传播到那个挂载的副本。如一个挂载点/mnt,也挂载到/tmp上。传播设置控制在/tmp/a的挂载是否也挂载到/mnt/a。每个传播设置具有递归对应点。在递归情况下,假设/tmp/a也挂载为/foo。传播设置控制/mnt/a和/或/tmp/a是否存在。

    bind-mounts和volume mounts的bind-propagation选项的默认值为rprivate,并只能对bind-mounts可设置。换句话说,命名数据卷不支持绑定传播。

  • shared: 原始挂载的子挂载暴露给副本挂载,副本挂载的子挂载也传播到原始挂载。
  • slave:与shared挂载类似,不过只有一个方向。如果原始挂载暴露一个子挂载,副本挂载可以看到。不过,如果副本挂载暴露一个子挂载,原始挂载无法看到。
  • private:挂载是私有的。在它之内的子挂载不暴露给副本挂载,且副本挂载的子挂载不暴露给原始挂载。
  • rshared:与shared一样,但传播也扩展到嵌套在任何原始或复制挂载点内的挂载点。
  • rslave:与slave相同,但是传播也延伸到嵌套在任何原始或复制挂载点内的挂载点。
  • rprivate:默认值。与private相同,意味着原始或复制挂载点内任何地方的任何挂载点都不会在任一方向传播。
  • 更多信息请查看sharedsubtree

    命名数据卷选项

    下面的选项只能用于命名数据卷(type=volume)。

    选项 描述
    volume-driver 数据卷所使用的数据卷驱动插件名称。默认为local,使用local数据卷驱动时当数据卷不存在时会自动创建。
    volume-label 创建数据卷时应用给它的一个或多个自定义元数据(“labels”)。例如,volume-label=mylabel=hello-world,my-other-label=hello-mars。
    volume-nocopy 默认下,如果附着一个空的数据卷到一个容器,在容器的挂载路径已经存在的文件或目录,Engine将复制这些文件和目录到数据卷中。设置vloume-nocopy将禁止从容器的文件系统复制文件到挂载的空数据卷。
    值是可选的:

  • true或1: 这是默认值。禁止复制。
  • false或0: 启用复制。
  • volume-opt 给定数据卷驱动的特定选项,当创建数据卷时将传递给驱动。选项格式为以逗号分隔的键/值对列表,例如volume-opt=some-option=some-value,some-other-option=some-other-value。

    “–mount”和”–volume”的异同

    –mount选项支持docker run的-v或–volume的大多数选项。除了一些重要的例外:

  • –mount标志可以为每一个数据卷指定一个数据卷驱动及其选项,而不需要提供创建好数据卷。相比之一,docker run使用–volume-driver指定一个用于所有数据卷的数据卷驱动。
  • –mount标志允许你在数据卷创建前为数据卷指定自定义的元数据(“labels”)
  • 当–mount和type=bind一起使用时,host-path必须对应到一个主机上存在的路径。不会为你自动创建路径且当路径不存在时服务创建将失败。
  • –mount标志不允许使用Z或z重新label数据卷,因为这个已经用于selinux了。
  • 使用一个命名数据卷创建服务

    下面的示例使用一个命名数据卷来创建服务:

    1. $ docker service create
    2.   –name my-service
    3.   –replicas 3
    4.   –mount type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"
    5.   nginx:alpine

    对于服务的每一个副本,engine从部署任务上的默认的”local”数据卷驱动请求一个名称为”my-volume”的数据卷。如果数据卷不存在,engine就创建一个新的并应用”color”和”shape” labels。

    当任务启动后,数据卷挂载到容器内的/path/in/container。

    要注意那个默认的”local”数据卷是本地范围的数据卷驱动。意思是使用哪里的驱动取决于任务部署的位置。如果运行在容器内的软件没有设计为写入数据到相同位置的并发进程,那么多个容器同时写入单个共享数据卷可能会损坏数据。同时也要考虑容器可能会被swarm编排器重新调度并部署到一个不同的节点。

    使用匿名数据卷创建服务

    下面的命令使用一个挂载到/path/in/container的匿名数据卷创建一个3个副本的服务:

    1. $ docker service create
    2.   –name my-service
    3.   –replicas 3
    4.   –mount type=volume,destination=/path/in/container
    5.   nginx:alpine

    在这个示例中,没有为数据卷指定[source],所以每个任务将创建一个新的数据卷。这保证了每个任务能得到它自己的数据卷且不会与其它任务共享数据卷。当任务被删除时,匿名数据卷同样将被删除。

    使用绑定挂载(bind-mounted)主机目录创建服务

    下面的示例在容器内的/path/in/container绑定挂载主机的目录/path/on/host:

    1. $ docker service create
    2.   –name my-service
    3.   –mount type=bind,source=/path/on/host,destination=/path/in/container
    4.   nginx:alpine

    设置服务模式

    服务模式决定着这是副本服务还是全局服务。一个副本服务指定数量的任务,而全局服务在集群中的每个活跃节点都运行任务。
    下面的命令创建了一个全局服务:

    1. $ docker service create
    2.  –name redis_2
    3.  –mode global
    4.  redis:3.0.6

    指定服务约束(–constraint)

    可以通过定义约束表达式来限制可用于任务调度的节点。多个约束查找节点时,需要满足每个表达式(AND匹配)。 约束可以匹配节点或docker engine的labels,如下:

    节点属性 匹配 示例
    node.id 节点ID node.id == 2ivku8v2gvtg4
    node.hostname 节点主机名 node.hostname != node-2
    node.role 节点角色:manager node.role == manager
    node.labels 用户定义节点labels node.labels.security == high
    engine.labels Docker Engine的labels engine.labels.operatingsystem == ubuntu 14.04

    engine.labels匹配docker engine的lables,如操作系统,驱动等。集群管理员通过使用docker node update命令来添加node.labels以更好使用节点。

    例如,下面的示例限制redis服务的任务只能部署到那么节点的label type等于queue的节点:

    1. $ docker service create
    2.   –name redis_2
    3.   –constraint ‘node.labels.type == queue’
    4.   redis:3.0.6

    添加一个服务到一个现有的网络(–network)

    可以使用overlay网络在集群内连接一个或多个服务。

    首先在manager节点上执行docker network create命令创建一个overlay网络:

    1. $ docker network create –driver overlay my-network
    2.  
    3. etjpu59cykrptrgw0z0hk5snf

    当在swarm模式中创建了一个overlay网络,那么所有的manager节点都已经在这个网络中的。

    当创建一个服务然后传递–network参数来添加服务到这个overlay网络:

    1. $ docker service create
    2.   –replicas 3
    3.   –network my-network
    4.   –name my-web
    5.   nginx
    6.  
    7. 716thylsndqma81j6kkkb5aus

    swarm则扩展my-network到运行着这个服务的每一个节点。

    发布服务端口到集群外部(-p,–publish)

    可以使用–publish参数来把服务端口发布到集群外部:

    1. $ docker service create –publish <TARGET-PORT>:<SERVICE-PORT> nginx

    例如:

    1. $ docker service create –name my_web –replicas 3 –publish 8080:80 nginx

    当发布一个服务端口时,集群路由网使服务在每个节点的目标端口可访问,不管这个运行中的节点是否有服务的任务。

    只发布一个TCP端口或UDP端口

    默认下,当发布一个端口时,它是一个TCP端口。可以指定发布一个UDP端口,而不是或额外的TCP端口。当发布TCP和UDP两个端口时,Docker 1.12.2或之前的版本需要为TCP端口添加前缀/tcp。否则它是可选的。

    TCP only

    下面两个命令是等同的。

    1. $ docker service create –name dns-cache -p 53:53 dns-cache
    2.  
    3. $ docker service create –name dns-cache -p 53:53/tcp dns-cache

    TCP和UDP

    1. $ docker service create –name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache

    UDP only

    1. $ docker service create –name dns-cache -p 53:53/udp dns-cache

    Docker命令行参考(36) – docker swarm join-token管理加入令牌

    1. Usage:  docker swarm join-token [–rotate] (worker|manager)
    2.  
    3. Manage join tokens
    4.  
    5. Options:
    6.       –help     Print usage
    7.   -q, –quiet    Only display token
    8.       –rotate   Rotate join token

    Join tokens是允许一个节点加入集群的密钥。有两种可用的不同的join tokens,一个是用作worker角色,另一个是用作manager角色。在执行swarm join时使用–token来传递token。节点只在它们加入集群时才使用这个token。

    使用swarm join-token可以查看或更换join token。

    为方便起见,可以传递worker或manager到join-token来打印出完整的docker swarm join命令来加入一个新的节点到集群。

    1. $ docker swarm join-token worker
    2. To add a worker to this swarm, run the following command:
    3.  
    4.     docker swarm join
    5.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx
    6.     172.17.0.2:2377
    7.  
    8. $ docker swarm join-token manager
    9. To add a manager to this swarm, run the following command:
    10.  
    11.     docker swarm join
    12.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
    13.     172.17.0.2:2377

    使用–rotate参数来为指定的角色生成一个新的join token:

    1. $ docker swarm join-token –rotate worker
    2. Succesfully rotated worker join token.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t
    8.     172.17.0.2:2377

    使用–rotate更新token之后,只能用新的token来加入集群。

    -q或–quiet参数只打印token:

    1. $ docker swarm join-token -q worker
    2.  
    3. SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t

    Docker命令行参考(35) – docker swarm leave脱离集群

    1. Usage:  docker swarm leave [OPTIONS]
    2.  
    3. Leave the swarm (workers only).
    4.  
    5. Options:
    6.       –force   Force this node to leave the swarm, ignoring warnings
    7.       –help    Print usage

    当在一个worker节点执行这个命令时,这个节点将脱离集群。
    可以在一个manager节点上使用–force选项来从集群删除它。不过,这不会重新配置集群来确保集群有足够的manager节点来维持一个法定仲裁人数。从一个集群删除一个manager节点的安全方法是把它降级为worker然后不使用–force来执行这个命令脱离集群。只在manager节点脱离集群后不再使用这个集群才使用–force选项,如单节点的集群。

    如下示例:

    1. $ docker node ls
    2. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    3. 7ln70fl22uw2dvjn2ft53m3q5    worker2   Ready   Active
    4. dkp8vy1dq1kxleu9g4u78tlag    worker1   Ready   Active
    5. dvfxp4zseq4s0rih1selh0d20 *  manager1  Ready   Active        Leader

    要删除worker2,在worker2主机上执行如下命令:

    1. $ docker swarm leave
    2. Node left the default swarm.

    Docker命令行参考(34) – docker swarm join加入一个节点到集群

    1. Usage:  docker swarm join [OPTIONS] HOST:PORT
    2.  
    3. Join a swarm as a node and/or manager
    4.  
    5. Options:
    6.       –advertise-addr value   Advertised address (format: <ip|interface>[:port])
    7.       –help                   Print usage
    8.       –listen-addr value      Listen address (format: <ip|interface>[:port)
    9.       –token string           Token for entry into the swarm

    docker swarm join用来加入一个节点到一个集群。节点加入为一个manager节点或worker节点取决于使用–token参数传递过去的token。如果传递一个manager token,这个节点以管理节点加入。如果传递一个worker token,就以worker节点加入。

    以manager身份添加节点到集群

    下面的示例演示使用manager token添加管理节点到集群。

    1. $ docker swarm join –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.121:2377
    2. This node joined a swarm as a manager.
    3. $ docker node ls
    4. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    5. dkp8vy1dq1kxleu9g4u78tlag *  manager2  Ready   Active        Reachable
    6. dvfxp4zseq4s0rih1selh0d20    manager1  Ready   Active        Leader

    一个集群应该最多只能有3-7个管理节点。不参与管理仲裁的节点应该以worker身份加入。manager节点应该是稳定的主机且有静态IP地址。

    以worker身份加入集群

    下面的示例演示使用worker token添加worker节点到集群。

    1. $ docker swarm join –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 192.168.99.121:2377
    2. This node joined a swarm as a worker.
    3. $ docker node ls
    4. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    5. 7ln70fl22uw2dvjn2ft53m3q5    worker2   Ready   Active
    6. dkp8vy1dq1kxleu9g4u78tlag    worker1   Ready   Active        Reachable
    7. dvfxp4zseq4s0rih1selh0d20 *  manager1  Ready   Active        Leader

    –listen-addr value

    如果节点为manager,在这个地址监听集群管理相关流量。默认是监听0.0.0.0:2377。也可以指定一个网络接口来监听这个接口的地址。例如–listen-addr eth0:2377。

    端口是可选的。如果仅指定IP地址或接口名称,端口就使用默认的2377。

    当加入的是一个已存在的集群时,这个参数一般不需要指定。

    –advertise-addr value

    指定通告给集群的节点的地址,这个地址用来给其它节点访问API和overlay网络通信。如果没有指定地址,docker将检查系统是否只有一个IP地址,如果是将使用这个地址并使用监听的端口(查看–listen-addr)。如果系统有多个IP地址,–advertise-addr就必须指定一个以便内部管理节点能够正常通信和overlay网络通信。

    也可以指定一个网络接口来通告接口的地址,例如–advertise-addr eth0:2377。

    端口是可选的。如果仅指定一个IP地址或接口名称,就使用端口2377。

    当加入的是一个已存在的集群时,这个参数一般不需要指定。

    –token string

    节点加入集群所需的密钥

    Docker命令行参考(33) – docker swarm init初始化集群

    1. Usage:  docker swarm init [OPTIONS]
    2.  
    3. Initialize a swarm
    4.  
    5. Options:
    6.       –advertise-addr value            Advertised address (format: <ip|interface>[:port])
    7.       –cert-expiry duration            Validity period for node certificates (default 2160h0m0s)
    8.       –dispatcher-heartbeat duration   Dispatcher heartbeat period (default 5s)
    9.       –external-ca value               Specifications of one or more certificate signing endpoints
    10.       –force-new-cluster               Force create a new cluster from current state.
    11.       –help                            Print usage
    12.       –listen-addr value               Listen address (format: <ip|interface>[:port])
    13.       –task-history-limit int          Task history retention limit (default 5)

    初始化一个集群。docker engine收到并执行这个命令所在的主机将成为新创建的单节点集群的管理节点。

    1. $ docker swarm init –advertise-addr 192.168.99.121
    2. Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx
    8.     172.17.0.2:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    docker swarm init生成两个随机的tokens,一个worker token和一个manager token。当一个节点加入到这个集群时,是worker节点还是manager节点取决于传递给swarm joing的token。

    当创建集群后,可以使用swarm join-token来显示或轮换token。

    –cert-expiry

    设置节点证书有效期

    –dispatcher-heartbeat

    设置节点报告它们的健康状态间隔的时间。

    –external-ca value

    设置集群使用一个外部CA来签发节点证书。value的格式为protocol=X,url=Y。protocol指定的是发送签名请求到外部CA所使用的协议。目前只支持cfssl。URL指定的是签名请求应该提交到哪个endpoint。

    –force-new-cluster

    强制一个失去仲裁能力的集群的其中一个节点重启成为一单节点集群,而不丢失数据。

    –listen-addr value

    在这个地址监听集群管理相关流量。默认是监听0.0.0.0:2377。也可以指定一个网络接口来监听这个接口的地址。例如–listen-addr eth0:2377。

    端口是可选的。如果仅指定IP地址或接口名称,端口就使用默认的2377。

    –advertise-addr value

    指定通告给集群的节点的地址,这个地址用来给其它节点访问API和overlay网络通信。如果没有指定地址,docker将检查系统是否只有一个IP地址,如果是将使用这个地址并使用监听的端口(查看–listen-addr)。如果系统有多个IP地址,–advertise-addr就必须指定一个以便内部管理节点能够正常通信和overlay网络通信。

    也可以指定一个网络接口来通告接口的地址,例如–advertise-addr eth0:2377。

    端口是可选的。如果仅指定一个IP地址或接口名称,就使用端口2377。

    –task-history-limit

    设置任务历史记录保留限制。

    Docker命令行参考(32) – docker volume create创建数据卷

    1. Usage:  docker volume create [OPTIONS]
    2.  
    3. Create a volume
    4.  
    5. Options:
    6.   -d, –driver string   Specify volume driver name (default "local")
    7.       –help            Print usage
    8.       –label value     Set metadata for a volume (default [])
    9.       –name string     Specify volume name
    10.   -o, –opt value       Set driver specific options (default map[])

    创建一个新的数据卷,这样容器就可以往里面存储数据了。如果–name没有指定,docker就生成一个随机的名称。创建一个数据卷之后就可以配置容器使用它了,例如:

    1. $ docker volume create –name hello
    2. hello
    3.  
    4. $ docker run -d -v hello:/world busybox ls /world

    数据卷hello挂载在容器的/world目录。docker不支持容器内的挂载点使用相对路径。

    多个容器可以在相同时间段使用相同的数据卷。如果两个容器需要访问共享数据这个功能会非常有用。例如,一个容器写入数据另一个读取这个数据。

    数据卷名称必须在所有驱动之间是唯一的。意味着在两个不同的驱动之间不能使用相同的数据卷名。如果尝试使用,docker将返回一个错误:

    1. A volume named  "hello"  already exists with the "some-other" driver. Choose a different volume name.

    驱动特定的选项

    一些数据卷驱动提供了一些选项来自定义数据卷的创建。使用-o或–opt标志传递这个驱动选项:

    1. $ docker volume create –driver fake –opt tardis=blue –opt timey=wimey

    这些选项直接传递到数据卷驱动。内置的local Linux驱动接受的选项与linux mount命令类似。通过传递多次–opt标志来提供多个选项。完整的可用的mount选项在这里

    例如,下面创建了一个tmpfs数据卷,称为foo,大小为100M,uid为1000.

    1. $ docker volume create –driver local –opt type=tmpfs –opt device=tmpfs –opt o=size=100m,uid=1000 –name foo

    使用btrfs的另一个示例:

    1. $ docker volume create –driver local –opt type=btrfs –opt device=/dev/sda2 –name foo

    使用nfs从192.168.1.1挂载到/path/to/dir,模式为rw的示例:

    1. $ docker volume create –driver local –opt type=nfs –opt o=addr=192.168.1.1,rw –opt device=:/path/to/dir –name foo

    Docker命令行参考(31) – docker network ls列出网络

    1. Usage:  docker network ls [OPTIONS]
    2.  
    3. List networks
    4.  
    5. Aliases:
    6.   ls, list
    7.  
    8. Options:
    9.   -f, –filter value   Provide filter values (i.e. ‘dangling=true’) (default [])
    10.       –help           Print usage
    11.       –no-trunc       Do not truncate the output
    12.   -q, –quiet          Only display network IDs

    列出Engine daemon知道的所有网络。这包括跨集群中多个主机的网络,例如:

    1. $ sudo docker network ls
    2.     NETWORK ID          NAME                DRIVER
    3.     7fca4eb8c647        bridge              bridge
    4.     9f904ee27bf5        none                null
    5.     cf03ee007fb4        host                host
    6.     78b03ee04fc4        multi-host          overlay

    使用–no-trunc选项显示完整的网络id:

    1. docker network ls –no-trunc
    2. NETWORK ID                                                         NAME                DRIVER
    3. 18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3   none                null
    4. c288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47   host                host
    5. 7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185   bridge              bridge
    6. 95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd   foo                 bridge
    7. 63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161   dev                 bridge

    过滤

    过滤标志(-f或–filter)格式是key=value。如果超过一个过滤,那么传递多个标志(如 –filter “foo=bar” –filter “bif=baz”)。多个过滤标志作为一个OR过滤连接。例如-f type=custom -f type=builtin返回custom和builtin网络。
    目前支持的过滤有:

  • driver
  • id (网络id)
  • label (label= 或 label==)
  • name (网络名称)
  • type (custom builtin)
  • Driver

    driver过滤器基于它们的驱动匹配网络。
    下面的示例匹配使用bridge驱动的网络:

    1. $ docker network ls –filter driver=bridge
    2. NETWORK ID          NAME                DRIVER
    3. db9db329f835        test1               bridge
    4. f6e212da9dfd        test2               bridge

    ID

    id过滤器基于完整或部分网络ID匹配网络。
    下面的示例是过滤出包含ID 63d1ff1f77b0…字符串的网络。

    1. $ docker network ls –filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161
    2. NETWORK ID          NAME                DRIVER
    3. 63d1ff1f77b0        dev                 bridge

    也可以使用ID的部分字符来匹配:

    1. $ docker network ls –filter id=95e74588f40d
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4.  
    5. $ docker network ls –filter id=95e
    6. NETWORK ID          NAME                DRIVER
    7. 95e74588f40d        foo                 bridge

    Label

    label过滤器基于label的存在或label和其值来匹配网络。
    下面的示例过滤出有一个usage label而不管它是什么值的所有网络。

    1. $ docker network ls -f "label=usage"
    2. NETWORK ID          NAME                DRIVER
    3. db9db329f835        test1               bridge
    4. f6e212da9dfd        test2               bridge

    下面过滤出存在usage label且值为prod的网络。

    1. $ docker network ls -f "label=usage=prod"
    2. NETWORK ID          NAME                DRIVER
    3. f6e212da9dfd        test2               bridge

    Name

    name过滤器基于网络名称的全部或部分匹配网络。
    下面示例过滤出网络名称包含foobar字符中的所有网络。

    1. $ docker network ls –filter name=foobar
    2. NETWORK ID          NAME                DRIVER
    3. 06e7eef0a170        foobar              bridge

    也可以指定名称的部分匹配:

    1. $ docker network ls –filter name=foo
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4. 06e7eef0a170        foobar              bridge

    Type

    type过滤器支持两个值;builtin显示预定义的网络(bridge,none,host),costom显示用户定义的网络。
    下面示例过滤出所有用户定义的网络:

    1. $ docker network ls –filter type=custom
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4. 63d1ff1f77b0        dev                 bridge

    通过这个命令可以清理网络。例如,使用这个过滤可以删除所有的用户定义的网络:

    1. $ docker network rm `docker network ls –filter type=custom -q`

    当尝试删除仍然有容器连接到的网络时将出现一个waring。

    Docker命令行参考(30) – docker network inspect显示详细的网络信息

    1. Usage:  docker network inspect [OPTIONS] NETWORK [NETWORK…]
    2.  
    3. Display detailed information on one or more networks
    4.  
    5. Options:
    6.   -f, –format string   Format the output using the given go template
    7.       –help            Print usage

    返回一个或多个网络的信息。默认下,这个命令以JSON格式输出网络信息。例如,连接两个容器到默认的bridge网络:

    1. $ sudo docker run -itd –name=container1 busybox
    2. f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27
    3.  
    4. $ sudo docker run -itd –name=container2 busybox
    5. bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727

    docker network inspect命令在其输出结果中包含容器ID。对于由多主机网络驱动程序支持的网络(如Overlay),此命令还会显示集群中其他主机上的容器endpoints。这些endpoints在输出中表示为“ep-{endpoint-id}”。 但是,对于群集范围的网络,仅显示该节点本地的endpoints。

    1. $ sudo docker network inspect bridge
    2. [
    3.     {
    4.         "Name": "bridge",
    5.         "Id": "b2b1a2cba717161d984383fd68218cf70bbbd17d328496885f7c921333228b0f",
    6.         "Scope": "local",
    7.         "Driver": "bridge",
    8.         "IPAM": {
    9.             "Driver": "default",
    10.             "Config": [
    11.                 {
    12.                     "Subnet": "172.17.42.1/16",
    13.                     "Gateway": "172.17.42.1"
    14.                 }
    15.             ]
    16.         },
    17.         "Internal": false,
    18.         "Containers": {
    19.             "bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727": {
    20.                 "Name": "container2",
    21.                 "EndpointID": "0aebb8fcd2b282abe1365979536f21ee4ceaf3ed56177c628eae9f706e00e019",
    22.                 "MacAddress": "02:42:ac:11:00:02",
    23.                 "IPv4Address": "172.17.0.2/16",
    24.                 "IPv6Address": ""
    25.             },
    26.             "f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27": {
    27.                 "Name": "container1",
    28.                 "EndpointID": "a00676d9c91a96bbe5bcfb34f705387a33d7cc365bac1a29e4e9728df92d10ad",
    29.                 "MacAddress": "02:42:ac:11:00:01",
    30.                 "IPv4Address": "172.17.0.1/16",
    31.                 "IPv6Address": ""
    32.             }
    33.         },
    34.         "Options": {
    35.             "com.docker.network.bridge.default_bridge": "true",
    36.             "com.docker.network.bridge.enable_icc": "true",
    37.             "com.docker.network.bridge.enable_ip_masquerade": "true",
    38.             "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
    39.             "com.docker.network.bridge.name": "docker0",
    40.             "com.docker.network.driver.mtu": "1500"
    41.         }
    42.     }
    43. ]

    返回关于用户定义网络的信息:

    1. $ docker network create simple-network
    2. 69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a
    3. $ docker network inspect simple-network
    4. [
    5.     {
    6.         "Name": "simple-network",
    7.         "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a",
    8.         "Scope": "local",
    9.         "Driver": "bridge",
    10.         "IPAM": {
    11.             "Driver": "default",
    12.             "Config": [
    13.                 {
    14.                     "Subnet": "172.22.0.0/16",
    15.                     "Gateway": "172.22.0.1/16"
    16.                 }
    17.             ]
    18.         },
    19.         "Containers": {},
    20.         "Options": {}
    21.     }
    22. ]

    Docker命令行参考(29) – docker network create创建一个网络

    1. Usage:  docker network create [OPTIONS] NETWORK
    2.  
    3. Create a network
    4.  
    5. Options:
    6.       –aux-address value    Auxiliary IPv4 or IPv6 addresses used by Network
    7.                              driver (default map[])
    8.   -d, –driver string        Driver to manage the Network (default "bridge")
    9.       –gateway value        IPv4 or IPv6 Gateway for the master subnet (default [])
    10.       –help                 Print usage
    11.       –internal             Restrict external access to the network
    12.       –ip-range value       Allocate container ip from a sub-range (default [])
    13.       –ipam-driver string   IP Address Management Driver (default "default")
    14.       –ipam-opt value       Set IPAM driver specific options (default map[])
    15.       –ipv6                 Enable IPv6 networking
    16.       –label value          Set metadata on a network (default [])
    17.   -o, –opt value            Set driver specific options (default map[])
    18.       –subnet value         Subnet in CIDR format that represents a
    19.                              network segment (default [])

    docker network create用来创建一个新的网络。其中–driver可以指定bridge或内置网络驱动overlay。如果安装了第三方的或自己编写的网络驱动,也可以指定到这里。如果不指定–driver选项,这个命令将自动为你创建一个bridge网络。当安装docker engine时它自动创建了一个bridge网络。这个网络对应于Engine传统上依赖的docker0 bridge。当使用docker run启动一个容器时会自动连接到这个bridge网络。不可以删除这个默认的bridge网络,不过可以使用docker network create命令来创建一个新的。

    1. $ docker network create -d bridge my-bridge-network

    bridge网络是在单台Engine安装上的隔离网络。如果想创建一个跨多个运行着Engine的docker主机,必须创建一个overlay网络。不像bridge网络,在创建overlay网络之前,需要一些预存在的条件。这些条件是:

  • 一个能够访问的键值存储。Engine支持Consul, Etcd, 和ZooKeeper (分布式的存储)键值存储.
  • 集群中的节点能够连接到这个键值存储。
  • 在集群中的每台主机正确地配置Engine daemon。
  • dockerd支持overlay网络的选项是:

  • –cluster-store
  • –cluster-store-opt
  • –cluster-advertise
  • 虽然不是必须的,但推荐安装docker swarm来管理组成你的网络的集群。Swarm提供了成熟的发现和服务器管理工具,可以帮助你更好地管理集群。
    一旦满足了overlay网络的配置前提条件,只需要在集群中的任何一台主机执行创建网络命令:

    1. $ docker network create -d overlay my-multihost-network

    网络名称必须是唯一的。docker daemon虽然会尝试识别名称冲突,但无法保证都会工作。避免名称冲突这个是用户的责任。

    连接容器

    当运行一个容器时,使用–network标志来连接它到一个网络。下面的示例是把busybox容器添加到mynet网络:

    1. $ docker run -itd –network=mynet busybox

    如果想在容器已经在运行时把它添加到一个网络,使用docker network connect子命令。
    可以连接多个容器到一个相同的网络。一旦连接成功,这些容器就可以使用另一个容器的IP地址或名称来互相通信。对于支持多主机连接的overlay网络或自定义插件,那些连接到相同的多主机网络但在不同的Engine启动的容器也能够以这种方式来互相通信。
    可以使用docker network disconnect命令来从一个网络断开一个容器。

    指定高级选项

    当创建一个网络时,Engine默认为这个网络创建一个不重叠的子网。这个子网不是现有网络的细分。 它纯粹是为了寻址目的。可以直接使用–subnet选项来覆盖这个默认行为并指定一个子网。在一个bridge网络上创建一个单独的子网:

    1. $ docker network create –driver=bridge –subnet=192.168.0.0/16 br0

    除此之外,可以指定–gateway –ip-range和–aux-address选项。

    1. $ docker network create
    2.   –driver=bridge
    3.   –subnet=172.28.0.0/16
    4.   –ip-range=172.28.5.0/24
    5.   –gateway=172.28.5.254
    6.   br0

    如果没有指定–gateway,那么Engine将从首选的ip池中为你选择一个gateway。对于overlay网络和及类似功能的网络驱动,可以创建多个子网。

    1. $ docker network create -d overlay
    2.   –subnet=192.168.0.0/16
    3.   –subnet=192.170.0.0/16
    4.   –gateway=192.168.0.100
    5.   –gateway=192.170.0.100
    6.   –ip-range=192.168.1.0/24
    7.   –aux-address="my-router=192.168.1.5" –aux-address="my-switch=192.168.1.6"
    8.   –aux-address="my-printer=192.170.1.5" –aux-address="my-nas=192.170.1.6"
    9.   my-multihost-network

    要确保子网没有重叠。如果重叠了,网络创建将失败,然后Engine返回一个错误。

    bridge驱动选项

    当创建一个自定义的网络时,默认的网络驱动(如bridge)可以传递额外的选项。下面是这些选项且有与docker daemon选项等同的选项:

    选项 等同 描述
    com.docker.network.bridge.name 创建Linux bridge使用的bridge名称
    com.docker.network.bridge.enable_ip_masquerade –ip-masq 启用IP伪装
    com.docker.network.bridge.enable_icc –icc 启用或禁用容器间连接
    com.docker.network.bridge.host_binding_ipv4 –ip 绑定容器端口时默认绑定的IP
    com.docker.network.driver.mtu –mtu 设置容器网络MTU

    下面这些参数可以传递给docker network create,可以用于任何网络驱动。

    参数 等同 描述
    –gateway 主子网的IPv4或IPv6网关
    –ip-range –fixed-cidr 从一个IP范围分配IP
    –internal 限制外网网络连接到这个网络
    –ipv6 –ipv6 启用Ipv6网络
    –subnet –bip 子网

    例如,使用-o或–opt选项当发布端口时绑定的IP地址:

    1. $ docker network create
    2.     -o "com.docker.network.bridge.host_binding_ipv4"="172.19.0.1"
    3.     simple-network

    网络内部模式

    默认下,当连接一个容器到一个overlay网络时,docker同时也连接到bridge网络来提供外部连接。如果想创建一个与外部隔离的overlay网络,可以指定–internal选项。

    Docker命令行参考(28) – docker network connect连接容器到一个网络

    1. Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
    2.  
    3. Connect a container to a network
    4.  
    5. Options:
    6.       –alias value           Add network-scoped alias for the container (default [])
    7.       –help                  Print usage
    8.       –ip string             IP Address
    9.       –ip6 string            IPv6 Address
    10.       –link value            Add link to another container (default [])
    11.       –link-local-ip value   Add a link-local address for the container (default [])

    这个命令用来连接一个容器到一个网络。可以通过名称或ID来连接容器。一旦连接成功,这个容器就能够与在同一网络的其它容器通信。

    1. $ docker network connect multi-host-network container1

    也可以使用docker run –network=命令启动一个容器并立即连接它到一个网络。

    1. $ docker run -itd –network=multi-host-network busybox

    可以指定你想分配到这个容器接口的IP地址。

    1. $ docker network connect –ip 10.10.36.122 multi-host-network container2

    可以使用–link选项来指定一个首选别名来连接到另一个容器。

    1. $ docker network connect –link container1:c1 multi-host-network container2

    –alias选项用来指定一个可以在将要连接的网络使用的别名。

    1. $ docker network connect –alias db –alias mysql multi-host-network container2

    可以暂停,重启和停止那么已连接到一个网络的容器。当容器运行时将立即连接到它所配置的网络。
    如果指定了容器IP,当重新启动已停止的容器时将重新应用这个IP。如果Ip地址不可用,容器将启动失败。保证这个IP一直可用的一个方法是在创建网络时指定一个–ip-range,然后从这个IP范围外选择一个静态IP地址。这样就确保了当容器不在这个网络时(容器停止时)这个IP地址不会分配给其它容器。

    1. $ docker network create –subnet 172.20.0.0/16 –ip-range 172.20.240.0/20 multi-host-network
    1. $ docker network connect –ip 172.20.128.2 multi-host-network container2

    要验证这个容器是否已连接到网络,使用docker network inspect命令。使用docker network disconnect来从网络删除容器。