Docker组合连续部署设置

我正在寻找一种方法来部署docker-compose图像和/或构build到远程服务器,具体但不限于DigitalOcean VPS。

docker docker-compose目前正在使用CircleCI持续集成服务,它将自动validationtesting通过。 但是,它应该自动部署成功

docker-compose.yml看起来像这样:

 version: '2' services: web: image: name/repo:latest ports: - "3000:3000" volumes: - /app/node_modules - .:/app depends_on: - mongo - redis mongo: image: mongo command: --smallfiles volumes: - ./data/mongodb:/data/db redis: image: redis volumes: - ./data/redis:/data 

docker-compose.override.yml

 version: '2' services: web: build: . 

circle.yml相关部分:

 deployment: latest: branch: master commands: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker push name/repo:$CIRCLE_SHA1 - docker push name/repo:latest 

你的docker-composecircleconfiguration已经很不错了。

docker-compose.yml已经设置为从Docker Hub收集镜像,镜像在testing通过后正在上传。 我们将在远程服务器上使用这个映像,而不是每次构build映像(这需要很长时间),我们将使用这个已经准备好的映像。

你很好的分离了build: . 进入docker-compose.override.yml文件,因为如果我们使用 docker-compose.override.yml文件, 可能会出现优先级问题 。

让我们开始部署:

有多种方法可以完成部署。 最stream行的可能是SSH和Webhooks。

我们将使用SSH。

编辑你的circle.ymlconfiguration文件来执行额外的步骤,加载我们的.scripts/deploy.sh bash文件:

 deployment: latest: branch: master commands: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker push name/repo:$CIRCLE_SHA1 - docker push name/repo:latest - .scripts/deploy.sh 

deploy.sh将包含一些通过SSH连接到远程服务器的说明,并更新存储库和Docker镜像并重新加载Docker Compose服务。

在执行之前,你应该有一个包含你的项目文件夹(即git clone https://github.com/zurfyx/my-project )的远程服务器,并且都安装了Docker和Docker Compose 。

deploy.sh

 #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ( cd "$DIR/.." # Go to project dir. ssh $SSH_USERNAME@$SSH_HOSTNAME -o StrictHostKeyChecking=no <<-EOF cd $SSH_PROJECT_FOLDER git pull docker-compose pull docker-compose stop docker-compose rm -f docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d EOF ) 

注意:最后一个EOF没有缩进。 这就是HEREDOC的工作方式。

deploy.sh步骤解释:

  1. ssh $SSH_USERNAME@$SSH_HOSTNAME :通过SSH连接到远程主机。 -o StrictHostChecking=no避免SSH询问我们是否信任服务器。
  2. cd $SSH_PROJECT_FOLDER :浏览到项目文件夹(通过git clone ...收集的文件夹git clone ...
  3. git pull :更新项目文件夹。 保持docker-compose / Dockerfile更新以及依赖某些源代码文件的共享卷是非常重要的。
  4. docker-compose stop :我们的远程依赖关系刚刚被下载。 停止当前正在运行的docker-compose服务。
  5. docker-compose rm -f :删除docker-compose服务。 这一步真的很重要,否则我们会重用旧卷 。
  6. docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d 。 执行您docker-compose.prod.yml ,它以分离模式扩展docker-compose.yml

在您的CI上,您需要填写以下环境variables(即部署脚本使用的):

  • $SSH_USERNAME :你的SSH用户名(即root)
  • $SSH_HOSTNAME :你的SSH主机名(即stackoverflow.com)
  • $SSH_PROJECT_FOLDER :存储项目的文件夹(相对或绝对地位于$SSH_USERNAMElogin的位置)(即my-project /)

什么SSH密码? CircleCI在这种情况下提供了一种存储SSH密钥的方式,所以在通过SSHlogin时不再需要密码。

否则,只需编辑deploy.sh SSH连接,如下所示:

 sshpass -p your_password ssh user@hostname 

更多关于SSH密码的信息

总之,我们所要做的就是创build一个脚本,与我们的远程服务器连接,让它知道源代码已经更新。 那么,并执行适当的升级步骤。

仅供参考,这与替代Webhooks方法的工作方式类似。