第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 照着教程敲一下
katacoda website

本系列教材使用微软 Azure 进行演示

Azure 没有什么特殊的,这里只需要随便找一台机器就行了
最低配置是多少我也不确定,你开个4G或者8G内存的机器就够了。

我用 Azure 因为有免费代金券。
不想开 Digital Ocean 或 UCloud 因为得花钱💰

注意3:我们这里用私有容器仓库(Container Registry) 来存放 Docker Image,
因为机器是 Azure 的,
我干脆也用 Azure 的 Container Registry。
此处你可以任意选择,
谷歌的,亚马逊的,Docker Hub。
想看国内有什么免费的私有容器仓库,可以参考这篇文章

步骤详情

第1步: 在 Azure 上开一台机器,然后进行配置(因为 Swarm 和程序都要在上面跑)

我这台机器叫 test-azure
az1

配置是8G内存,IP地址也指出来了
az22

  1. 确保 Docker 装好了。可以跑 docker version 验证一下。
    我是直接以 root 身份安装 Docker 的。

  2. 确保 Docker Swarm 开了。
    运行 docker swarm init
    这一步有可能出错,提示 --advertise-addr,需要你选一个 IP 地址,此时你可以选外网的地址。
    可以参考文档 或者直接搜谷歌解决问题。

  3. 确保端口开了。
    所有云主机都有开端口的概念。我们这里程序跑在 3000 端口,所以记得开 3000 端口。

Azure 打开端口的方法如下:点击 Networking
az3

Destination port ranges 填 3000
az4

  1. 接下来可以做一些为了方便的操作(和 Swarm 无关)
    比如跑一下 ssh-copy-id,不用每次 ssh 都要输入密码了。

服务器现在配好了,我们进行下一步

第2步: 登录 Azure 新建一个私有 Docker 容器仓库 (Container Registry)

因为待会我们要把镜像推送到这里,我们先新建一个仓库,这样才有地方推。

在顶部搜 container 然后找 registry。
search

新建一个仓库之后长这样:
docker-container
我这里随便取了一个名字叫 c1c7c。你可以任意取名字。

找一下登录信息,我们待会要用这个信息进行 docker login。
access_key
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 首页
gcp

点击右上角这个图标
gcp2

就打开了 Cloud Shell。
gcp3

写几句话介绍一下 Cloud Shell

这个 Cloud Shell 是单独的,和你在 GCP 有没有开 Compute Engine(机器)完全没关系。
文档这里写着呢
spec
machine-spec
hour
free

不想看上图里那些小字没关系,这几张图的重点是:

  • 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.密码)

前面我们拿过这个了,我再贴一次图
access_key

举个例子,我跑的是:

docker login c1c7c.azurecr.io
username: c1c7c
password: [密码隐藏]

login-success
可以看到 Login Successed,代表登录成功了。

重点是:docker login 登录之后就可以 docker push 推送镜像上去了

第3.4步: 构建镜像

先进入代码目录

cd docker-swarm-tutorial

构建镜像

docker build --tag c1c7c.azurecr.io/c1c7c/myapp:v1 .

注意最后面有个句号 .,而且句号前面有个空格。不能漏了。

这条命令你需要修改成你的代码仓库和用户名,前面的图再贴一次。
access_key

格式是:

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

跑命令会像这样:
tag

执行完之后可以看到成功了:
tag-success

第4步. 把镜像推送到容器仓库 (Container Registry)

运行以下命令:

docker push c1c7c.azurecr.io/c1c7c/myapp:v1

看起来像这样:
docker-push

第5步: 去 Azure 上看一下是不是成功了。

success-push

成功了,看得到 myapp

我们成功做了什么

  1. 构建镜像
  2. 推送镜像

文章到这里已经有点太长了,我们新开一个部分。

下一个部分

第3部分