๐ณ ๅพ้ถๆ้ GitLab + Docker ่ชๅ้จ็ฝฒ็ฐๅข:CI Runner、Registry、Compose ไธๆข้พๅฏฆๆฐ
ๆฌ็ฏๅฐๅพ้ถ้ๅง,ๅธถไฝ ๆ้ ไธๅฅ「ไผๆฅญๅฏฆ้ๆไฝฟ็จ」็ GitLab CI/CD ่ชๅ้จ็ฝฒๆถๆง,ๆดๅ:
- ✔ GitLab Runner(Docker Executor)
- ✔ GitLab Registry(ๅฎๅ จ็งๆ Image ๅฒๅญๅบซ)
- ✔ Docker Compose(ๆๅ่ชๅ้จ็ฝฒ)
- ✔ CI/CD ่ชๅๅปบ็ฝฎ + ๆจ้ + ้จ็ฝฒ
้ๆฏไผๆฅญ็ฐๅขๆๅธธ่ฆ、ๆ็ฉฉๅฎ、ๆๅฎๆด็ไธๆข้พ้จ็ฝฒๆต็จ。
๐ ็ฌฌไธ็ซ :ๆถๆง็ธฝ่ฆฝ(Architecture Overview)
ๆดๅๆต็จๅฆไธ:
- ้็ผ่ Push Code → GitLab
- CI Pipeline ่ชๅๅปบ็ฝฎ Docker Image
- Push ๅฐ GitLab Registry(็ๆฌๆจ็ฑค、็ญ SHA ID)
- ้จ็ฝฒ้ๆฎต SSH ๅฐ้จ็ฝฒไผบๆๅจ
- Docker Compose ่ชๅๆดๆฐๆๅ
ๆถๆงๅ(็ฐกๅ):
Developer → GitLab Repo → CI Pipeline → Docker Build
↓ Push
GitLab Registry
↓ Deploy
Production Server
Docker Compose Up -d
๐ ็ฌฌไบ็ซ :ๆบๅ็ฐๅข
2.1 ๅฎ่ฃ Docker(้จ็ฝฒๆฉ)
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
2.2 ๅฎ่ฃ Docker Compose
apt install docker-compose-plugin -y
2.3 ๅจ้จ็ฝฒๆฉๅปบ็ซๅฐๆก็ฎ้
mkdir -p /srv/myapp
cd /srv/myapp
ๅปบ็ซๅบๆฌ docker-compose.yml:
version: "3"
services:
app:
image: registry.example.com/mygroup/myapp:latest
restart: always
ports:
- "3000:3000"
๐ ็ฌฌไธ็ซ :่จญๅฎ GitLab Registry(็งๆ Image ๅฒๅญๅบซ)
3.1 ็ปๅ ฅ Registry
GitLab ๆฏๅๅฐๆก้ฝ่ชๅธถ Registry。
docker login registry.example.com
GitLab CI ไธญๆไฝฟ็จ:
$CI_REGISTRY$CI_REGISTRY_USER$CI_REGISTRY_PASSWORD
๐ ็ฌฌๅ็ซ :ๅฎ่ฃ GitLab Runner(Docker Executor)
4.1 ๅฎ่ฃ Runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | bash
apt install gitlab-runner -y
4.2 ่จปๅ Docker Runner
gitlab-runner register \
--executor docker \
--docker-image docker:24 \
--description "docker-runner"
Runner ๆไฝฟ็จ docker:dind ไพๅปบ็ฝฎ docker image。
๐ ็ฌฌไบ็ซ :ๆฐๅฏซ .gitlab-ci.yml(CI/CD ๆ ธๅฟ)
ไปฅไธๆฏๅฎๆดๅฏ็ดๆฅไฝฟ็จ็็คบ็ฏๆชๆก。5.1 .gitlab-ci.yml
stages:
- build
- push
- deploy
variables:
IMAGE_NAME: $CI_REGISTRY_IMAGE/app
build_image:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker build -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
artifacts:
expire_in: 1 hour
push_image:
stage: push
image: docker:24
services:
- docker:24-dind
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
- docker tag $IMAGE_NAME:$CI_COMMIT_SHORT_SHA $IMAGE_NAME:latest
- docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
- docker push $IMAGE_NAME:latest
deploy_prod:
stage: deploy
before_script:
- 'which ssh-agent || ( apt update -y && apt install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$DEPLOY_SERVER_KNOWN_HOSTS" > ~/.ssh/known_hosts
script:
- ssh root@$DEPLOY_SERVER "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY"
- ssh root@$DEPLOY_SERVER "cd /srv/myapp && docker compose pull && docker compose up -d"
only:
- main
้ๅ Pipeline ่ฝๅๅฐ:
- ✔ Docker Build
- ✔ ๆจ้่ณๅฐๆก Registry
- ✔ SSH ้จ็ฝฒ่ณ Production Server
- ✔ ไฝฟ็จ docker-compose ่ชๅ้ๅๆๅ
๐ ็ฌฌๅ ญ็ซ :้จ็ฝฒๆฉ่จญๅฎ SSH ้จ็ฝฒ้้ฐ
ๅจ GitLab Repository → Settings → CI/CD → Variables ไธญๆฐๅข:
SSH_PRIVATE_KEYDEPLOY_SERVER_KNOWN_HOSTS
mkdir ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
่ฒผไธ GitLab CI ไฝฟ็จ็ public key。
๐ ็ฌฌไธ็ซ :้จ็ฝฒๆดๆฐๆต็จ็คบๆ
็ถไฝ Push Code ๆ Merge Request ้ฒ main ๆ:
- GitLab Runner ๅปบ็ฝฎ Docker Image
- ๆ Image ๆจ้ๅฐ GitLab Registry
- CI ็จ SSH ้ฃๅฐ้จ็ฝฒไธปๆฉ
- ้จ็ฝฒไธปๆฉๅท่ก
docker compose pull && up -d - ๆๅ็ซๅณๆดๆฐ(้ถไธญๆท)
๐ ็ฌฌๅ ซ็ซ :ๆไฝณๅฏฆๅ(ไผๆฅญ้จ็ฝฒๅปบ่ญฐ)
- ๐ณ ไฝฟ็จ docker:stable ๆ docker:24 ็ๆฌๅปบ็ฝฎ็ฐๅข
- ๐ ไฝฟ็จ GitLab CI Masked Variables ไฟ่ญทๅฏ็ขผ
- ๐ ้จ็ฝฒๅชๅ ่จฑ main / master branch
- ๐ฆ ๅฐ docker-compose.yml ็ๆฌ็ฎก็
- ๐ ้็ผ่ๆญฃๅผ็ฐๅขไฝฟ็จไธๅ็็ฐๅข่ฎๆธ(.env.prod)
๐ ็ต่ช
ๆฌ็ฏ็คบ็ฏ็ GitLab + Docker ่ชๅ้จ็ฝฒๆต็จ,ๆฏไผๆฅญๆๅธธ็จ็ DevOps ๅบ็คๆถๆง。 ้้ CI Runner、Registry、SSH ไปฅๅ Docker Compose,ไฝ ๅฏไปฅๆ้ ๅฎๆด、ๅฏ้็พ、ๅฏๆดๅ ็่ชๅๅ้จ็ฝฒๆต็จ。
ไธไธ็ฏๅฐๆจๅบ: 《GitLab CI/CD ้ฒ้็ฏ:Artifacts、Stages、Canary Deployment、Blue-Green Release ๅฏฆๆฐ》
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ