##### 此文章目的在於紀錄 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/