Docker基本使用(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JosephThatwho/article/details/101457709

Services 服务 的基本用法

分布式应用的不同部分都分别视为服务。比如一个视频网站,可能包含应用数据库存储数据的服务、将用户上传的视频转码的服务、用于前端展示的服务等。
服务可以视为生产环境中的容器。一个服务只运行一个镜像,但规定了镜像运行的方式——使用的端口,为达到服务所需的运行限度而要运行的副本数量等。拓展一个服务会改变运行该软件的容器示例的数量,为进程中的服务分配更多的计算资源。
通过一个docker-compose.yml文件即可定义、运行并拓展服务。
YAML(Yet Another Markup Language\ YAML Ain’t a Markup Language)。

  1. docker-compose.yml文件:
version: "3"
services:
  web:
    image: josephthatwho/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

这个文件告诉docker:
从远程库中拉取 josephthatwho/get-started:part2 镜像;
运行5组该镜像的实例(容器),命名为web服务,限制每一组服务最多使用10%的CPU time以及50MB的内存;
如果某容器挂了,立刻重启该容器;
映射web服务的80端口为4000端口;
通过webnet这一负载均衡的网络使5个容器共用80端口(服务内部,容器通过临时端口连接web服务的80端口);
定义webnet使用缺省设置;

  1. 运行负载均衡的应用
$ docker swarm init
Swarm initialized: current node (jto8z0a1763vv6umjt0i6jpt6) is now a manager.

执行并命名应用,本例命名为getstartedlab

$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web

但前即有五个部署在主机上的镜像的容器实例运行在一个服务栈内。可以通过以下命令查看:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
wbu140j527p8        getstartedlab_web   replicated          5/5                 josephthatwho/get-started:part2   *:4000->80/tcp

运行在服务内的容器称为task(任务)。各个任务都有单独、递增的ID,以下命令列出指定服务内的所有task:

$ docker service ps getstartedlab_web
ID                  NAME                  IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
jjgvubwkbqci        getstartedlab_web.1   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 11 minutes ago                       
mcqdrhp84ahj        getstartedlab_web.2   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 11 minutes ago                       
kn8d8ax4bax6        getstartedlab_web.3   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 11 minutes ago                       
ks2hindi14mx        getstartedlab_web.4   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 11 minutes ago                       
ieqz6s6ap2gn        getstartedlab_web.5   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 11 minutes ago

也可以用如下命令列出栈内所有task:

$ docker stack ps getstartedlab
ID                  NAME                  IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
jjgvubwkbqci        getstartedlab_web.1   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 42 minutes ago                       
mcqdrhp84ahj        getstartedlab_web.2   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 42 minutes ago                       
kn8d8ax4bax6        getstartedlab_web.3   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 42 minutes ago                       
ks2hindi14mx        getstartedlab_web.4   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 42 minutes ago                       
ieqz6s6ap2gn        getstartedlab_web.5   josephthatwho/get-started:part2   starx-B85-D3V       Running             Running 42 minutes ago
  1. 拓展应用
    修改docker-compose.ymlreplicas的值,保存后重新执行docker stack deploy命令即可在运行中更新应用,不需要终止栈或容器:
docker stack deploy -c docker-compose.yml getstartedlab
  1. 终止应用与集群
    docker stack rm命令卸载应用:
docker stack rm getstartedlab

终止集群:

docker swarm leave --force

Swarms 集群 的基本用法

swarm指一组运行docker并加入集群的机器。集群中的机器可以是实体机器也可以是虚拟机,这些机器被称为nodes(节点)。
docker swarm命令将启用swarm模式并设置当前机器为swarm manager,在其他机器上执行docker swarm join命令使其作为worker加入swarm。

  1. 安装docker machine
    docker machine用于在虚拟系统内安装docker engine,以及给node从传递指令。
  2. 新建虚拟机:
$ docker-machine create --driver virtualbox myvm1
Running pre-create checks...
(myvm1) No default Boot2Docker ISO found locally, downloading the latest release...
(myvm1) Latest release for github.com/boot2docker/boot2docker is v18.09.9
(myvm1) Downloading /home/starx/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.09.9/boot2docker.iso...
(myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(myvm1) Copying /home/starx/.docker/machine/cache/boot2docker.iso to /home/starx/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Found a new host-only adapter: "vboxnet0"
(myvm1) 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 myvm1
$ docker-machine create --driver virtualbox myvm2
...

查看所有的机器以及他们的IP:

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.9   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.09.9   
  1. 初始化集群并增加节点
    使用docker-machine ssh命令向虚拟机发送指令,以下命令用docker swarm init将myvm1设为swarm manager:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"
Swarm initialized: current node (pgogozd45yyf640vrzf3diakr) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2680qpmszswxp25m4ciup660st5adphexfooehpeaqzw5rhjim-cuzj7865dxzpksyk7huiqt6na 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

注意端口号不能用2376,这是docker daemon的端口号。
使用docker swarm join将myvm2作为worker加入swarm:

$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-2680qpmszswxp25m4ciup660st5adphexfooehpeaqzw5rhjim-cuzj7865dxzpksyk7huiqt6na 192.168.99.100:2377"
This node joined a swarm as a worker.

在swarm manager上使用docker node ls命令可以查看swarm中的node:

 docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
pgogozd45yyf640vrzf3diakr *   myvm1               Ready               Active              Leader              18.09.9
to8mml6jbyvbr6xrazlwegfdm     myvm2               Ready               Active                                  18.09.9

在所有node下执行docker swarm leave即可解散集群,其中swarm manager要执行docker swarm leave --force

  1. 在集群上部署应用
    将docker-machine配置给swarm manager使可以不用docker-machine ssh包裹直接对docker manager使用命令行
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/starx/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell: 
# eval $(docker-machine env myvm1)
$ eval $(docker-machine env myvm1)
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.9   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.09.9

按提示执行eval $(docker-machine env myvm1)后,可以看到myvm1的ACTIVE状态转为’*’,表示当前myvm1时激活状态。

在swarm manager上部署应用,再次使用docker stack deploy命令部署应用,并查看服务栈:

$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
$ docker stack ps getstartedlab
ID                  NAME                  IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
cx2hf7g4eco3        getstartedlab_web.1   josephthatwho/get-started:part2   myvm1               Running             Running 12 seconds ago                       
gprl3l3v5qrl        getstartedlab_web.2   josephthatwho/get-started:part2   myvm2               Running             Running 17 seconds ago                       
xsi9yhqxw2fk        getstartedlab_web.3   josephthatwho/get-started:part2   myvm2               Running             Running 17 seconds ago                       
udyoz9ykrhbo        getstartedlab_web.4   josephthatwho/get-started:part2   myvm1               Running             Running 12 seconds ago                       
ne47ewzuf2kt        getstartedlab_web.5   josephthatwho/get-started:part2   myvm2               Running             Running 17 seconds ago

可以看到服务以及容器被分配到了myvm1和myvm2上。
使用docker-machine env可以切换到其他节点。

使用eval $(docker-machine env -u)命令取消docker-machine的环境变量。

主机关机后,docker机器也会停止运行,可以用docker-machine ls命令检查,用docker-machine start <machine-name>命令运行docker机器。

猜你喜欢

转载自blog.csdn.net/JosephThatwho/article/details/101457709