1 回答

TA貢獻1796條經(jīng)驗 獲得超4個贊
我認為對于那些沒有部署經(jīng)驗的人來說,查看如何執(zhí)行此操作的基本示例可能會很有用。所以,我想提供這樣一個例子,以及如果我要改進我的解決方案,我的下一步將是什么。歡迎反饋!
前端容器
提供靜態(tài)信息,您可以通過構(gòu)建 vue js 項目獲得這些靜態(tài)信息
Dockerfile.static 用于構(gòu)建容器
FROM nginx:1.17-alpine
LABEL maintainer="xxx"
# copy statics into default html folder of container
COPY app/dist /usr/share/nginx/html
# use specific config file for nginx?
COPY nginx_static.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]
nginx 服務器的配置文件取自vue js 文檔...我只需要為前端執(zhí)行的 URL 請求添加代理傳遞,以便從數(shù)據(jù)庫獲取數(shù)據(jù)
user? nginx;
worker_processes? 1;
error_log? /var/log/nginx/error.log warn;
pid? ? ? ? /var/run/nginx.pid;
events {
? worker_connections? 1024;
}
http {
? include? ? ? ?/etc/nginx/mime.types;
? default_type? application/octet-stream;
? log_format? main? '$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"';
? access_log? /var/log/nginx/access.log? main;
? sendfile? ? ? ? on;
? keepalive_timeout? 65;
? server {
? ? listen? ? ? ?80;
? ? server_name? www.xxx.org;
? ? location / {
? ? ? root? ?/usr/share/nginx/html;
? ? ? index? index.html;
? ? ? try_files $uri $uri/ /index.html;
? ? }
? ? location /sets {
? ? ? proxy_pass http://backend:9000;
? ? }
? ? location /cards {
? ? ? proxy_pass http://backend:9000;
? ? }
? ? location /types {
? ? ? proxy_pass http://backend:9000;
? ? }
? ? location /supertypes {
? ? ? proxy_pass http://backend:9000;
? ? }
? ? location /uploads {
? ? ? proxy_pass http://backend:9000;
? ? }
? ? error_page? ?500 502 503 504? /50x.html;
? ? location = /50x.html {
? ? ? root? ?/usr/share/nginx/html;
? ? }
? }
}
http://backend:9000來自這樣一個事實:我正在定義一個容器網(wǎng)絡,在該網(wǎng)絡中我的三個容器相互通信,稱為后端,并且主機端口 9000 連接到后端容器的端口 9000(請參閱 docker-compose )
有了我的前端請求的所有這些代理傳遞,我的代碼中發(fā)出的實際請求 URL 地址減少為“/”(在開發(fā)模式下,我將使用類似 http://localhost:8000/ 的內(nèi)容)
下一步我會將 SSL 配置添加到配置中
后端/API
該Dockerfile用于構(gòu)建后端容器
FROM php:7.4-cli
LABEL maintainer="xxx"
RUN apt-get update
# install pgsql libary which is required in my case
RUN apt-get install -y libpq-dev \
? && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
? && docker-php-ext-install pdo pdo_pgsql pgsql
COPY . /var/www/MTGWeb
WORKDIR /var/www/MTGWeb/public
# start php development server which listens to port 9000
CMD ["php", "-S", "0.0.0.0:9000"]
使用開發(fā)服務器肯定不是最佳選擇,但對于像我這樣的小規(guī)模項目來說,這似乎是最簡單的解決方案(下一步應該用另一個 nginx Web 服務器替換)
D B
我使用標準 postgres 映像來構(gòu)建數(shù)據(jù)庫容器。為了在后端和數(shù)據(jù)庫容器之間建立數(shù)據(jù)庫連接,您必須使用數(shù)據(jù)庫服務的名稱作為主機名(在我的例子中為mtg-db,正如您在 docker-compose 文件中看到的那樣)
部署
我正在使用 gitlab-ci 來構(gòu)建我的前端和后端圖像。我的私有 ssh 密鑰作為環(huán)境變量添加到我的存儲庫中,以便允許自動訪問服務器。在我的主分支中推送某些內(nèi)容后,將構(gòu)建圖像,將其拉到服務器上,然后再次設置所有內(nèi)容
stages:
? ? - build-statics
? ? - build-images
? ? - deploy_staging
build-statics:
? ? image: node:latest
? ? stage: build-statics
? ? script:
? ? ? ? - cd app
? ? ? ? - npm ci
? ? ? ? - npm run build
? ? artifacts:
? ? ? ? paths:
? ? ? ? ? ? - app/dist
? ? only:
? ? ? ? - master
backend-image:
? ? stage: build-images
? ? tags:
? ? ? ? - docker-image-build
? ? script:
? ? ? ? - ""
? ? dependencies: []
? ? variables:
? ? ? ? TO: $CI_REGISTRY_IMAGE:latest
? ? ? ? DOCKER_FILE: Dockerfile
? ? only:
? ? ? ? - master
static-image:
? ? stage: build-images
? ? tags:
? ? ? ? - docker-image-build
? ? script:
? ? ? ? - ""
? ? dependencies:
? ? ? ? - build-statics
? ? variables:
? ? ? ? TO: $CI_REGISTRY_IMAGE/static:latest
? ? ? ? DOCKER_FILE: Dockerfile.static
? ? only:
? ? ? ? - master
before_script:
? ? - apt-get update
? ? - apt-get -y install git
? ? - 'which ssh-agent || ( apt-get install openssh-client )'
? ? - eval $(ssh-agent -s)
? ? - ssh-add <(echo "$SSH_PRIVATE_KEY")
? ? - mkdir -p ~/.ssh
? ? - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
deploy_staging:
? ? image: ubuntu:latest
? ? stage: deploy_staging
? ? script:
? ? ? ? - ssh root@xxx.net "cd .. && cd var/www/mtg-web/ && docker pull gitlab-registry.cern.ch/xxx && docker pull gitlab-registry.cern.ch/xxx/static && docker-compose up -d"
? ? only:
? ? ? ? - master
容器是使用以下撰寫文件設置的:
version: '3'
services:
? ? backend:
? ? ? ? image: gitlab-registry.cern.ch/xxx:latest
? ? ? ? ports:
? ? ? ? ? ? - 9000:9000
? ? ? ? volumes:
? ? ? ? ? ? - /home/backend_logs:/var/www/MTGWeb/logs
? ? ? ? networks:
? ? ? ? ? ? - backend
? ? frontend:
? ? ? ? image: gitlab-registry.cern.ch/xxx/static:latest
? ? ? ? ports:
? ? ? ? ? ? - 80:80
? ? ? ? networks:
? ? ? ? ? ? - backend
? ? mtg-db:
? ? ? ? container_name: mtg-db
? ? ? ? image: postgres:latest
? ? ? ? env_file:
? ? ? ? ? ? - database/database.env
? ? ? ? ports:
? ? ? ? ? ? - 5432:5432
? ? ? ? volumes:
? ? ? ? ? ? - /home/mtg_web_data:/var/lib/postgresql/data
? ? ? ? networks:
? ? ? ? ? ? - backend
volumes:
? ? db_data:
? ? backend_logs:
networks:
? ? backend:
就這樣吧!這是一個完整的示例,說明如何使用 vue js 等 js 前端框架、基于 php 的 API 和 postgres DB 在服務器上設置 3 個容器堆棧。
- 1 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報