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-compose
和circle
configuration已经很不错了。
您docker-compose.yml
已经设置为从Docker Hub收集镜像,镜像在testing通过后正在上传。 我们将在远程服务器上使用这个映像,而不是每次构build映像(这需要很长时间),我们将使用这个已经准备好的映像。
你很好的分离了build: .
进入docker-compose.override.yml
文件,因为如果我们使用 docker-compose.override.yml
文件, 可能会出现优先级问题 。
让我们开始部署:
有多种方法可以完成部署。 最stream行的可能是SSH和Webhooks。
我们将使用SSH。
编辑你的circle.yml
configuration文件来执行额外的步骤,加载我们的.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步骤解释:
-
ssh $SSH_USERNAME@$SSH_HOSTNAME
:通过SSH连接到远程主机。-o StrictHostChecking=no
避免SSH询问我们是否信任服务器。 -
cd $SSH_PROJECT_FOLDER
:浏览到项目文件夹(通过git clone ...
收集的文件夹git clone ...
) -
git pull
:更新项目文件夹。 保持docker-compose / Dockerfile更新以及依赖某些源代码文件的共享卷是非常重要的。 -
docker-compose stop
:我们的远程依赖关系刚刚被下载。 停止当前正在运行的docker-compose服务。 -
docker-compose rm -f
:删除docker-compose服务。 这一步真的很重要,否则我们会重用旧卷 。 -
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_USERNAME
login的位置)(即my-project /)
什么SSH密码? CircleCI在这种情况下提供了一种存储SSH密钥的方式,所以在通过SSHlogin时不再需要密码。
否则,只需编辑deploy.sh
SSH连接,如下所示:
sshpass -p your_password ssh user@hostname
更多关于SSH密码的信息
总之,我们所要做的就是创build一个脚本,与我们的远程服务器连接,让它知道源代码已经更新。 那么,并执行适当的升级步骤。
仅供参考,这与替代Webhooks方法的工作方式类似。