使用GitLab CI和Docker进行容器应用自动化部署
容器 Docker 越來越受開發者和運維人員的喜愛,更是作為實踐 DevOps 的一個中要工具。同時 Gitlab 提供了免費的代碼管理服務,其 gitlab-ci 更是提供了強大的自動化 CI/CD 流程功能。
本文以一個靜態站點的示例來說明如何使用 gitlab-ci 和 docker 進行容器鏡像的構建,以及如何將鏡像自動化部署到目標服務器上。如果你想和更多Docker技術專家交流,可以加我微信liyingjiese,備注『加群』。群里每周都有全球各大公司的最佳實踐以及行業最新動態。
編寫Dockerfile
首先在代碼庫中增加 Dockerfile ,用于描述如何構建應用的容器鏡像。以下是一個基于 Hugo 的靜態站點應用的示例:
FROM?mengzyou/hugo:latest?as?builderCOPY?.?/app/RUN?hugoFROM?nginx:1.16-alpineRUN?set?-x?\ &&?rm?-f?/etc/nginx/conf.d/default.conf?\ &&?mkdir?-p?/usr/share/nginx/htmlCOPY?--from=builder?/app/nginx-default.conf?/etc/nginx/conf.d/default.conf COPY?--from=builder?/app/public/?/usr/share/nginx/html
其實非常簡單,使用了多階段構建,以?mengzyou/hugo?作為構建鏡像,然后將生成的靜態文件拷貝到 Nginx 鏡像中,最終生成靜態站點的鏡像。
配置Gitlab-ci構建容器鏡像
該階段,在項目根目錄添加 .gitlab-ci.yml 文件,示例內容如下:
variables: DOCKER_DRIVER:?overlay2 CI_REGISTRY_IMAGE:?${CI_REGISTRY}/mengzyou/appbefore_script: -?echo?$CI_JOB_NAME -?echo?$CI_PROJECT_DIRstages: -?buildbuild:docker: stage:?build variables: DOCKER_HOST:?tcp://docker:2375 image:?docker:stable services: -?docker:dind script: -?echo?"Building?image?-?$CI_REGISTRY_IMAGE:latest" -?echo?"$CI_REGISTRY_PASSWORD"?|?docker?login?-u?"$CI_REGISTRY_USER"?--password-stdin?$CI_REGISTRY -?docker?image?build?--force-rm?--no-cache?-t?$CI_REGISTRY_IMAGE:latest?. -?docker?image?push?$CI_REGISTRY_IMAGE:latest only: -?master
其中有幾個變量是需要在代碼庫的 GitLab 上進行配置,如下圖所示:
正在上傳…重新上傳取消
因為直接是用了 GitLab 提供的容器鏡像服務,構建完成的鏡像需要推送到該鏡像倉庫服務,所以需要配置相應的倉庫地址,用戶名和登錄密碼:
- CI_REGISTRY:倉庫地址,如 registry.gitlab.com
- CI_REGISTRY_USER:GitLab 的訪問用戶名
- CI_REGISTRY_PASSWORD:GitLab 的訪問密碼
這樣在推送鏡像之前,需要進行一次登錄操作。更多關于如何是用 Gitlab 容器鏡像倉庫可參考?https://docs.gitlab.com/ee/use ... .html?。
該 Pipeline 工作使用了 GitLab Runner 的 Docker 執行器,如果是自己安裝和注冊 gitlab-runner ,請參考其文檔。這里直接是用了 Gitlab.com 分享的 Runner 。
安裝用于部署的gitlab-runner
為了在目標服務器上使用 gitlab-ci 進行自動部署(運行容器),需要在目標服務器上安裝和注冊 gitlab-runner 。由于目標服務器上運行容器,因此應該首先安裝好 Docker 環境,同時 gitlab-runner 也直接是用容器運行(當然也可以直接本地運行,具體可以查看 gitlab-runner 的文檔)。
安裝注冊Runner
可以使用 docker-compose 來部署 gitlab-runner 容器,在目標服務器上的 ~/gitalb/ 目錄下編寫如下 docker-compose.yml 文件:
version:?'2.4'services: runner: image:?gitlab/gitlab-runner:alpine-v11.11.0 container_name:?gitlab_runner restart:?always network_mode:?bridge volumes:-?./config/:/etc/gitlab-runner/-?/var/run/docker.sock:/var/run/docker.sock
創建目錄 config 用于保存 runner 的配置:
然后啟動 runner 容器:
注冊 runner 之前需要在 Gitlab 項目的 CI/CD 配置中(設置 > CI/CD > Runner)查看注冊 URL 和令牌,如下圖所示:
正在上傳…重新上傳取消
接下來,運行一下命令進行 runner 的注冊:
注意:上面的 $REGISTRATION_TOKEN 需要替換成真實的令牌值。
上面的命令注冊了一個默認使用 mengzyou/docker 鏡像運行容器的執行器,同時掛載了 /var/run/docker.sock,因為默認執行容器里的 Docker 將訪問主機上的 Docker 服務。
配置Gitlab-ci進行自動部署
在 .gitlab-ci.yml 中增加部署的工作:
stages: -?build -?deploydeoploy:docker: stage:?deploy script: -?echo?"Deploy?try_app?-?$CI_REGISTRY_IMAGE:latest" -?echo?"$CI_REGISTRY_PASSWORD"?|?docker?login?-u?"$CI_REGISTRY_USER"?--password-stdin?$CI_REGISTRY -?docker?rm?-f?try_app?||?true -?docker?image?pull?$CI_REGISTRY_IMAGE:latest -?docker?container?run?--name?try_app?-p?80:80?-d?$CI_REGISTRY_IMAGE:latest only: -?master tags: -?deploy -?docker
當然,也可以寫部署腳本來執行部署的步驟,也可以使用 docker-compose 通過 docker-compose.yml 文件來執行,例如:
其中可以定義 CD_COMPOSE_PROJECT 變量來指定 docker-compose 的項目名,相應的在代碼根目錄增加 docker-compose.prod.yml 文件:
上面的 docker-composle 文件還定義了 traefik 相關的參數,這要求在目標服務器上已經運行了相應的 traefik 服務作為 Web 代理。
完成以上步驟之后,每次推送 master 分支,都會觸發相應的 gitlab CI/CD pipeline 來執行每個階段的 CI/CD 工作,如下圖:
正在上傳…重新上傳取消
?
總結
以上僅僅進行了一個簡單應用的 CI/CD 示例,主要演示了如何使用 gitlab-ci 和 Docker 來進行 CI/CD 流程。
原文鏈接:https://mengz.me/posts/docker- ... b-ci/
總結
以上是生活随笔為你收集整理的使用GitLab CI和Docker进行容器应用自动化部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker 实践
- 下一篇: ZLMediaKit_wiki