Docker撰写持续部署设置

zur*_*fyx 5 deployment continuous-deployment docker docker-compose

我正在寻找一种方法将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
Run Code Online (Sandbox Code Playgroud)

docker-compose.override.yml:

version: '2'
services:
  web:
    build: .
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

zur*_*fyx 7

docker-composecircle配置已经看起来很不错了.

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

你做的很好进入分离build: .成一个docker-compose.override.yml文件,作为优先问题可能会出现,如果我们使用一个docker-compose.prod.yml文件.

让我们开始部署:

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

我们将使用SSH.

编辑您的circle.yml配置以执行额外步骤,以加载我们的.scripts/deploy.shbash文件:

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
Run Code Online (Sandbox Code Playgroud)

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
)
Run Code Online (Sandbox Code Playgroud)

注意:最后一个EOF没有缩进.这就是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服务.这一步非常重要,否则我们将重用旧卷.
  6. docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d.执行你在分离模式下docker-compose.prod.yml扩展的docker-compose.yml.

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

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

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

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

sshpass -p your_password ssh user@hostname
Run Code Online (Sandbox Code Playgroud)

更多关于SSH密码的信息.

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

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

  • 当我们使用“docker-compose rm -f”删除卷时,我们是否也会丢失 Mongo 中的所有数据? (2认同)