Docker基本概念及用法(二)

这个部分我们将真正学习如何在生产环境下运行容器。

服务(service)

现在服务器端应用往往十分复杂,庞大的业务需要我们进行服务拆分,需要我们运行多个应用实例等等。为了管理这样的应用,Docker提出了服务的概念。

生成一个服务很简单,我们可以在任何地方创建一个docker-compose.yml

version: "3"
services:
 web:
   image: jeffwcx/docker-test:0.1
   deploy:
     replicas: 5
     resources:
       limits:
         cpus: "0.1"
         memory: 50M
     restart_policy:
       condition: on-failure
   ports:
     - "80:80"
   networks:
     - webnet
networks:
 webnet: 

这段配置的意思也很简单

  • 下载jeffwcx/docker-test:0.1这个镜像
  • 根据上述镜像生成5个副本容器,限制每个容器的CPU使用率为10%,内存使用为50M
  • 将端口80映射到物理机的端口80上
  • 网络webnet意味着让所有容器通过webnet负载均衡网络共享80端口

下一步,我们开始运行服务

在开启负载均衡应用之前,我们需要先执行

docker swarm init 

然后,我们执行以下命令开启服务service-test

docker stack deploy -c docker-compose.yml service-test 

通过docker servcie ls,可以看到我们已经启动一个服务

ID                  NAME                MODE                REPLICAS            IMAGE                     PORTS
jdcf9jn7xr3o        service-test_web    replicated          5/5                 jeffwcx/docker-test:0.1   *:80->80/tcp 

然后我们来看下正在运行所有任务(这里我们将服务里的单个容器成为任务docker service ps service-test_web

ID                  NAME                 IMAGE                     NODE                    DESIRED STATE       CURRENT STATE           ERROR               PORTS
jqxck1lfbkkr        service-test_web.1   jeffwcx/docker-test:0.1   linuxkit-025000000001   Running             Running 3 minutes ago
goeq9wx7rjqe        service-test_web.2   jeffwcx/docker-test:0.1   linuxkit-025000000001   Running             Running 3 minutes ago
v09t56dmlpfz        service-test_web.3   jeffwcx/docker-test:0.1   linuxkit-025000000001   Running             Running 3 minutes ago
ki7mesy9v0ov        service-test_web.4   jeffwcx/docker-test:0.1   linuxkit-025000000001   Running             Running 3 minutes ago
is92sblljaej        service-test_web.5   jeffwcx/docker-test:0.1   linuxkit-025000000001   Running             Running 3 minutes ago 

当然,你也可以通过docker container ls来查看所有容器

我们测试一下

curl -4 http://localhost
// <p>Hello Docker!</p> 

光是部署还不行,我们得学会卸载服务

docker stack rm service-test 

最后还得关闭swarm

docker swarm leave --force 

看到这里,我想大家肯定对swarm很疑惑吧,为什么在服务开启时,需要docker swarm init,而在服务移除时,需要docker swarm leave --force?我们接着往下看。

Swarm

Swarm其实是Docker的容器管理工具,通过Swarm,我们能够将应用和服务编排部署到虚拟机或者是物理机上。