iT邦幫忙

0

docker-compose與drone在tag選擇上的疑問

目前架構是兩個前端 (網站前台及後台) 與一個後端
使用drone進行自動包版及上傳至dockerhub
接著在VM上使用docker-compose啟用服務
沒使用k8s是因為服務不大,若是真起了一個Cluster 可能就比原本的服務吃資源了

yaml檔如下

version: "3.3"
services:
  nginx:
    image: nginx:stable
    restart: always
    volumes:
      - ./conf.d:/etc/nginx/conf.d
    ports:
      - "8082:8080"
    networks:
      - internal_network

  server:
    image: dockerhub/server:0.0.6
    restart: always
    networks:
      - internal_network

  web:
    image: dockerhub/web:0.0.3
    restart: always
    networks:
      - internal_network

  man:
    image: dockerhub/webman:0.0.4
    restart: always
    networks:
      - internal_network

networks:
  internal_network:
    driver: bridge

內部的三個服務統一由一個nginx對外,再經由proxy進到各個服務去
nginx conf如下

server {
  listen 8080;
  index index.html;

  location ~ /api {
      proxy_pass http://server:7000;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
  }

  location /admin/ {
      proxy_pass http://webman:8080/;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
  }

  location / {
      proxy_pass http://web:8080;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
  } 
}

目前服務都正常運作,只是在設定上有些疑問想請教

  • yaml檔這樣設定networks有甚麼問題嗎? 還是其實會用別種方式,因為之前用過mariadb配合adminer的docker-compose,似乎不用設定networks
  • 在兩個前端的image內又各是一個nginx,這樣就會為了取用前端資源過兩層nginx,這樣在設定上是合理的嗎? 還是因為通常會有CDN做cache所以不會有這個問題
  • yaml檔裡面有下image的tag,等於說在改版時需要去更改yaml檔,通常會直接下latest嗎?

以下是drone的設定檔

kind: pipeline
type: docker
name: test

steps
  - name: tsc
    when:
      event: tag
    pull: if-not-exists
    image: node:current-alpine3.12
    commands:
      - yarn global add typescript
      - yarn install
      - tsc

  - name: build-image
    when:
      event: tag
    pull: if-not-exists
    image: plugins/docker
    settings:
      registry: registry.hub.docker.com
      repo: registry.hub.docker.com/dockerhub/web 
      dockerfile: dockerfile 
      auto_tag: true 
      username:
        from_secret: hubname
      password:
        from_secret: hubsecret

會根據git的tag決定image的tag
如果將每次上傳的新image都設定成latest,那是不是需要去修改舊版本的image tag
還是有比較好的方式嗎?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-21 09:50:43
  1. 對於 Docker Compose 而言,它會自動為容器建立一個默認網路,這可以使用 docker network ls 命令查看。在默認網路中,容器可以使用容器名稱進行通信。你可以通過在容器內運行 ping <container_name> 命令測試是否可以與其他容器通信。然而,你也可以在 Docker Compose 文件中指定其他網路,這樣就可以在需要的情況下將容器分組。
  2. 你的設定在理論上是可行的,但是由於在前端和反向代理中都使用了 Nginx,因此建議將前端和反向代理部署到不同的容器中。這樣可以簡化設定並提高可讀性。
  3. 關於標籤的問題,使用 latest 標籤可以使您的流程更簡單,但是不推薦這樣做。這是因為 latest 標籤可能會與實際上部署的代碼不同步,導致出現錯誤或不一致的狀況。建議使用版本號標籤,例如 v1.0.0,這樣可以更好地跟踪和管理代碼的版本。如果你的部署流程使用了自動化工具,如 Drone,你可以根據 git tag 自動為你的鏡像打上版本號標籤。
  4. 最後,關於資料庫的部署,你可以考慮使用容器化的資料庫,如 PostgreSQL 或 MySQL。這樣可以方便地部署和管理資料庫,也有助於在需要時進行擴展。同時,你可以使用網路安全性的最佳實踐來保護你的資料庫。

我要發表回答

立即登入回答