前言
将postgresql運作的環境打包形成docker容器運作,服務運作随着容器的啟動和關閉沒什麼問題,但是對于資料來說,我們是希望能夠持久化的,不能删除容器,資料也被删除了,通過容器資料卷可以有效解決這個問題。
什麼是容器資料卷?
卷就是目錄或者檔案,存在一個或者多個容器中,由docker挂載到容器,但不屬于聯合檔案系統,是以能夠繞過 Union File System , 提供一些用于持續存儲或共享資料的特性:卷的設計目的就是資料的持久化,完全獨立于容器的生存周期,是以即使容器删除了,挂載的資料卷也不會被删除。
資料卷特點
- 資料卷可在容器之間共享或重用資料。
- 卷中的更改可以直接生效。
- 資料卷中的更改不會影響到原來的鏡像。
- 資料卷的生命周期一直持續到沒有容器使用它為止。
建立檔案夾
# 建立資料卷檔案夾
mkdir -p /data-volume/pgsql-volume/data /data-volume/pgsql-volume/logs
部署
# 拉取官方指定版本Postgresql鏡像
docker pull postgres:12.4
# 運作鏡像并挂載主控端路徑
docker run -it -d --name postgresql12 -v /data-volume/pgsql-volume/data:/var/lib/postgresql/data -p 54321:5432 -e POSTGRES_PASSWORD=1qazZSE$ postgres:12.4
# 将資料庫日志同步到主控端檔案
docker logs -f postgresql12 >> /data-volume/pgsql-volume/logs/pgsql.log &
# 進入容器
docker exec -it postgresql12 /bin/bash
鏡像本地儲存與載入
# 儲存
docker save -o postgresql12-4.tar postgres:12.4
#-o:指定儲存的鏡像的名字;postgresql12-4.tar:儲存到本地的鏡像名稱;postgres:12.4:鏡像名字和版本号,可通過"docker images"檢視
# 載入
docker load --input postgresql12-4.tar 或 docker load < postgresql12-4.tar
阿裡鏡像
需要注冊阿裡雲賬号
登入後,[容器鏡像服務/執行個體清單/鏡像倉庫/命名空間] => 建立命名空間
[鏡像倉庫/倉庫名稱] => 建立倉庫名稱(我這裡建立的名稱是docker)
建立成功後,[鏡像倉庫/基本資訊]中包含鏡像拉取、推送等說明
docker login --username=XXXXXXXX registry.cn-qingdao.aliyuncs.com
#從Registry中拉取鏡像
docker pull registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:[鏡像版本号]
例:
docker pull registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:12.4
#将鏡像推送到Registry
docker tag 492fb9ae4e7a registry.cn-qingdao.aliyuncs.com/mythsawyer/docker:12.4
# 說明:492fb9ae4e7a是docker images指令檢視的image id, 12.4是版本
docker push registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:12.4
知識補充
# 設定容器自啟停
docker run --restart=always
# 如果容器已經啟動,可以通過update指令進行設定,--restart=no(關閉)
docker update --restart=always <CONTAINER ID>
例:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8043fe7101f alpine:latest "/bin/sh" 2 hours ago Up 38 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp php7.2-alpine
318302849dc6 postgres:12.4 "docker-entrypoint.s…" 22 hours ago Up 3 seconds 0.0.0.0:54321->5432/tcp, :::54321->5432/tcp postgresql12
# 設定第一個容器自啟停
docker update --restart=always e8043fe7101f
#重新開機後,設定的容器自動啟動
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8043fe7101f alpine:latest "/bin/sh" 2 hours ago Up 1 second 0.0.0.0:8088->80/tcp, :::8088->80/tcp php7.2-alpine