Docker Swarm入门实例详解

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

1. Swarm 认识

Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具。Docker 1.12 内嵌了 swarm mode 集群管理模式。

为了方便演示跨主机网络,我们需要用到一个工具——Docker Machine,这个工具与 Docker Compose、Docker Swarm 并称 Docker 三剑客,下面我们来看看如何安装 Docker Machine:

$ curl -L https://github.com/docker/machine/releases/download/v0.9.0-rc2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
  chmod +x /tmp/docker-machine &&
  sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

安装过程和 Docker Compose 非常类似。现在 Docker 三剑客已经全部到齐了。

在开始之前,我们需要了解一些基本概念,有关集群的 Docker 命令如下:

docker swarm:集群管理,子命令有 init, join,join-token, leave, update

docker node:节点管理,子命令有 demote, inspect,ls, promote, rm, ps, update

docker service:服务管理,子命令有 create, inspect, ps, ls ,rm , scale, update

docker stack/deploy:试验特性,用于多应用部署,等正式版加进来再说。

2. 创建集群

首先使用 Docker Machine 创建一个虚拟机作为 manger 节点。

$ docker-machine create --driver virtualbox manager1
Running pre-create checks...
(manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
Creating machine...
(manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
(manager1) Copying /home/zuolan/.docker/machine/cache/boot2docker.iso to /home/zuolan/.docker/machine/machines/manager1/boot2docker.iso...
(manager1) Creating VirtualBox VM...
(manager1) Creating SSH key...
(manager1) Starting the VM...
(manager1) Check network to re-create if needed...
(manager1) Found a new host-only adapter: "vboxnet0"
(manager1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager1

查看虚拟机的环境变量等信息,包括虚拟机的 IP 地址:

$ docker-machine env manager1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/zuolan/.docker/machine/machines/manager1"
export DOCKER_MACHINE_NAME="manager1"
# Run this command to configure your shell:
# eval $(docker-machine env manager1)

然后再创建一个节点作为 work 节点。

$ docker-machine create --driver virtualbox worker1

现在我们有了两个虚拟主机,使用 Machine 的命令可以查看:

$ docker-machine ls
NAME   ACTIVE  DRIVER    STATE  URL            SWARM DOCKER  ERRORS
manager1  -   virtualbox  Running tcp://192.168.99.100:2376     v1.12.3
worker1  -   virtualbox  Running tcp://192.168.99.101:2376     v1.12.3

但是目前这两台虚拟主机并没有什么联系,为了把它们联系起来,我们需要 Swarm 登场了。

因为我们使用的是 Docker Machine 创建的虚拟机,因此可以使用 docker-machine ssh 命令来操作虚拟机,在实际生产环境中,并不需要像下面那样操作,只需要执行 docker swarm 即可。

把 manager1 加入集群:

$ docker-machine ssh manager1 docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100
Swarm initialized: current node (23lkbq7uovqsg550qfzup59t6) is now a manager.
To add a worker to this swarm, run the following command:
  docker swarm join \
  --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
  192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

用 --listen-addr 指定监听的 ip 与端口,实际的 Swarm 命令格式如下,本例使用 Docker Machine 来连接虚拟机而已:

$ docker swarm init --listen-addr <MANAGER-IP>:<PORT>

接下来,再把 work1 加入集群中:

$ docker-machine ssh worker1 docker swarm join --token \
  SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
  192.168.99.100:2377
This node joined a swarm as a worker.

上面 join 命令中可以添加 --listen-addr $WORKER1_IP:2377 作为监听准备,因为有时候可能会遇到把一个 work 节点提升为 manger 节点的可能,当然本例子没有这个打算就不添加这个参数了。

注意:如果你在新建集群时遇到双网卡情况,可以指定使用哪个 IP,例如上面的例子会有可能遇到下面的错误。

$ docker-machine ssh manager1 docker swarm init --listen-addr $MANAGER1_IP:2377
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth1) - specify one with --advertise-addr
exit status 1

发生错误的原因是因为有两个 IP 地址,而 Swarm 不知道用户想使用哪个,因此要指定 IP。

$ docker-machine ssh manager1 docker swarm init --advertise-addr 192.168.99.100 --listen-addr 192.168.99.100:2377
Swarm initialized: current node (ahvwxicunjd0z8g0eeosjztjx) is now a manager.
To add a worker to this swarm, run the following command:
  docker swarm join \
  --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
  192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

集群初始化成功。

现在我们新建了一个有两个节点的“集群”,现在进入其中一个管理节点使用 docker node 命令来查看节点信息:

$ docker-machine ssh manager1 docker node ls
ID            HOSTNAME STATUS AVAILABILITY MANAGER STATUS
23lkbq7uovqsg550qfzup59t6 * manager1  Ready   Active     Leader
dqb3fim8zvcob8sycri3hy98a  worker1   Ready   Active

现在每个节点都归属于 Swarm,并都处在了待机状态。Manager1 是领导者,work1 是工人。

现在,我们继续新建虚拟机 manger2、worker2、worker3,现在已经有五个虚拟机了,使用 docker-machine ls 来查看虚拟机:

NAME   ACTIVE  DRIVER    STATE   URL             SWARM  DOCKER  ERRORS
manager1  -    virtualbox  Running  tcp://192.168.99.100:2376      v1.12.3
manager2  -    virtualbox  Running  tcp://192.168.99.105:2376      v1.12.3
worker1  -    virtualbox  Running  tcp://192.168.99.102:2376      v1.12.3
worker2  -    virtualbox  Running  tcp://192.168.99.103:2376      v1.12.3
worker3  -    virtualbox  Running  tcp://192.168.99.104:2376      v1.12.3

然后我们把剩余的虚拟机也加到集群中。

添加 worker2 到集群中:

$ docker-machine ssh worker2 docker swarm join \
 --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
 192.168.99.100:2377
This node joined a swarm as a worker.

添加 worker3 到集群中:

$ docker-machine ssh worker3 docker swarm join \
 --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
 192.168.99.100:2377
This node joined a swarm as a worker.

添加 manager2 到集群中:

先从 manager1 中获取 manager 的 token:

$ docker-machine ssh manager1 docker swarm join-token manager
To add a manager to this swarm, run the following command:
 docker swarm join \
 --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \
192.168.99.100:2377

然后添加 manager2 到集群中:

$ docker-machine ssh manager2 docker swarm join \
 --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \
 192.168.99.100:2377
This node joined a swarm as a manager.

现在再来查看集群信息:

$ docker-machine ssh manager2 docker node ls
ID              HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
16w80jnqy2k30yez4wbbaz1l8   worker1   Ready   Active
2gkwhzakejj72n5xoxruet71z   worker2   Ready   Active
35kutfyn1ratch55fn7j3fs4x   worker3   Ready   Active
a9r21g5iq1u6h31myprfwl8ln *  manager2  Ready   Active    Reachable
dpo7snxbz2a0dxvx6mf19p35z   manager1  Ready   Active    Leader

3. 建立跨主机网络

为了演示更清晰,下面我们把宿主机也加入到集群之中,这样我们使用 Docker 命令操作会清晰很多。
直接在本地执行加入集群命令:

$ docker swarm join \
  --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \
  192.168.99.100:2377
This node joined a swarm as a manager.

现在我们有三台 manager,三台 worker。其中一台是宿主机,五台虚拟机。

$ docker node ls
ID             HOSTNAME  STATUS  AVAILABILITY MANAGER STATUS
6z2rpk1t4xucffzlr2rpqb8u3  worker3   Ready   Active
7qbr0xd747qena4awx8bx101s * user-pc   Ready   Active     Reachable
9v93sav79jqrg0c7051rcxxev  manager2  Ready   Active     Reachable
a1ner3zxj3ubsiw4l3p28wrkj  worker1   Ready   Active
a5w7h8j83i11qqi4vlu948mad  worker2   Ready   Active
d4h7vuekklpd6189fcudpfy18  manager1  Ready   Active     Leader

查看网络状态:

$ docker network ls
NETWORK ID     NAME      DRIVER     SCOPE
764ff31881e5    bridge     bridge     local
fbd9a977aa03    host      host      local
6p6xlousvsy2    ingress     overlay     swarm
e81af24d643d    none      null      local

可以看到在 swarm 上默认已有一个名为 ingress 的 overlay 网络, 默认在 swarm 里使用,本例子中会创建一个新的 overlay 网络。

$ docker network create --driver overlay swarm_test
4dm8cy9y5delvs5vd0ghdd89s
$ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
764ff31881e5    bridge       bridge       local
fbd9a977aa03    host        host        local
6p6xlousvsy2    ingress       overlay       swarm
e81af24d643d    none        null        local
4dm8cy9y5del    swarm_test     overlay       swarm

这样一个跨主机网络就搭建好了,但是现在这个网络只是处于待机状态,下一小节我们会在这个网络上部署应用。

4. 在跨主机网络上部署应用

首先我们上面创建的节点都是没有镜像的,因此我们要逐一 pull 镜像到节点中,这里我们使用前面搭建的私有仓库。

$ docker-machine ssh manager1 docker pull reg.example.com/library/nginx:alpine
alpine: Pulling from library/nginx
e110a4a17941: Pulling fs layer
... ...
7648f5d87006: Pull complete
Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe
Status: Downloaded newer image for reg.example.com/library/nginx:alpine
$ docker-machine ssh manager2 docker pull reg.example.com/library/nginx:alpine
alpine: Pulling from library/nginx
e110a4a17941: Pulling fs layer
... ...
7648f5d87006: Pull complete
Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe
Status: Downloaded newer image for reg.example.com/library/nginx:alpine
$ docker-machine ssh worker1 docker pull reg.example.com/library/nginx:alpine
alpine: Pulling from library/nginx
e110a4a17941: Pulling fs layer
... ...
7648f5d87006: Pull complete
Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe
Status: Downloaded newer image for reg.example.com/library/nginx:alpine
$ docker-machine ssh worker2 docker pull reg.example.com/library/nginx:alpine
alpine: Pulling from library/nginx
e110a4a17941: Pulling fs layer
... ...
7648f5d87006: Pull complete
Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe
Status: Downloaded newer image for reg.example.com/library/nginx:alpine
$ docker-machine ssh worker3 docker pull reg.example.com/library/nginx:alpine
alpine: Pulling from library/nginx
e110a4a17941: Pulling fs layer
... ...
7648f5d87006: Pull complete
Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe
Status: Downloaded newer image for reg.example.com/library/nginx:alpine

上面使用 docker pull 分别在五个虚拟机节点拉取 nginx:alpine 镜像。接下来我们要在五个节点部署一组 Nginx 服务。

部署的服务使用 swarm_test 跨主机网络。

$ docker service create --replicas 2 --name helloworld --network=swarm_test nginx:alpine
5gz0h2s5agh2d2libvzq6bhgs

查看服务状态:

$ docker service ls
ID      NAME    REPLICAS IMAGE     COMMAND
5gz0h2s5agh2 helloworld 0/2    nginx:alpine

查看 helloworld 服务详情(为了方便阅读,已调整输出内容):

$ docker service ps helloworld
ID     NAME     IMAGE     NODE   DESIRED STATE  CURRENT STATE       ERROR
ay081uome3  helloworld.1 nginx:alpine manager1 Running     Preparing 2 seconds ago
16cvore0c96 helloworld.2 nginx:alpine worker2  Running     Preparing 2 seconds ago

可以看到两个实例分别运行在两个节点上。
进入两个节点,查看服务状态(为了方便阅读,已调整输出内容):

$ docker-machine ssh manager1 docker ps -a
CONTAINER ID  IMAGE     COMMAND     CREATED    STATUS     PORTS      NAMES
119f787622c2  nginx:alpine "nginx -g ..."  4 minutes ago Up 4 minutes  80/tcp, 443/tcp hello ...
$ docker-machine ssh worker2 docker ps -a
CONTAINER ID  IMAGE     COMMAND     CREATED     STATUS    PORTS       NAMES
5db707401a06  nginx:alpine "nginx -g ..."  4 minutes ago  Up 4 minutes 80/tcp, 443/tcp  hello ...

上面输出做了调整,实际的 NAMES 值为:

helloworld.1.ay081uome3eejeg4mspa8pdlx
helloworld.2.16cvore0c96rby1vp0sny3mvt

记住上面这两个实例的名称。现在我们来看这两个跨主机的容器是否能互通:

首先使用 Machine 进入 manager1 节点,然后使用 docker exec -i 命令进入 helloworld.1 容器中 ping 运行在 worker2 节点的 helloworld.2 容器。

$ docker-machine ssh manager1 docker exec -i helloworld.1.ay081uome3eejeg4mspa8pdlx \
  ping helloworld.2.16cvore0c96rby1vp0sny3mvt
PING helloworld.2.16cvore0c96rby1vp0sny3mvt (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.591 ms
64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.594 ms
64 bytes from 10.0.0.4: seq=2 ttl=64 time=0.624 ms
64 bytes from 10.0.0.4: seq=3 ttl=64 time=0.612 ms
^C

然后使用 Machine 进入 worker2 节点,然后使用 docker exec -i 命令进入 helloworld.2 容器中 ping 运行在 manager1 节点的 helloworld.1 容器。

$ docker-machine ssh worker2 docker exec -i helloworld.2.16cvore0c96rby1vp0sny3mvt \
  ping helloworld.1.ay081uome3eejeg4mspa8pdlx
PING helloworld.1.ay081uome3eejeg4mspa8pdlx (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.466 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.465 ms
64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.548 ms
64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.689 ms
^C

可以看到这两个跨主机的服务集群里面各个容器是可以互相连接的。

为了体现 Swarm 集群的优势,我们可以使用虚拟机的 ping 命令来测试对方虚拟机内的容器。

$ docker-machine ssh worker2 ping helloworld.1.ay081uome3eejeg4mspa8pdlx
PING helloworld.1.ay081uome3eejeg4mspa8pdlx (221.179.46.190): 56 data bytes
64 bytes from 221.179.46.190: seq=0 ttl=63 time=48.651 ms
64 bytes from 221.179.46.190: seq=1 ttl=63 time=63.239 ms
64 bytes from 221.179.46.190: seq=2 ttl=63 time=47.686 ms
64 bytes from 221.179.46.190: seq=3 ttl=63 time=61.232 ms
^C
$ docker-machine ssh manager1 ping helloworld.2.16cvore0c96rby1vp0sny3mvt
PING helloworld.2.16cvore0c96rby1vp0sny3mvt (221.179.46.194): 56 data bytes
64 bytes from 221.179.46.194: seq=0 ttl=63 time=30.150 ms
64 bytes from 221.179.46.194: seq=1 ttl=63 time=54.455 ms
64 bytes from 221.179.46.194: seq=2 ttl=63 time=73.862 ms
64 bytes from 221.179.46.194: seq=3 ttl=63 time=53.171 ms
^C

上面我们使用了虚拟机内部的 ping 去测试容器的延迟,可以看到延迟明显比集群内部的 ping 值要高。

5. Swarm 集群负载

现在我们已经学会了 Swarm 集群的部署方法,现在来搭建一个可访问的 Nginx 集群吧。体验最新版的 Swarm 所提供的自动服务发现与集群负载功能。

首先删掉上一节我们启动的 helloworld 服务:

$ docker service rm helloworld
helloworld

然后在新建一个服务,提供端口映射参数,使得外界可以访问这些 Nginx 服务:

$ docker service create --replicas 2 --name helloworld -p 7080:80 --network=swarm_test nginx:alpine
9gfziifbii7a6zdqt56kocyun

查看服务运行状态:

$ docker service ls
ID      NAME     REPLICAS   IMAGE      COMMAND
9gfziifbii7a helloworld   2/2    nginx:alpine

不知你有没有发现,虽然我们使用 --replicas 参数的值都是一样的,但是上一节中获取服务状态时,REPLICAS 返回的是 0/2,现在的 REPLICAS 返回的是 2/2。

同样使用 docker service ps 查看服务详细状态时(下面输出已经手动调整为更易读的格式),可以看到实例的 CURRENT STATE 中是 Running 状态的,而上一节中的 CURRENT STATE 中全部是处于 Preparing 状态。

$ docker service ps helloworld
ID     NAME   IMAGE   NODE  DESIRED STATE  CURRENT STATE  ERROR
9ikr3agyi...  helloworld.1 nginx:alpine user-pc  Running     Running 13 seconds ago
7acmhj0u...  helloworld.2 nginx:alpine worker2  Running     Running 6 seconds ago

这就涉及到 Swarm 内置的发现机制了,目前 Docker 1.12 中 Swarm 已经内置了服务发现工具,我们不再需要像以前使用 Etcd 或者 Consul 这些工具来配置服务发现。对于一个容器来说如果没有外部通信但又是运行中的状态会被服务发现工具认为是 Preparing 状态,本小节例子中因为映射了端口,因此有了 Running 状态。

现在我们来看 Swarm 另一个有趣的功能,当我们杀死其中一个节点时,会发生什么。

首先 kill 掉 worker2 的实例:

$ docker-machine ssh worker2 docker kill helloworld.2.7acmhj0udzusv1d7lu2tbuhu4
helloworld.2.7acmhj0udzusv1d7lu2tbuhu4

稍等几秒,再来看服务状态:

$ docker service ps helloworld
ID     NAME     IMAGE   NODE  DESIRED STATE CURRENT STATE  ERROR
9ikr3agyi... helloworld.1   nginx:alpine zuolan-pc Running    Running 19 minutes ago
8f866igpl... helloworld.2   nginx:alpine manager1 Running    Running 4 seconds ago
7acmhj0u...  \_ helloworld.2 nginx:alpine worker2  Shutdown    Failed 11 seconds ago ...exit...
$ docker service ls
ID      NAME    REPLICAS IMAGE     COMMAND
9gfziifbii7a helloworld 2/2    nginx:alpine

可以看到即使我们 kill 掉其中一个实例,Swarm 也会迅速把停止的容器撤下来,同时在节点中启动一个新的实例顶上来。这样服务依旧还是两个实例在运行。

此时如果你想添加更多实例可以使用 scale 命令:

$ docker service scale helloworld=3
helloworld scaled to 3

查看服务详情,可以看到有三个实例启动了:

$ docker service ps helloworld
ID     NAME    IMAGE   NODE  DESIRED STATE CURRENT STATE  ERROR
9ikr3agyi... helloworld.1  nginx:alpine user-pc  Running    Running 30 minutes ago 8f866igpl... helloworld.2  nginx:alpine manager1 Running    Running 11 minutes ago 7acmhj0u... \_ helloworld.2 nginx:alpine worker2  Shutdown    Failed 11 minutes ago  exit137
1vexr1jm... helloworld.3  nginx:alpine  worker2  Running    Running 4 seconds ago

现在如果想减少实例数量,一样可以使用 scale 命令:

$ docker service scale helloworld=2
helloworld scaled to 2

至此,Swarm的主要用法都已经介绍完了,主要讲述了 Swarm 集群网络的创建与部署。介绍了 Swarm 的常规应用,包括 Swarm 的服务发现、负载均衡等,然后使用 Swarm 来配置跨主机容器网络,并在上面部署应用。

关于Swarm的更多实战例子,以后有机会还会写的,就这样啦。

总结

以上就是本文关于Docker Swarm 入门实例详解的全部内容,希望对大家有所帮助,感兴趣的朋友可以参阅:Windows使用docker打开新窗口error解决办法、详解Docker使用Linux iptables 和 Interfaces管理容器网络、浅谈Docker安全机制内核安全与容器之间的网络安全等,有什么问题可以随时留言,小编会及时回复大家的。

(0)

相关推荐

  • Docker的安装方法及运行Docker Swarm模式的使用

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 概要 docker就给简单介绍这么多,这里主要说说docker swarm. docker engine本身只提供了容器技术,没有解决集群环境下的容器编排和通信.docker swarm是一个容器编排管理工具,docker-engine在1.12版本之后集成了docker

  • 详解使用docker 1.12 搭建多主机docker swarm集群

    swarm是docker公司自己的容器集群管理工具,本文介绍了使用docker 1.12 搭建多主机docker swarm集群,分享给大家 准备 准备至少两台的centos 7 主机(全新最小安装, 可以使用虚拟机安装) 开放端口2377 tcp端口, 7946 4789 tcp udp 端口 本文使用192.168.99.101(hostname:centos-node4) 作为swarm manager 192.168.99.102(hostname:centos-node5) 作为sw

  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    介绍 Docker Swarm是用于部署Docker主机集群的Docker本地解决方案.您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群. 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcd或Consul)来进行服务发现.但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用. 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器

  • 轻松安装docker并运行docker swarm模式

    概要 docker 1.12版本最大的改变在于集成了docker swarm,在docker engine下提供了 swarm 模式,这里主要说一下docker swarm. docker engine本身只提供了容器技术,没有解决集群环境下的容器编排和通信.docker swarm是一个容器编排管理工具,docker-engine在1.12版本之后集成了docker swarm,不需要再单独安装. docker swarm的功能,举个例子,有3台机器都安装了docker环境,称为3台docke

  • Docker Swarm入门实例详解

    Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具.它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络. 1. Swarm 认识 Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具.Docker 1.

  • hibernate4快速入门实例详解

    Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object RelationalMapping) ORMapping基本对应规则: 1:类跟表相对应 2:类的属性跟表的字段相对应 3:类的实例与表中具体的一条记录相对应 4:一个类可以对应多个表,一个表也可以对应对个类 5:DB中的表可以没有主键,但是Object中必须设置主键字段 6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系 7:Object中属性的个数和名称可

  • spring boot + jpa + kotlin入门实例详解

    spring boot +jpa的文章网络上已经有不少,这里主要补充一下用kotlin来做. kotlin里面的data class来创建entity可以帮助我们减少不少的代码,比如现在这个User的Entity,这是Java版本的: @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String firstName; private S

  • JCrontab简单入门实例详解

    本文实例为大家分享了JCrontab简单入门,供大家参考,具体内容如下 创建一个JavaWeb项目 1.首先要下载JCrontab的相关jar包,Jcrontab-2.0-RC0.jar.放到lib文件夹下. 2.在src下新建文件jcrontab.properties如下: #crontab.xml 文件的目录,这个是作业调度规则 org.jcrontab.data.file =E:/EclipseWorkspace/ADemo/WebContent/WEB-INF/crontab.xml #

  • Java数据结构与算法入门实例详解

    第一部分:Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? 数据结构: Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系. 而各数据元素之间的相互关系,又包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构. 而一个数据结构的设计过程分成抽象层.数据结构层和实现层. 数据结构在Java的语言体系中按逻辑结构可以分为两大类:线性数据结构和非线性数据结构. 一.Java数据结构之:线性数据结构 线性数据结构:常见的

  • spring boot集成redis基础入门实例详解

    目录 redis redis和spring boot spring boot集成redis redis使用 redis在spring boot中存取数据 set写入数据 get读取数据 模拟接口请求读取redis中的数据 总结 redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请查看 redis官方文档 redis和spring boot redis

  • 安装docker和docker-compose实例详解

    1.卸载旧版本Docker sudo yum remove docker docker-common docker-selinux docker-engine 2.执行以下命令安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 3.鉴于国内网络问题,强烈建议使用国内源执行下面的命令添加 yum 软件源 sudo yum-config-manager --add-repo http://mirrors.ali

  • SpringMVC注解的入门实例详解

    目录 1.在 web.xml 文件中配置前端处理器 2.在 springmvc.xml 文件中配置处理器映射器,处理器适配器,视图解析器 3.编写 Handler 4.编写 视图 index.jsp 5.在浏览器中输入:http://localhost:8080/SpringMVC_03/hello 总结 1.在 web.xml 文件中配置前端处理器 <?xml version="1.0" encoding="UTF-8"?> <web-app x

  • jenkins构建Docker 镜像实例详解

     jenkins构建Docker 镜像实例详解 前言:jenkins有Docker镜像,而之前我们说过使用jenkins打包Docker镜像,那么可否用jenkins的Docker镜像打包Docker镜像呢? 环境: CentOS 7     Docker 1.10.3 1.本机安装docker环境,并配置TCP访问接口 # vi /usr/lib/systemd/system/docker.service 修改ExecStart为: ExecStart=/usr/bin/docker daem

  • Python入门之三角函数sin()函数实例详解

    描述 sin()返回的x弧度的正弦值. 语法 以下是sin()方法的语法: importmath math.sin(x) 注意:sin()是不能直接访问的,需要导入math模块,然后通过math静态对象调用该方法. 参数 x--一个数值. 返回值 返回的x弧度的正弦值,数值在-1到1之间. 实例 以下展示了使用sin()方法的实例: #!/usr/bin/python import math print "sin(3) : ", math.sin(3) print "sin(

随机推荐