Docker撰写持续部署设置

时间:2017-02-17 16:19:08

标签: docker deployment docker-compose continuous-deployment

我正在寻找一种方法将docker-compose图像和/或构建部署到远程服务器,特别是但不限于DigitalOcean VPS。

docker-compose目前正在开展CircleCI持续集成服务,它会自动验证测试是否通过。但是,应该在成功时自动部署

我的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

2 个答案:

答案 0 :(得分:7)

您的docker-composecircle配置已经看起来非常不错了。

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

您最好将build: .分隔为docker-compose.override.yml文件,priority issues can arise if we use a docker-compose.prod.yml file

让我们开始部署:

有多种方法可以完成部署。最受欢迎的可能是 SSH 和Webhooks。

我们将使用SSH。

修改您的circle.yml配置以执行额外步骤,以加载我们的.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),并且安装了DockerDocker 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没有缩进。这就是bash HEREDOC的工作方式。

deploy.sh步骤说明:

  1. ssh $SSH_USERNAME@$SSH_HOSTNAME:通过SSH连接远程主机。 -o StrictHostChecking=no避免SSH询问我们是否信任该服务器。
  2. cd $SSH_PROJECT_FOLDER:浏览项目文件夹(您通过git clone ...收集的文件夹)
  3. git pull:更新项目文件夹。这对于更新docker-compose / Dockerfile以及依赖于某些源代码文件的任何共享卷非常重要。
  4. docker-compose stop:刚刚下载了我们的远程依赖项。停止当前正在运行的docker-compose服务。
  5. docker-compose rm -f:删除docker-compose服务。这一步非常重要,否则we'll reuse old volumes
  6. docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d。执行以分离模式扩展docker-compose.prod.yml的{​​{1}}。
  7. 在CI上,您需要填写以下环境变量(部署脚本使用):

    • docker-compose.yml:您的SSH用户名(即root)
    • $SSH_USERNAME:您的SSH主机名(即stackoverflow.com)
    • $SSH_HOSTNAME:存储项目的文件夹(与$SSH_PROJECT_FOLDER登录的位置相对或绝对。(即my-project /)

    SSH密码怎么样?在这种情况下,CircleCI提供了一种存储SSH密钥的方法,因此在通过SSH登录时不再需要密码。

    否则只需将$SSH_USERNAME SSH连接编辑为以下内容:

    deploy.sh

    有关SSH密码here的更多信息。

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

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

答案 1 :(得分:0)

WatchTower为您解决了这个问题。

https://github.com/v2tec/watchtower

您的CI只需构建映像并推送到注册表。然后,WatchTower每N秒钟轮询一次注册表,并使用最新和最好的映像自动重启服务。只需将以下代码添加到您的撰写yaml中即可:

watchtower:
image: v2tec/watchtower
volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  - /root/.docker/config.json:/config.json
command: --interval 30