Docker服务和Docker容器之间有什么区别?

Docker服务和Docker容器之间有什么区别?,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我们什么时候使用docker服务创建命令,什么时候使用docker运行命令?您可能需要阅读“ 根据这些幻灯片,“docker服务创建”类似于“进化的”docker运行。如果您想Docker run将启动单个容器,则需要创建一个“服务” 使用docker服务,您可以管理一组容器(来自同一图像)。您可以缩放它们(启动多个容器)或更新它们。Docker服务就像容器的“蓝图”。例如,您可以将一个简单的worker定义为一个服务,然后将该服务扩展到20个容器,以便真正快速地通过队列。之后,您可以再次将该服

我们什么时候使用
docker服务创建
命令,什么时候使用
docker运行
命令?

您可能需要阅读“


根据这些幻灯片,“docker服务创建”类似于“进化的”docker运行。如果您想

Docker run将启动单个容器,则需要创建一个“服务”

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

Docker服务就像容器的“蓝图”。例如,您可以将一个简单的worker定义为一个服务,然后将该服务扩展到20个容器,以便真正快速地通过队列。之后,您可以再次将该服务缩减到3个容器。此外,通过Swarm,这些容器可以部署到Swarm的不同节点


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

简而言之:当您使用Docker swarm配置主节点时,通常使用Docker服务,这样Docker容器将在分布式环境中运行,并且可以轻松管理

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

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

资料来源:

码头服务: Docker服务将是某个更大应用程序上下文中的微服务的映像。服务的示例可能包括HTTP服务器、数据库或希望在分布式环境中运行的任何其他类型的可执行程序

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

  • swarm将在swarm之外提供服务的端口
  • 用于服务连接到swarm中其他服务的覆盖网络
  • CPU和内存限制和保留
  • 滚动更新策略
  • 要在群中运行的映像副本数
来源:

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

docker service create --name MY_SERVICE_NAME --replicas 3 IMAGE:TAG
创建MY_SERVICE_NAME服务的3个任务,该服务基于IMAGE:TAG IMAGE


可以找到更多信息

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

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

因此,当您运行
docker run
docker cli
创建对
dockerd
守护进程的API查询,以运行指定的容器

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

群集模式(或群集模式)
当您想要或需要利用集群计算的优势,如高可用性、容错性、水平可扩展性时,您可以使用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  

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

因此,在扩展容器时,我可以将它们部署到不同的工作节点吗?如果是,我可以从主节点将容器分配给工作节点吗?@KunalSehegal Scaling在服务以复制模式运行时适用。在扩展服务时,可以提供约束&swarm将在与约束匹配的节点上部署服务器。Docker服务是特定Docker容器的集合吗?如果知道服务名称(人类可读的名称)或服务ID(字母数字)名称,则使用“服务管理一组容器”(都是通过执行docker service ls)然后如何获得属于该组的docker容器的ID列表。这样,您就可以通过ssh连接到这些容器中的任何一个?对我来说,这似乎是人们想做的事情,就像我一样,但答案似乎非常难以捉摸,因为我一直在搜索。。。(感谢您的阅读,希望您能分享您的想法)。