Xuất bản ngày 8 tháng 4 năm 2021
Một người bạn đề nghị tôi bắt đầu với Dockerize, các ứng dụng của tôi để quản lý dễ dàng. Anh ấy đã thuyết phục tôi rằng việc container hóa là con đường của tương lai, và sau một chút nghiên cứu, tôi nhận ra anh ấy đã đúng!
Cuối cùng tôi đã giải quyết được một quy trình để chứa các ứng dụng NodeJS và định cấu hình triển khai tự động thông qua Gitlab CI. Tôi nghĩ sẽ hữu ích để chia sẻ những gì tôi đã học được khi nó có thể giúp đỡ người khác.
Tổng quan
Bài đăng này đi qua mã trong một dự án mẫu mà tôi đã tạo bao gồm một số bước cơ bản:
- Tạo API REST NODEJS đơn giản và chứa nó thành hình ảnh docker.
- Chuẩn bị một máy chủ dàn (Ubuntu) để hỗ trợ triển khai hình ảnh Docker qua SSH.
- Định cấu hình một dự án Gitlab với đường ống CI tự động xây dựng và triển khai hình ảnh Docker mới mỗi khi cam kết mã được đẩy.
Sau khi được triển khai đến máy chủ sắp xếp, API RESTS NODEJS có thể truy cập thông qua proxy ngược của Apache Web.
Đường ống CI được bắt đầu bởi các cam kết mã được hiển thị trong đỉnh bên trái; Sau khi được triển khai, người dùng có thể truy cập ứng dụng Docker qua Apache (được hiển thị ở phía dưới bên phải)
Mã mẫu được đăng lên GitHub
Dự án tương tự được đề cập trong bài đăng này đã được đăng lên GitHub và có sẵn ở đây. Mã nên sẵn sàng để đi và có thể được sử dụng bằng cách làm theo các hướng dẫn trong README.md
.
Giả định
Hướng dẫn này giả định quyền truy cập vào một phiên bản Gitlab đang hoạt động, với CI và người chạy được cấu hình, và cũng là một sổ đăng ký container docker để đẩy và kéo hình ảnh docker (đây có thể là một sổ đăng ký được lưu trữ riêng của Gitlab, Docker Hub hoặc bất kỳ sổ đăng ký nào khác). 2 bước đầu tiên trong hướng dẫn DigitalOcean này có thể giúp định cấu hình các thành phần Gitlab nếu cần. Tôi khuyên bạn nên kiểm tra hướng dẫn DigitalOcean nói chung, vì nó rất giống với những gì được đề cập trong bài đăng này.
1. dockerizing Ứng dụng NodeJS
Dự án mẫu chứa API NodeJS REST cơ bản được tạo với Trình tạo ứng dụng Express. Để chạy API cục bộ, hãy khởi chạy nó với npm start
và thực hiện yêu cầu nhận đến http://localhost:3000/info
. API sẽ tạo phản hồi JSON tương tự như:
{
"name": "node-docker-gitlab-ci",
"server": "express",
"variableData": "NodeJS Code"
}
Bây giờ, API RESTS của NodeJS đang hoạt động, bước tiếp theo là tạo Dockerfile
và xác định cách Docker sẽ đóng gói API thành một hình ảnh. Tôi đã sử dụng Dockerfile
trong hướng dẫn DigitalOcean này làm điểm khởi đầu và điều chỉnh nó một chút:
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
Mặc dù thẳng, mọi thứ có thể trở nên phức tạp hơn nếu ứng dụng yêu cầu các khóa hoặc biến để truyền vào hình ảnh. Một ví dụ về các cách khác nhau để làm điều này được thảo luận ở cuối bài này.
2. Chuẩn bị máy chủ dàn
Tiếp theo, chúng tôi sẽ chuẩn bị máy chủ dàn để chấp nhận triển khai qua SSH. Trong ví dụ này, chúng tôi đang triển khai theo ví dụ Debian/Ubuntu. Chúng ta sẽ cần:
- Tạo người dùng Linux mới và thêm nó vào nhóm
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
1 (để nó có quyền truy cập vào lệnh FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
1). - Tạo khóa SSH cho người dùng.
- Định cấu hình Apache thành các yêu cầu Web proxy trở lại container Docker, sau khi được triển khai.
Như được mô tả trong Hướng dẫn DigitalOcean này, chúng tôi sẽ tạo một người dùng mới và nó cho nhóm
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
1:sudo adduser deployer
sudo usermod -aG docker deployer
Tiếp theo chúng tôi sẽ tạo một khóa SSH cho người dùng. Khóa này sau đó sẽ được thêm vào Gitlab để đường ống Gitlab CI có thể đăng nhập vào máy chủ dàn vì người dùng này để triển khai.
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Lưu ý: Chúng tôi sẽ cần khóa riêng được tạo ở đây trong Phần 4 dưới đây. Trừ khi có quy định khác, giá trị này được ghi lại trong FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
4. we will need the private key generated here in section 4 below. Unless otherwise specified, this value is captured in
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
4.Khi người dùng Linux được thiết lập, chúng tôi sẽ định cấu hình máy chủ Web Apache thành các yêu cầu proxy trở lại container Docker. Tùy thuộc vào thiết lập hiện tại, tùy chọn đơn giản nhất có thể là xác định proxy ngược bên trong một vhost hiện có:
# define reverse proxy
ProxyPass /info http://127.0.0.1:8882/info
ProxyPassReverse /info http://127.0.0.1:8882/info
# optional headers - can be omitted
<LocationMatch /info>
# enable CORS
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
# do not cache
Header set Cache-Control "no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</LocationMatch>
Các yêu cầu thông báo cho tuyến đường
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
5 được ủy quyền cho container Docker, sẽ nghe trên cổng FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
6. Cổng này sẽ được đặt trong lệnh FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
7, được thực thi trong FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8 (được đề cập trong Phần 4 bên dưới). Các chỉ thị CORS và bộ đệm là tùy chọn, và chỉ bao gồm trong trường hợp.Lưu ý: Đảm bảo các mô -đun Apache cần thiết được bật để hỗ trợ proxy ngược - xem bài đăng này để biết chi tiết. ensure the required Apache modules are enabled to support reverse proxying – see this post for details.
3. Cấu hình Gitlab
Tiếp theo, chúng tôi sẽ định cấu hình Gitlab để hỗ trợ các bản dựng và triển khai CI mỗi lần cam kết. Dưới đây là một vài điều bên trong Gitlab phải được cấu hình trước:
- Chúng tôi sẽ cần một dự án Gitlab để chứa mã - trong ví dụ này, chúng tôi sử dụng một dự án có tên
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
9. - Gitlab phải có ít nhất một người chạy được cấu hình - thêm thông tin có sẵn ở đây.
- Dự án Gitlab phải cho phép người chạy trong phần Cài đặt> CI/CD> Runners.
Khi các bước này được hoàn thành, các đường ống dự án sẽ có thể xem được từ trong menu đường ống CI/CD> dự án.
Có sẵn từ trang PIPELINES NODE-DOCKER-GITLAB-CIĐịnh cấu hình các biến Gitlab CI/CD
Phần tiếp theo của cấu hình Gitlab liên quan đến việc thiết lập các biến CI/CD cho dự án
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
9. Sau khi được đặt, các biến này có thể được đọc từ trong tệp FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8 và tạo một nơi tuyệt vời để lưu trữ các khóa hoặc thông tin nhạy cảm khác.Bên trong phần Cài đặt dự án> CI/CD> Biến, chúng ta cần tạo 3 biến:
sudo adduser deployer
sudo usermod -aG docker deployer
2 - Chứa địa chỉ IP của máy chủ dàn được định cấu hình trong Phần 2. Đây là địa chỉ IP được sử dụng để tạo kết nối SSH từ người chạy Gitlab.sudo adduser deployer
sudo usermod -aG docker deployer
3 - Chứa tên người dùng trên máy chủ dàn, nếu làm theo hướng dẫn này là sudo adduser deployer
sudo usermod -aG docker deployer
4.sudo adduser deployer
sudo usermod -aG docker deployer
5 - Chứa khóa riêng của SSH cho người dùng sudo adduser deployer
sudo usermod -aG docker deployer
4 trong Phần 2. Khóa này có thể được tìm thấy trong FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
4. Khi nhập giá trị này vào gitlab, hãy đảm bảo loại được đặt thành tệp tệp và một dòng mới được tạo sau sudo adduser deployer
sudo usermod -aG docker deployer
8 ở phía dưới.
Có sẵn trong các cài đặt dự án Node-Docker-Gitlab-CI> CI/CD> Trang biến4. Kích hoạt bản dựng CI
Phần chính cuối cùng của cấu hình này liên quan đến việc thiết lập Gitlab CI/CD. Điều này được thực hiện bằng cách thêm một tệp
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8 vào gốc của dự án FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
9. Trong dự án mẫu, một dự án đã được cung cấp giống như:stages:
- build
- deploy-stage
variables:
VARIABLE_DATA: Gitlab-CI-YAML
build:
stage: build
image: docker:18-git
services:
- docker:18-dind
script:
# get node app version from package.json for use in tagging docker image
- apk update && apk add jq
- export VERSION=`jq -r ".version" < ./package.json`
# login to docker
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
# build and tag docker image
- docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest .
# publish finished image
- docker push $CI_REGISTRY_IMAGE:$VERSION
- docker push $CI_REGISTRY_IMAGE:latest
deploy-stage:
stage: deploy-stage
image: alpine:latest
script:
- chmod og= $STAGE_ID_RSA
- apk update && apk add openssh-client
# stop existing docker container & remove images
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true"
# pull new container
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest"
# run new container
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest"
Có nhiều tài nguyên tuyệt vời mô tả cú pháp CI YAML của Gitlab. Như chúng ta có thể thấy, quy trình xây dựng CI này có 2 giai đoạn,
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
1 và # recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2. Giai đoạn # recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
1 chạy lệnh # recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
4, thực hiện các bước được xác định trong Dockerfile
để xây dựng hình ảnh Docker và đẩy nó vào sổ đăng ký container docker được cấu hình (được lưu trữ bởi Gitlab trong ví dụ này).Giai đoạn
# recommended to su into the user to simplify housekeeping
su deployer
ssh-keygen -b 4096
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2 có liên quan nhiều hơn một chút và sử dụng tất cả các biến GITLAB CI/CD được xác định trong Phần 3 ở trên (lưu ý sudo adduser deployer
sudo usermod -aG docker deployer
5, sudo adduser deployer
sudo usermod -aG docker deployer
3 và sudo adduser deployer
sudo usermod -aG docker deployer
2). Giai đoạn này sẽ tạo một phiên SSH vào máy chủ dàn, sử dụng khóa SSH của người dùng sudo adduser deployer
sudo usermod -aG docker deployer
4. Trong khi trên máy chủ dàn, sau đó nó sẽ kéo xuống hình ảnh Docker mới được xây dựng và cài đặt nó vào thời gian chạy Docker địa phương.Cuối cùng, dòng cuối cùng của tệp YAML phát hành lệnh
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
7, sẽ bắt đầu container Docker, xác định các cổng mạng và truyền trong bất kỳ biến môi trường nào được sử dụng bên trong hình ảnh.Khi tệp
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8 cam kết với repo, nó sẽ tắt các cuộc đua!Có lẽ chỉ thú vị cho DevOps mọt sách ..Lưu trữ các khóa và biến ở đâu
Một vấn đề có thể xuất hiện khi xác định các bản dựng CI/CD là nơi xác định các khóa, mật khẩu và thông tin nhạy cảm khác. Đặc biệt là khi đối phó với Docker, phải cẩn thận để đảm bảo các khóa truy cập không được nướng vào hình ảnh docker trong quá trình xây dựng.
Trong Phần 3 ở trên, chúng tôi đã xác định các khóa máy chủ của chúng tôi trong các biến CI/CD của Dự án Gitlab. Mặc dù điều này hoạt động tốt, chúng tôi cũng có thể lưu trữ thông tin này trong tệp
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8, Dockerfile
hoặc thậm chí trong chính mã NodeJS. Mặc dù các biến "mã hóa cứng" hơn một chút khi được xác định trong các tệp này, nhưng nó có thể hữu ích cho các mục ít nhạy hơn và hiếm khi thay đổi (ví dụ: ID cặp khóa AWS).Dưới đây là các ví dụ về việc xác định giá trị
# define reverse proxy
ProxyPass /info http://127.0.0.1:8882/info
ProxyPassReverse /info http://127.0.0.1:8882/info
# optional headers - can be omitted
<LocationMatch /info>
# enable CORS
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
# do not cache
Header set Cache-Control "no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</LocationMatch>
5 từ phản hồi API NodeJS REST trong các tập lệnh xây dựng CI/CD khác nhau (và sau đó đọc nó từ tệp FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8):- Được xác định trong lệnh
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
7 trong giá trị FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
8 - cam kết - được mã hóa cứng và được chuyển vào thùng chứa Docker dưới dạng biến môi trường (sau đó được đọc bởi ứng dụng NodeJS). - Được xác định trong giá trị
Dockerfile
- cam kết được ghi vào tệp stages:
- build
- deploy-stage
variables:
VARIABLE_DATA: Gitlab-CI-YAML
build:
stage: build
image: docker:18-git
services:
- docker:18-dind
script:
# get node app version from package.json for use in tagging docker image
- apk update && apk add jq
- export VERSION=`jq -r ".version" < ./package.json`
# login to docker
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
# build and tag docker image
- docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest .
# publish finished image
- docker push $CI_REGISTRY_IMAGE:$VERSION
- docker push $CI_REGISTRY_IMAGE:latest
deploy-stage:
stage: deploy-stage
image: alpine:latest
script:
- chmod og= $STAGE_ID_RSA
- apk update && apk add openssh-client
# stop existing docker container & remove images
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true"
# pull new container
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest"
# run new container
- ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest"
0 được tạo trong quá trình xây dựng hình ảnh Docker, sau đó được đọc bởi ứng dụng NodeJS. - Được xác định trong chính mã NodeJS - cam kết A và cam kết B - xóa định nghĩa
# define reverse proxy
ProxyPass /info http://127.0.0.1:8882/info
ProxyPassReverse /info http://127.0.0.1:8882/info
# optional headers - can be omitted
<LocationMatch /info>
# enable CORS
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
# do not cache
Header set Cache-Control "no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</LocationMatch>
5 khỏi cả lệnh FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
7 và Dockerfile
có nghĩa là giá trị mặc định được đặt trong mã NodeJS sẽ được trả về.
Cải tiến
Mặc dù cách tiếp cận này đã hoạt động tốt cho một vài dự án khác nhau, cuối cùng tôi muốn tránh xa việc mở quyền truy cập SSH trên máy chủ của mình, đặc biệt là cho người dùng trong nhóm
FROM node:14-alpine
# create dir
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# build dependencies
COPY ./package*.json ./
USER node
RUN npm install
# copy in source code
COPY --chown=node:node ./ ./
# start express server
CMD [ "npm", "start" ]
1 (gần với quyền root). Tôi đã cố gắng giảm thiểu điều này bằng cách kết hợp một số thực tiễn tốt nhất SSH (ví dụ: thay đổi cổng mặc định, chỉ cho phép một số địa chỉ IP nhất định kết nối, các khóa xoay, v.v.). Tôi sẽ tiếp tục xem xét các triển khai từ xa với Docker với hy vọng tìm thấy thứ gì đó cảm thấy an toàn hơn!Cài đặt Gitlab làm bộ chứa Docker để Gitlab sẽ chạy bên trong thùng chứa Docker, nhưng nó sẽ sử dụng đĩa của máy chủ để lưu dữ liệu và tải cấu hình.Lộ các cổng 443, 80, 22 và ánh xạ chúng vào cùng một cổng vào máy chủ./srv/gitlab/dữ liệu sẽ giữ dữ liệu của git repo thực tế.GitLab will run inside a docker container, but it will use the host machine's disk to save data and load configurations. Expose the ports 443, 80, 22, and map them to the same ports to the host machine. /srv/gitlab/data will hold the actual git repo's data.
Gitlab CI kết hợp với Gitlab Runner có thể sử dụng Công cụ Docker để kiểm tra và xây dựng bất kỳ ứng dụng nào.Docker là một dự án nguồn mở cho phép bạn sử dụng hình ảnh được xác định trước để chạy các ứng dụng trong các "container" độc lập được chạy trong một thể hiện Linux duy nhất.an open-source project that allows you to use predefined images to run applications in independent "containers" that are run within a single Linux instance.