# Docker ## 基本觀念 簡單跑過:https://larrylu.blog/step-by-step-dockerize-your-app-ecd8940696f4 主要是要把應用程式docker化(dockerize) #### docker基本組成 ##### 映像檔(Image) 映像檔用來建立容器container ##### 容器(Container) 容器是映像檔建立的實例(可想像成一個簡易版的Linux) ##### 倉庫(Repository) 有時候會把倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。 Docker Hub - 最大的Public公開倉庫 *Docker 倉庫的概念跟 Git 類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。 *當有新的設定(ex:node版本、環境變數、port)服務就會重啟,他會直接用image建立一個新的container,再將舊的容器刪掉。 ### 【建立容器】 docker hub上有各式各樣的image,可以選想要的映像檔去建立容器。 `$ docker run --name redis -p 6379:6379 -d redis:latest` * -d指的是可以在背景運行 * 若要建立別的版本號latest可改為版本號(7.0.11-alpine) #### 使用docker運行PostgreSQL https://dev.to/andre347/how-to-easily-create-a-postgres-database-in-docker-4moj ``` docker run --name postgres-db -e POSTGRES_USER=sj -e POSTGRES_PASSWORD=postgresql -p 5432:5432 -d postgres ``` *如果在local端沒有找到你的image,他會自己去docker hub pull nest.js 專案,連接progreSQL https://cloud.tencent.com/developer/article/1922867 ### 【Node.js官方實作教學】 https://docs.docker.com/language/nodejs/build-images/ dockerFile 會build出image nest.js下實作docker https://juejin.cn/post/7205508171523604540 https://www.tomray.dev/nestjs-docker-production ### 【使用caprover部屬服務】 caprover是包在docker外面的一層服務,可以自動部屬、重新建立container https://juejin.cn/post/7068160034597208101 如果caprover因為前一次版本部屬失敗,導致後續部屬失敗,可以重啟caprover服務: ``` docker service update captain-captain --force ``` ## 【問題】 Q1:專案是用 Node.js 寫的,所以需要一個已經裝好 Node.js 的環境,有兩個選擇:(差別是什麼?ubuntu是作業系統?可以不需要安裝作業系統的嗎?) <ol> <li>直接用 node 作為我的 base image,裡面就已經有 Node.js 環境了</li> <li>用 ubuntu 當 base image,再參考 Installing 把 node 裝在 ubuntu 上</li> </ol> A1:docker的運行都是基於linux的某發行版,因此除非會用到例如說作業系統上的某些功能,不然不會再裝一個ubuntu再裝node,直接跑node即可,且docker的出現本身就是為了解決各個作業系統間的差異,可以將服務直接搬到各個作業系統上運行,因此比較沒有先裝一個作業系統的必要。 Q2:為什麼找不到nest? Dockerfile: ``` FROM node:16 WORKDIR /app COPY package*.json ./ RUN yarn install --production --frozen-lockfile && yarn cache clean COPY . . RUN yarn build CMD [ "node", "dist/main.js" ] ```  A2:
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up