---
# System prepended metadata

title: Docker
tags: [IaaS]

---

# 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" ]
```
![](https://i.imgur.com/CpY9a3O.png)

A2:





