shell执行docker命令卡挂住_Docker官方文档翻译4

e839a79767e6fe6dd279b4b11b2c4a2c.png

第四篇:Swarms

准备工作

  • 安装Docker版本1.13或更高版本。
  • 安装Docker compose。
  • 安装docker machine
  • 阅读第1 2 3部分的内容。
  • 确保你已发布并推送到注册仓库的friendlyhello镜像。
  • 确保你的镜像可以部署为一个容器。 运行这个命令,在你的信息中插入用户名,repo和标签:docker run -p 80:80 username / repo:tag,然后访问http:// localhost /。
  • 第3部分复制docker-compose.yml文件。

介绍

在第3部分中,介绍了你在第2部分中编写的应用程序,并定义了它应该如何在生产环境中运行,将其转化为服务,并在此过程中将其扩展5倍实例。

在第4部分中,将此应用程序部署到群集上,并在多台机器上运行它。 通过将多台机器连接到称为swarm的“Dockerized”群集,使多容器,多机器应用成为可能。

理解Swarm clusters

Swarm是一组运行Docker并加入到集群中的机器。加入到集群中之后,你将继续运行你习惯的Docker命令,但现在它现在在Docker Swarm的集群上执行。集群中的机器可以是物理的也可以是虚拟的。加入集群后,单个容器被称为节点。

Swarm manager可以使用多种策略来运行容器,例如“emptiest node” - 它可以使用容器填充使用率最低的机器。或者“global”,它确保每台机器只获取指定容器的一个实例。swarm managerd的这些策略需要在Compose文件中指定。

Swarm manager是群体中唯一可以执行你的命令的机器,或者授权其他机器作为worker加入到群体中。workers只是在那里提供能力,并没有权力告诉任何其他机器可以做什么和不可以做什么。

到目前为止,您已经在本地机器上以单主机模式使用Docker。但是Docker也可以切换到群集模式,这就是使用群集的原因。立即启用群模式使当前的机器成为群管理器。从此,Docker将运行您在您管理的群集上执行的命令,而不仅仅是在当前机器上执行。

设置你的集群

一个swarm是由多个节点组成,节点可以是物理或者虚拟的机器。它的基本概念足够简单:运行docker swarm init 命令能够开启swarm模式,并且使你的当前机器成为swarm manager,运行docker swarm join命令能够让其他机器加入到 swarm 中成为worker机器。选择的下面的选项卡,看看它是如何各自情况下发挥作用的。我们使用虚拟机快速创建一个双机集群,并且将其变成swarm.

创建集群

你需需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此请为你的计算机的操作系统安装Oracle VirtualBox。

现在,创建两个vm使用docker-machine ,使用VirtualBox 驱动:

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

查看vm列表并获取它们的ip地址

你现在有2个vms创建,名字为myvm1和myvm2。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.2-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.2-ce

初始化swarm 并且添加节点

第一个机器扮演的是manager的角色,它可以执行管理命令并且验证worker 加入到 swarm中去,第二个是worker。

你可能发送命令到您的vms通过docker-machine ssh。指示myvm1成为一个拥有docker swarm init的swarm manager并输出如下:

$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
Swarm initialized: current node <node ID> is now a manager.

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

  docker swarm join 
  --token <token> 
  <myvm ip>:<port>

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

如您所见,对docker swarm init的响应包含一个预配置的docker swarm join命令,您可以在要添加的任何节点上运行该命令。 复制这个命令,并通过docker-machine ssh将它发送到myvm2,让myvm2作为一个worker加入你的新群体:

$ docker-machine ssh myvm2 "docker swarm join 
--token <token> 
<ip>:2377"

This node joined a swarm as a worker.

恭喜,你已经成功创建了你的第一个swarm。

运行docker node ls在manager机器上去查看swarm 中的节点:

$ docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

发布你的应用到swarm cluster中去

最难的部分已经完结。现在你只需要重复再第三部分的过程将应用发布到你的swarm中去。请记住只有像myvm1这样的群集管理器才能执行Docker命令; worker只是用来工作的。

配置一个docker-machine命令成为swarm manager

到目前为止,你已经在Docker-machine ssh中将Docker命令包装为与虚拟机交谈。 另一种选择是运行docker-machine env 来获取并运行一个命令,该命令将当前shell配置为与VM上的Docker守护进程进行通信。 此方法对下一步更好,因为它允许您使用本地docker-compose.yml文件“远程”部署应用程序,而无需将其复制到任何位置。

键入docker-machine env myvm1,然后复制粘贴并运行作为输出最后一行提供的命令,以将shell配置为与swarm管理器myvm1对话。

配置shell的命令根据你是Mac,Linux还是Windows而有所不同,因此下面的选项卡中显示了每个命令的示例。

MAC或LINUX上的DOCKER MACHINE SHELL环境

运行docker-machine env myvm1命令去得到命令配置你的shell与myvm1交互。

$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)

运行给定的命令来配置你的shell与myvm1进行通信。

eval $(docker-machine env myvm1)

运行docker-machine ls命令去校验现在这个活动的机器,如旁边的星号所示。:

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.2-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.2-ce

在swarm manager中部署容器

现在你已经有了myvm1,你可以使用它的权利作为swarm manager器发布你的app通过使用第3部分中用于myvm1的相同docker stack deploy命令和docker-compose.yml的本地副本来部署您的应用程序。此命令可能需要几秒钟才能完成,部署的服务需要一段时间才能提供服务。在swarm管理器上使用docker service ps 命令验证所有服务是否已被重新部署。

你通过docker-machine shell配置连接到myvm1,并且你仍然可以访问本地主机上的文件。 确保你和之前操作在同一个目录下,其中包括你在第3部分中创建的docker-compose.yml文件。

和之前一样,运行下面的命令在mym1机器上部署应用。

docker stack deploy -c docker-compose.yml getstartedlab

正是这样,应用在swarm 集群中国部署了!

现在,你可以使用第3部分中使用的相同docker命令。只有这一次,请注意,服务(及相关容器)已在myvm1和myvm2之间分配。

$ docker stack ps getstartedlab

ID            NAME                  IMAGE                   NODE   DESIRED STATE
jq2g3qp8nzwx  getstartedlab_web.1   john/get-started:part2  myvm1  Running
88wgshobzoxl  getstartedlab_web.2   john/get-started:part2  myvm2  Running
vbb1qbkb0o2z  getstartedlab_web.3   john/get-started:part2  myvm2  Running
ghii74p9budx  getstartedlab_web.4   john/get-started:part2  myvm1  Running
0prmarhavs87  getstartedlab_web.5   john/get-started:part2  myvm2  Running

访问你的集群

你可以从myvm1或myvm2的IP地址访问你的应用程序。

你创建的网络在它们之间共享并负载平衡。 运行docker-machine ls来获取虚拟机的IP地址,并在浏览器中访问它们中的任何一个,并刷新(或者通过curl请求)。

3c2996229eeaf50c6a3faa059a865dd6.png

有五个可能的容器ID全部随机轮训,来实现负载平衡。

两个IP地址工作的原因是群中的节点参与入口路由网格。 这可以确保部署在群集中某个端口的服务始终将该端口保留给自己,而不管实际运行容器的节点是什么。 以下是三节点群上端口8080上发布的名为my-web的服务的路由网格示意图:

71599c3902fc68a546239f28aa93a8de.png

迭代和扩展应用程序

从这里你可以完成你在第二部分和第三部分中学到的一切。

通过更改docker-compose.yml文件来扩展应用程序。

通过编辑代码更改应用程序行为,然后重新构建并推送新镜像。 (要做到这一点,请按照与之前构建应用程序和发布镜像相同的步骤进行操作。

无论哪种情况,只需简单地再次运行docker stack deploy来部署这些更改。

你可以使用你在myvm2上使用的相同docker swarm join命令将任何物理或虚拟机器加入此群集。之后只需运行Docker堆栈部署,并且你的应用可以利用新资源。

清除和重启

Stacks and swarms(堆栈和集群)

你能通过docker stack rm卸载堆栈。例如:

docker stack rm getstartedlab

取消设置docker-machine shell变量设置

你可以使用给定的命令取消当前shell中的docker-machine环境变量。在mac或者linux环境中命令如下:

eval $(docker-machine env -u)

这将shell与docker-machine创建的虚拟机断开连接,并允许您继续在同一个shell中工作,现在使用本机docker命令(例如,在Docker for Mac或Docker for Windows上)。 要了解更多信息,请参阅关于取消设置环境变量的机器主题。

重启Docker machines

如果不关闭你的本地主机,Docker machines将会停止运行。你能通过运行docker-machine ls命令来检查机器的状态。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
myvm1   -        virtualbox   Stopped                 Unknown
myvm2   -        virtualbox   Stopped                 Unknown

要重新启动已停止的计算机,请运行以下命令:

docker-machine start <machine-name>

例如:

$ docker-machine start myvm1
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

$ docker-machine start myvm2
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

总结

在第4部分中,你了解了群体是什么,群体中的节点如何成为manager或workwer,创建群体并在其上部署应用程序。 你看到Docker的核心命令并没有从第3部分改变,他们只需要将目标锁定在swarm master上。 你还看到了Docker网络的力量,即使它们运行在不同的机器上,也可以跨容器保持负载平衡请求。 最后,你学习了如何在集群上迭代和缩放应用程序。

以下是一些您可能想要运行的命令,以便与你的群集和虚拟机进行一点交互:

docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1                # View basic information about your node
docker-machine ssh myvm1 "docker node ls"         # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>"        # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker"   # View join token
docker-machine ssh myvm1   # Open an SSH session with the VM; type "exit" to end
docker node ls                # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave"  # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1            # Start a VM that is currently not running
docker-machine env myvm1      # show environment variables and command for myvm1
eval $(docker-machine env myvm1)         # Mac command to connect shell to myvm1
& "C:Program FilesDockerDockerResourcesbindocker-machine.exe" env myvm1 | Invoke-Expression   # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app>  # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u)     # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q)               # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images
### 回答1: 可以使用以下方式在shell脚本中执行docker命令: 1. 直接在脚本中使用docker命令,例如: ``` #!/bin/bash docker run -it --rm ubuntu:latest /bin/bash ``` 2. 将docker命令封装成函数,方便在脚本中调用,例如: ``` #!/bin/bash function run_container() { docker run -it --rm ubuntu:latest /bin/bash } run_container ``` 3. 使用变量传递docker命令参数,例如: ``` #!/bin/bash DOCKER_CMD="docker run -it --rm ubuntu:latest /bin/bash" $DOCKER_CMD ``` 以上是几种常见的在shell脚本中执行docker命令的方式,具体使用哪种方式取决于具体的需求和场景。 ### 回答2: shell脚本执行docker命令是一种在Linux系统下自动化运行Docker容器的方法。这种方法可以让用户在不需要手动输入命令的情况下管理容器,并且可以通过脚本的方式指定容器的运行方式、环境变量、网络配置等。以下是关于shell脚本执行docker命令的详细解释。 Docker是一种宿主机上的应用容器化技术,它能够为应用程序提供隔离和封装的环境,使得在不同的系统上运行应用程序变得更为容易。但是,在实际应用中,需要手动输入docker命令来创建、修改、启动、停止容器,这会浪费大量的时间和精力。而shell脚本执行docker命令正是为了解决这个问题而出现的。 首先,我们需要编写一个shell脚本来控制Docker容器。脚本的基本格式如下: ```bash #!/bin/bash docker run [options] image [command] [args] ``` 其中,#!/bin/bash表示使用bash作为解释器。docker run命令用于启动容器。options是启动容器时需要指定的参数,比如端口映射、环境变量、挂载数据卷等。image是镜像名,command和args是容器内运行的命令和参数。 接下来,我们来看一个简单的实例。假设我们要启动一个Redis容器,并映射宿主机的6379端口到容器内的6379端口: ```bash #!/bin/bash docker run -d --name redis -p 6379:6379 redis ``` 在脚本中,-d参数表示容器在后台运行,--name指定容器的名称,-p指定端口映射,redis为镜像名。 除了启动容器,我们还可以使用shell脚本执行docker命令来停止、删除、查看容器等。例如,我们要停止名为redis的容器,可以使用下面的命令: ```bash #!/bin/bash docker stop redis ``` 其中,stop是docker stop命令的缩写。 除了容器的管理,我们还可以在shell脚本中执行docker镜像的构建、推送、拉取等操作。例如,我们要从Docker Hub拉取最新的Ubuntu镜像: ```bash #!/bin/bash docker pull ubuntu ``` 总的来说,shell脚本执行docker命令可以提高工作效率,避免重复操作,同时还能够精确控制容器的运行环境。当然,使用脚本也存在一些需要注意的问题,例如容器名的冲突、脚本的权限和安全性等。因此,在使用此方法时,需要了解Docker的基本知识,谨慎编写脚本,以确保系统安全和稳定性。 ### 回答3: Docker是一款流行的容器化平台,可以快速部署应用程序并提供可重复的环境。Shell脚本是一种用于自动化执行命令和处理数据的脚本语言。本文将介绍如何使用Shell脚本执行Docker命令。 首先需要安装Docker并了解其基本概念和命令Docker可以通过官方网站下载并安装。安装完成后,可以通过docker命令运行容器、构建镜像、运行命令等。例如下面的命令可以拉取一个镜像并启动一个容器: ``` docker run -d -p 80:80 nginx ``` 这个命令会下载最新版本的Nginx镜像并在容器中运行。容器会将主机的80端口映射到容器的80端口,以便访问Nginx的欢迎页面。现在可以通过http://localhost来访问该页面。 接下来,需要编写一个Shell脚本来执行docker命令。一个最简单的脚本如下: ```bash #!/bin/bash docker run -d -p 80:80 nginx ``` 这个脚本可以运行Docker容器,并将Nginx服务暴露到主机的80端口。然而,这只是一个简单的例子。实际上,Shell脚本可以执行更复杂的任务,例如构建镜像、上传镜像、部署容器等。下面是一个更复杂的脚本: ```bash #!/bin/bash # Build a custom Docker image docker build -t my-image . # Push the image to a Docker registry docker push my-image:latest # Deploy the image to a Kubernetes cluster kubectl apply -f my-deployment.yaml ``` 这个脚本首先使用docker build命令构建一个自定义镜像,然后使用docker push命令将镜像上传到Docker仓库,最后使用kubectl apply命令在Kubernetes集群中部署容器。这个脚本可以通过运行chmod +x script.sh命令授权为可执行文件,并使用./script.sh命令运行。 总体而言,Shell脚本可以让管理员和开发者轻松地自动化执行Docker命令,从而快速、可靠地构建、部署和管理容器化应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值