Docker Service和Docker Container有什么区别?

98

我们何时使用docker service create命令,何时使用docker run命令?

6个回答

46
简而言之:当您使用Docker Swarm配置主节点时,大多数情况下使用Docker服务,以便Docker容器在分布式环境中运行并且易于管理。
Docker run命令首先基于指定的镜像创建可写容器层,然后使用指定的命令启动它。也就是说,docker run相当于API /containers/create然后/containers/(id)/start。
Docker服务将成为某个较大应用程序上下文中微服务的镜像。服务的示例包括HTTP服务器、数据库或任何其他类型的可执行程序,您希望在分布式环境中运行它们。
创建服务时,您指定要使用哪个容器映像以及在运行容器内执行哪些命令。您还定义了服务的选项,包括:
- swarm将在其中提供服务的端口 - 服务连接到群集中的其他服务的覆盖网络 - CPU和内存限制和保留 - 滚动更新策略 - 在群集中运行映像的副本数量
来源:https://docs.docker.com/engine/reference/commandline/run/#parent-commandhttps://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#services-tasks-and-containers

1
因此,在扩展容器时,我可以将它们部署到不同的工作节点吗? 如果可以的话,我可以从主节点将容器分配给工作节点吗? - Kunal Sehegal
1
@KunalSehegal 当服务运行在复制模式下时,才需要进行扩展。在扩展服务时,可以提供约束条件,Swarm将在与约束条件匹配的节点上部署服务器。 - Saurabhcdt
Docker服务是特定的Docker容器集合吗? - therobyouknow

29
  • 使用docker run命令创建一个独立的容器。
  • 使用docker service create命令在计算机群(称为swarm)中创建该服务的实例(称为task)。这些任务当然是容器,但不是独立容器。从某种意义上讲,服务在实例化任务时充当模板。

例如:

docker service create --name MY_SERVICE_NAME --replicas 3 IMAGE:TAG
创建3个任务的MY_SERVICE_NAME服务,该服务基于IMAGE:TAG镜像。更多信息可以在这里找到。

19

Docker run 命令将启动一个单独的容器。

使用 Docker 服务管理一组容器(来自同一镜像)。您可以对它们进行扩缩容(启动多个容器)或更新操作。


1
有了“服务管理一组容器”这个功能,如果你知道服务名称(人类可读的名称)或服务ID(字母数字混合的名称)(通过执行docker service ls查看两者都可以),那么你如何获取属于该组的Docker容器ID列表,以便你可以ssh连接到其中任意一个容器?对我来说,这似乎是许多人想做的事情,就像我一样,但答案似乎非常难寻找...(感谢阅读,希望您能分享您的想法)。 - therobyouknow

18

16
你可以以两种方式使用Docker。
1. 独立模式
当您使用独立模式时,您只在一台机器上安装了Docker守护程序。在这里,您可以在该单个机器上创建/销毁/运行单个容器或多个容器。
因此,当您运行docker run命令时,docker-cli会向dockerd守护程序发送API查询以运行指定的容器。
所以,您使用docker run命令所做的操作只会影响您运行该命令的单个节点/机器/主机。如果您在容器中添加卷或网络,则这些资源只能在您运行docker run命令的单个节点上可用。

2. 集群模式(或群集模式)


当您想要或需要利用集群计算的优势,如高可用性、容错性和水平扩展性时,您可以使用Swarm模式。通过Swarm模式,您可以在集群中拥有多个节点/机器/主机,并且可以将工作负载分布到整个集群中。您甚至可以在单节点集群中启动Swarm模式,并随后添加更多节点。
示例:
你可以免费在这里重新创建这个场景。 假设此刻我们只有一个名为node-01.dc.local的节点,在这个节点上我们已经执行了以下命令,
####### Initiating swarm mode ########

$ docker swarm init --advertise-addr eth0

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

    docker swarm join --token SWMTKN-1-21mxdqipe5lvzyiunpbrjk1mnzaxrlksnu0scw7l5xvri4rtjn-590dyij6z342uyxthletg7fu6 192.168.0.8:2377


####### create a standalone container  #######
[node1] (local) root@192.168.0.8 ~
$ docker run -d --name app1 nginx

####### creating a service #######
[node1] (local) root@192.168.0.8 ~
$ docker service create --name app2 nginx

过了一段时间,当你感觉需要扩展工作负载时,你添加了另一台名为node-02.dc.local的机器。你希望将服务扩展和分发到新创建的节点上。 因此,我们在node-02.dc.local节点上运行了以下命令:
####### Join the second machine/node/host in the cluster #######

[node2] (local) root@192.168.0.7 ~
$ docker swarm join --token SWMTKN-1-21mxdqipe5lvzyiunpbrjk1mnzaxrlksnu0scw7l5xvri4rtjn-590dyij6z342uyxthletg7fu6 192.168.0.8:2377
This node joined a swarm as a worker.


现在从第一个节点开始,我已经运行了以下命令来扩展服务。
####### Listing services #######
[node1] (local) root@192.168.0.8 ~
$ docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
syn9jo2t4jcn   app2      replicated   1/1        nginx:latest   

####### Scalling app2 from single container to 10 more container #######
[node1] (local) root@192.168.0.8 ~
$ docker service update --replicas 10 app2
app2
overall progress: 10 out of 10 tasks 
1/10: running   [==================================================>] 
2/10: running   [==================================================>] 
3/10: running   [==================================================>] 
4/10: running   [==================================================>] 
5/10: running   [==================================================>] 
6/10: running   [==================================================>] 
7/10: running   [==================================================>] 
8/10: running   [==================================================>] 
9/10: running   [==================================================>] 
10/10: running   [==================================================>] 
verify: Service converged 
[node1] (local) root@192.168.0.8 ~

####### Verifying that app2's workload is distributed to both of the ndoes #######
$ docker service ps app2
ID             NAME      IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
z12bzz5sop6i   app2.1    nginx:latest   node1     Running         Running 15 minutes ago             
8a78pqxg38cb   app2.2    nginx:latest   node2     Running         Running 15 seconds ago             
rcc0l0x09li0   app2.3    nginx:latest   node2     Running         Running 15 seconds ago             
os19nddrn05m   app2.4    nginx:latest   node1     Running         Running 22 seconds ago             
d30cyg5vznhz   app2.5    nginx:latest   node1     Running         Running 22 seconds ago             
o7sb1v63pny6   app2.6    nginx:latest   node2     Running         Running 15 seconds ago             
iblxdrleaxry   app2.7    nginx:latest   node1     Running         Running 22 seconds ago             
7kg6esguyt4h   app2.8    nginx:latest   node2     Running         Running 15 seconds ago             
k2fbxhh4wwym   app2.9    nginx:latest   node1     Running         Running 22 seconds ago             
2dncdz2fypgz   app2.10   nginx:latest   node2     Running         Running 15 seconds ago  

但是如果你需要扩展你的应用程序1,你无法做到这一点,因为你已经使用独立模式创建了容器。

1
一份出色的答案示例,具有精准的回答、优秀的演示和可操作的信息,针对Rick先生(@arif)的问题。感谢您的工作! - Vasil
@Vasil,感谢您的赞美之词。我很高兴您觉得它有帮助。 - arif

16

Docker服务就像容器的"蓝图"。例如,您可以将简单的工作程序定义为一个服务,然后将该服务扩展到20个容器以快速处理队列。之后,您可以将该服务缩减回3个容器。此外,通过Swarm,这些容器可以部署到群集的不同节点上。

但是,我也建议阅读文档,就像@Tristan建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接