Docker Service和Docker Container有什么区别?

Kun*_*gal 53 docker dockerfile docker-compose

我们什么时候使用docker service create命令,什么时候使用docker run命令?

Vis*_*esn 29

简而言之: Docker服务主要用于使用Docker swarm配置主节点时,因此docker容器将在分布式环境中运行,并且可以轻松管理.

Docker run: docker run命令首先在指定的图像上创建一个可写容器层,然后使用指定的命令启动它.

也就是说,docker run相当于API/containers/create then/containers /(id)/ start

来源:https://docs.docker.com/engine/reference/commandline/run/#parent-command

Docker服务: Docker服务将是一些较大应用程序环境中微服务的映像.服务示例可能包括HTTP服务器,数据库或您希望在分布式环境中运行的任何其他类型的可执行程序.

创建服务时,您可以指定要使用的容器映像以及在运行容器中执行的命令.您还可以定义服务的选项,包括:

  • 群集将在群组外部提供服务的端口
  • 服务的覆盖网络,以连接到群中的其他服务
  • CPU和内存限制和预留
  • 滚动更新政策
  • 要在群中运行的图像的副本数

来源:https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#services-tasks-and-containers


muh*_*mad 17

您可以通过两种方式使用 docker。

1. 单机模式


当您使用独立模式时,您仅在一台机器上安装了 docker 守护进程。在这里,您可以在该机器上创建/销毁/运行单个容器或多个容器。

所以当你跑步时docker run;创建docker-cli对守护进程的 API 查询dockerd以运行指定的容器。

因此,您对该命令所做的操作docker run只会影响您运行该命令的单个节点/计算机/主机。如果您使用容器添加卷或网络,那么这些资源将仅在您运行命令的单个节点中可用docker run

2. 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
Run Code Online (Sandbox Code Playgroud)

一段时间后,当您觉得需要扩展工作负载时,您添加了另一台名为 的计算机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.

Run Code Online (Sandbox Code Playgroud)

现在,从第一个节点开始,我运行了以下命令来扩展服务。

####### 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  
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要扩展您的 app1,则不能,因为您已经使用独立模式创建了容器。


Tri*_*tan 15

您可能希望阅读" docker service is the new docker run "

根据这些幻灯片,"docker service create"就像一个"进化的"docker run.如果要将容器部署到Docker Swarm,则需要创建"服务"


Wil*_*rin 11

Docker服务就像容器的"蓝图".您可以将一个简单的工作服务器定义为服务,然后将该服务扩展到20个容器,以便快速通过队列.然后再次将该服务缩减到3个容器.此外,通过Swarm,这些容器可以部署到您的swarm的不同节点.

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


Jul*_*ian 10

Docker运行将启动一个容器.

使用docker服务,您可以管理一组容器(来自同一图像).您可以缩放它们(启动多个容器)或更新它们.


Teo*_*kis 7

  • docker run用于创建独立容器
  • docker service create用于创建在计算机集群(称为swarm)(称为node)中运行的该服务的实例(称为task)。这些任务是库的容器,但不是独立的容器。从某种意义上说,服务在实例化任务时充当模板。

例如

docker service create --name MY_SERVICE_NAME --replicas 3 IMAGE:TAG
Run Code Online (Sandbox Code Playgroud)

创建基于IMAGE:TAG图像的MY_SERVICE_NAME服务的3个任务。

更多信息可以在这里找到