---
# System prepended metadata

title: Docker 建立資料庫
tags: [Docker實作]

---

##### 此文章目的在於紀錄 Windows 如何連到 Ubuntu 裡Docker 建立的 PostgreSQL 資料庫

### Docker 建立 PostgreSQL
1. 在Ubuntu建立資料夾
    `mkdir -p docker/postgresql`
2. 移動到 ~/docker/postgresql 並新增data資料夾(路徑可以自己定義)
3. 新增 docker-compose.yml 跟 .env
    `touch docker-compose.yml .env`
4. 寫 docker-compose.yml
    `vi docker-compose.yml`
    
    點i進入insert模式

    docker-compose.yml內容
    ```yaml
    version: "3"

    services:
      postgres:
        image: postgres:latest
        container_name: Postgres_dev
        volumes:
          - ${HOST_DIR}:/var/lib/postgresql/data
        expose:
          - 5432
        ports:
          - ${POSTGRES_PORT}:5432
        environment:
          - POSTGRES_DB=${POSTGRES_DB}
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    ```
    
    點Esc退出insert模式，輸入:wq儲存內容
    
    詳細說明 :
    4.1 使用 **version** 設定 docker-compose.yml 格式的版本。
    
    4.2 使用 **services** 設定有哪些 service 要一起跑。
    
    4.3 使用 **image** 設定要使用的 image ， latest 代表使用最新版本。
    
    4.4 使用 **volumes** 設定 host 與 container 所對應的目錄，將來 PostgreSQL 所寫入資料，將寫入 host 目錄。
    (左側為 host 目錄，右側為 container 內目錄)
    
    4.5 使用 **expose** 設定 container 的 port。

    4.6 使用 **ports** 設定 host 與 container 所 mapping 的 port。
    (左側為 host 的 port，右側為 container 的 port)
    
    4.7 用 **environment** 設定參數。

5. 寫env檔案

    說明 :
    在存放 docker-compose.yml 檔案的資料夾底下新增 .env 檔案， docker-compose 指令執行時也會自動將其中的環境變數帶入。
    
    `vi .env`
    
    ```
    HOST_DIR=~/docker/postgresql/data
    POSTGRES_PORT=5432
    POSTGRES_DB=mypostgresql
    POSTGRES_USER=user
    POSTGRES_PASSWORD=pw
    ```
6. 啟動 PostgreSQL
    `docker compose up -d`
    舊版指令
    `docker-compose up -d`
    參考
    https://askubuntu.com/questions/1396689/docker-compose-cant-execute-command-docker-compose-not-found
    
7. 使用DB工具連線資料庫

### 補充另外一種方式啟動 Container 
#### docker run
使用 docker run 由 image 建立 container，當 Docker 發現本機沒有 image，會自動從 Docker Hub 下載。



```
docker run --name MyPostgres -d -p 5432:5432 -v ~/Postgres:/var/lib/postgresql/data -e POSTGRES_DB=eflab -e POSTGRES_USER=admin -e POSTGRES_PASSWORD='12345' postgres:latest


-name：替 container 取一個人能夠識別的名字 (若省略，Docker 會自動以亂數建立 )

-d : detach，建立 container 後，就脫離目前 process

-v : volume，PostgresSQL 新增的資料會寫在 container 內的 /var/lib/postgresql/data 目錄，會改 mapping 到 host 的 ~/Postgres，如此 container 刪除後，資料仍然會留在 host

-p : port mapping，host 與 container post 的對應，格式為 本機 port : container port

-e : environment，設定 PostgreSQL 所需要的環境變數

POSTGRES_DB : database 名稱
POSTGRES_USER : 帳號
POSTGRES_PASSWORD : 密碼
postgress:latest : image 名稱，其中 latest 為最新版的 image
```

### 補充指令
#### Docker

1. 查詢 Image
`docker images`
2. 刪除 Image
`docker rmi <your-image-id> <your-image-id>...`
3. 刪除所有 Image
`docker rmi $(docker images -q)`
4. 查詢 Contain
`docker ps -a`
5. 刪除 Contain
`docker stop <container_id>`
`docker rm <container_id>`
6. 刪除所有 Contain
`docker stop $(docker ps -a -q)`
`docker rm $(docker ps -a -q)`
-a 這個選項用來列出所有容器，包括停止運作的。
-q 是一個選項，用於傳回唯一的 ID

#### Linux
mkdir 指令及參數
```
mkdir [OPTION …] DIRECTORY_NAME

參數
-m, --mode=MODE: 設定目錄的權限。
-p, --parents： 如果建立新目錄的上層目錄不存在，會自動建立。另外如果加上這個參數，如果建立目錄已經存在，不會報錯。
-v, --verbose： 印出建立目錄的詳細資訊。
-Z, --context=CTX：對新建目錄進行 SELinux 安全設定。
```

參考

Docker

停止、删除所有的docker容器和镜像
https://colobu.com/2018/05/15/Stop-and-remove-all-docker-containers-and-images/

[CS] Docker的三個基本概念: Image, Container, 和Registry
https://mailtojacklai.medium.com/cs-docker%E7%9A%84%E4%B8%89%E5%80%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5-image-container-%E5%92%8Cregistry-89844595a7a6

如何使用 Docker 安裝 PostgreSQL ?
https://old-oomusou.goodjack.tw/docker/postgres/

Linux

使用 mkdir 指令建立單或多層資料夾
https://www.cjkuo.net/linux_mkdir/