Docker Swarm 教程-第2部分: 推镜像到 Azure
写于2019-2-11。第2部分推送镜像就结束了。
第2部分接着 第1部分
第1部分做了什么
- 介绍了这个教程系列的目标是什么:学习如何手动部署容器到单台机器的 Docker Swarm 里。
- 介绍了 Docker 和 Docker Swarm 的必要性(解决了什么问题)
- 介绍了什么是容器编排工具(Docker Swarm 就是容器编排工具之一)
- 介绍了为什么选 Docker Swarm (而不是其他工具)作为本次教程的容器编排工具。
第2部分的目标
把镜像推送到 Azure。第2部分就算结束了。
步骤如下
第1步. 把服务器配置好(因为 Swarm 和程序都要在上面跑)
第2步. 打包 Docker 镜像
第3步. 把镜像推到容器仓库 (Container Registry)
注意1:我们没有做的是:Secret 和 Config 如何管理。数据库怎么配。
因为这是入门教程,越简单越好,而不是一上来弄一大堆东西然后从入门到放弃。
注意2:我们只用1台机器部署 Docker Swarm。
不是多台。适合小项目。
(如果业务上来了需要多台机器,照着文档加机器就行了。这篇教程必须简单,所以就不写了)
(小声说: 其实我也不会…还没有实践过)
英文好的同学可以去 katacoda 照着教程敲一下
本系列教材使用微软 Azure 进行演示
Azure 没有什么特殊的,这里只需要随便找一台机器就行了。
最低配置是多少我也不确定,你开个4G或者8G内存的机器就够了。
我用 Azure 因为有免费代金券。
不想开 Digital Ocean 或 UCloud 因为得花钱💰
注意3:我们这里用私有容器仓库(Container Registry) 来存放 Docker Image,
因为机器是 Azure 的,
我干脆也用 Azure 的 Container Registry。
此处你可以任意选择,
谷歌的,亚马逊的,Docker Hub。
想看国内有什么免费的私有容器仓库,可以参考这篇文章
步骤详情
第1步: 在 Azure 上开一台机器,然后进行配置(因为 Swarm 和程序都要在上面跑)
我这台机器叫 test-azure
配置是8G内存,IP地址也指出来了
-
确保 Docker 装好了。可以跑
docker version
验证一下。
我是直接以 root 身份安装 Docker 的。 -
确保 Docker Swarm 开了。
运行docker swarm init
这一步有可能出错,提示 --advertise-addr,需要你选一个 IP 地址,此时你可以选外网的地址。
可以参考文档 或者直接搜谷歌解决问题。 -
确保端口开了。
所有云主机都有开端口的概念。我们这里程序跑在 3000 端口,所以记得开 3000 端口。
Azure 打开端口的方法如下:点击 Networking
Destination port ranges 填 3000
- 接下来可以做一些为了方便的操作(和 Swarm 无关)
比如跑一下 ssh-copy-id,不用每次 ssh 都要输入密码了。
服务器现在配好了,我们进行下一步
第2步: 登录 Azure 新建一个私有 Docker 容器仓库 (Container Registry)
因为待会我们要把镜像推送到这里,我们先新建一个仓库,这样才有地方推。
在顶部搜 container 然后找 registry。
新建一个仓库之后长这样:
我这里随便取了一个名字叫 c1c7c。你可以任意取名字。
找一下登录信息,我们待会要用这个信息进行 docker login。
3 和 4 和 5 都记下来,待会用得到。
我这里有一个 password 和 password2, 你那边可能只有1个,我们只需要1个就行了
第3步: 构建(build) Docker 镜像
为了方便读者,代码已经在 Github 公开了:
https://github.com/1c7/docker-swarm-tutorial
注意,我们这里先不解释,我们先把代码跑起来,其他的放到后面再说
因为我觉得拉一个新的 Ruby on Rails 5 代码库(rails new 新建出来的)
然后我一步步教怎么写 Dockerfile
, docker-compose.yml
, docker-stack.yml
然后解释每一行的含义,这样文章会很长很无聊。
我们先跑起来,能访问了,有一些成就感,细节之后再解释。
第3.1步:访问 Google Cloud Platform 开一个 Cloud Shell
(Google Cloud Platform 缩写 GCP)
这一步的目的在于:开一个命令行环境,让我们可以跑之后的命令。
之所以不在本地跑命令,而是用这个 Cloud Shell。
一方面是因为我本地的 Docker 似乎有些问题,docker build 命令会卡住。
(你的机器可能没有问题)
为了后续的演示我只能用这个。
另一方面是为了方便,Google 推镜像到 Azure 速度快一些,
如果在你的机器上跑命令,推镜像的速度就完全取决于你的网速了。
打开方法如下:
访问你的 GCP 首页
点击右上角这个图标
就打开了 Cloud Shell。
写几句话介绍一下 Cloud Shell
这个 Cloud Shell 是单独的,和你在 GCP 有没有开 Compute Engine(机器)完全没关系。
文档这里写着呢
不想看上图里那些小字没关系,这几张图的重点是:
- Cloud Shell 是免费的
- 配置是 0.5 vCPU, 1.70 GB 内存,(因为用的是 g1-small, 上面3张图写着呢)
- 硬盘: 5G
- 使用时间: 60小时 (不知道多久重置一次,我翻了文档没找到)
重点是:我们现在有个环境可以跑命令了
第3.2步:把代码库复制下来
在 Cloud Shell 里运行:
git clone --branch part1-to-3 https://github.com/1c7/docker-swarm-tutorial.git docker-swarm-tutorial
注意这里 clone 的是 part1-to-3 这个分支。不是 master 分支
因为这系列教程后面的部分会不断改代码,我们把 master 分支存最新的代码。
不同部分的教程就用不同的分支。
part1-to-3 这个分支是用于第1部分到第3部分的教程。
因为第4部分的教程我们会改代码,如果全部教程共用 master 分支。会造成问题的。
第3.3步,Docker 登录 Azure 的 Container Registry。
在 Cloud Shell 里运行:
docker login [你的 Azure Login Server](红字: 3. 待会登录到这里)
username: [你的用户名](红字: 4.用户名)
password: [你的密码](红字: 5.密码)
前面我们拿过这个了,我再贴一次图
举个例子,我跑的是:
docker login c1c7c.azurecr.io
username: c1c7c
password: [密码隐藏]
可以看到 Login Successed,代表登录成功了。
重点是:docker login 登录之后就可以 docker push 推送镜像上去了
第3.4步: 构建镜像
先进入代码目录
cd docker-swarm-tutorial
构建镜像
docker build --tag c1c7c.azurecr.io/c1c7c/myapp:v1 .
注意最后面有个句号 .
,而且句号前面有个空格。不能漏了。
这条命令你需要修改成你的代码仓库和用户名,前面的图再贴一次。
格式是:
docker build --tag (红字: 3. 待会登录到这里)/(红字: 4.用户名)/myapp:v1 .
我解释一下 docker build --tag c1c7c.azurecr.io/c1c7c/myapp:v1 .
是什么意思:
这里 --tag
的意思是给镜像打标签。这里的参数是 c1c7c.azurecr.io/c1c7c/myapp:v1
c1c7c.azurecr.io
是 Azure 的镜像仓库地址c1c7c
是用户名myapp
是镜像的名字v1
是镜像 tag。我们这里用 v1 代表 version 1, 第一版。以后更新的时候我们改成 v2.
最后这个点代表当前目录,docker 会在里面找 Dockerfile
跑命令会像这样:
执行完之后可以看到成功了:
第4步. 把镜像推送到容器仓库 (Container Registry)
运行以下命令:
docker push c1c7c.azurecr.io/c1c7c/myapp:v1
看起来像这样:
第5步: 去 Azure 上看一下是不是成功了。
成功了,看得到 myapp
我们成功做了什么
- 构建镜像
- 推送镜像
文章到这里已经有点太长了,我们新开一个部分。