使用Docker部署postgresql教程
使用Docker部署postgresql
postgresql數(shù)據(jù)庫(kù)在Docker中的鏡像的名稱為postgres,可以從DockerHub中pull下來(lái),如果pull不下來(lái)那么很大概率是網(wǎng)絡(luò)問(wèn)題導(dǎo)致的,這時(shí)候你可能需要在網(wǎng)上找一些能用的鏡像源,以成功拉取postgres鏡像。
有了postgres的鏡像之后,你就可以在本地的Docker創(chuàng)建一個(gè)postgres的容器并運(yùn)行。我們有兩種方式來(lái)創(chuàng)建容器:
- 直接使用命令行來(lái)創(chuàng)建
postgres的容器并運(yùn)行; - 使用
docker-compose來(lái)創(chuàng)建postgres的容器并運(yùn)行;
這里先介紹使用命令行的方式來(lái)創(chuàng)建postgres容器的方式:
docker run -d --name postgres-exprdb -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=aderversa -e POSTGRES_DB=testdb -v ~/postgresql/data:/var/lib/postgresql/data postgres
-e是用來(lái)設(shè)置postgres容器中環(huán)境變量的值的,有些特殊的環(huán)境變量將會(huì)影響到啟動(dòng)后的postgresql的一些參數(shù),比如postgresql數(shù)據(jù)庫(kù)的密碼、用戶等等。具體一些環(huán)境變量的含義可以查看dockerhub中有關(guān)于環(huán)境變量的介紹,本文的最后也會(huì)介紹一些環(huán)境變量的含義。-p將PostgreSQL的5432端口暴露到宿主機(jī)的5432端口,方便我們?cè)谕獠吭L問(wèn)容器內(nèi)的PostgreSQL服務(wù)。-v將容器內(nèi)的/var/lib/postgresql/data文件夾掛載到宿主機(jī)的~/postgresql/data文件夾下,這樣數(shù)據(jù)庫(kù)中的數(shù)據(jù)就不會(huì)因?yàn)槲覀儎h除了容器而丟失。你需要自己定義好這個(gè)數(shù)據(jù)文件夾該掛載到自己主機(jī)的什么地方上,這里我給出的值僅做參考。--name postgres-exprdb指定創(chuàng)建的PostgreSQL容器的名字。-d表示該容器在后臺(tái)運(yùn)行,并打印創(chuàng)建容器的ID到控制臺(tái)。postgres是我們所使用的鏡像。
運(yùn)行上述命令,使用docker ps查看容器狀態(tài):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1f5d4521cd0 postgres "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:5432->5432/tcp postgres-exprdb
可以看見,容器已經(jīng)在后臺(tái)運(yùn)行了。之后,我們可以使用別的什么工具去訪問(wèn)已經(jīng)創(chuàng)建好的testdb數(shù)據(jù)庫(kù),用定義好的特權(quán)用戶aderversa,以及指定好的密碼123456。
IP已知,端口已知,用戶名和密碼都有了,那么你就可以用你能想象到的方式去連接這個(gè)PostgreSQL數(shù)據(jù)庫(kù)啦。
使用docker-compose來(lái)部署
相比于在命令行中寫冗長(zhǎng)的命令,我更喜歡將容器的配置寫到docker-compose.yaml文件中,然后一行:
docker compose -f docker-compose.yaml -p package_name up -d
-f指定要要操作的文件。-p指定項(xiàng)目的名稱。up是創(chuàng)建并啟動(dòng)容器的命令。-d表示容器在后臺(tái)啟動(dòng)。
比如,我編寫了一個(gè)docker-compose.yaml文件:
version: "3.8"
services:
database_expr:
image: postgres:latest
container_name: postgres-expr
restart: on-failure:3
ports:
- 5432:5432
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=123456
- POSTGRES_USER=aderversa
- POSTGRES_DB=testdb
直接對(duì)其進(jìn)行操作就可以創(chuàng)建好容器并啟動(dòng),用戶不需要關(guān)心里面有什么配置。甚至如果你覺(jué)得使用docker compose的命令行來(lái)啟動(dòng)不夠抽象,那么你可以將它編寫入shell腳本中,用戶直接運(yùn)行腳本,只要用戶安裝了Docker環(huán)境,就可以安裝PostgreSQL成功,他甚至不需要關(guān)心Docker命令應(yīng)該如何使用。
進(jìn)入postgres容器中執(zhí)行SQL
使用命令:
docker ps
查找出剛才創(chuàng)建的PostgreSQL容器的ID:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dcf5e3c0ff7f postgres:latest "docker-entrypoint.s…" 13 hours ago Up 13 hours (healthy) 0.0.0.0:5432->5432/tcp postgres-expr
獲得container_id = dcf5e3c0ff7f,接著我們使用以下命令進(jìn)入容器的bash中,方便在操作容器:
docker exec -it dcf5e3c0ff7f /bin/bash
注意,如果是在Windows下執(zhí)行這條命令的時(shí)候,使用Git Bash來(lái)執(zhí)行可能會(huì)因?yàn)榻K端的一些問(wèn)題執(zhí)行失敗,此時(shí)需要更換一下執(zhí)行命令的終端,比如:PowerShell。
進(jìn)入到容器中是這個(gè)樣子的:
> docker exec -it dcf5e3c0ff7f /bin/bash root@dcf5e3c0ff7f:/#
第一行是在PowerShell中執(zhí)行的,而第二行則是PostgreSQL容器中運(yùn)行的bash進(jìn)程。
接著我們就可以使用:
psql [OPTION]... [DBNAME [USERNAME]]
這里介紹連接數(shù)據(jù)庫(kù)需要使用的OPTION選項(xiàng),具體的你可以使用psql --help來(lái)查看:
-h指定PostgreSQL數(shù)據(jù)庫(kù)的IP地址。-p指定PostgreSQL數(shù)據(jù)庫(kù)的端口號(hào)。-U指定登錄到數(shù)據(jù)庫(kù)的用戶名,不指定默認(rèn)就是root。-w從不提示輸入密碼,字面意思,不需要輸入密碼來(lái)進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù),默認(rèn)是不需要輸入密碼的。-W強(qiáng)制密碼輸入。
按照這個(gè)用法,我們可以用以下兩種方式連接數(shù)據(jù)庫(kù):
# 這里由于我們?cè)趧?chuàng)建容器的時(shí)候指定的特權(quán)用戶是aderversa,因此root被擠占掉了 # 用戶名對(duì)于我這里來(lái)說(shuō)是必須設(shè)置的。 psql -p 127.0.0.1 -p 5432 -U aderversa testdb
或者省事一點(diǎn),直接使用:
psql testdb aderversa
執(zhí)行成功后我們就能夠進(jìn)入psql的命令行:
psql (17.2 (Debian 17.2-1.pgdg120+1)) Type "help" for help. testdb=#
psql的使用
這里我們并不知道如何使用這個(gè)命令行,它提示我們可以使用help來(lái)獲得幫助,那么就執(zhí)行一波help,得到了以下信息:
You are using psql, the command-line interface to PostgreSQL.
Type: copyright for distribution terms
h for help with SQL commands
? for help with psql commands
g or terminate with semicolon to execute query
q to quit
這里它告訴我們:
copyright,可以PostgreSQL DDMS的一些條款,里面大概是說(shuō):不管你出于何種目的,該軟件和其文檔都是允許你使用、復(fù)制、修改和發(fā)布的,并且是不需要任何費(fèi)用,不需要修改的同意…看起來(lái)是非常寬松的聲明,畢竟PostgreSQL遵循的是BSD協(xié)議。h顯示SQL命令,比如CREATE TABLEALTER TABLE…。?顯示psql的命令,這里面還是非常多命令的,大多都是用來(lái)查看數(shù)據(jù)庫(kù)的狀態(tài)的,比如存在什么表、數(shù)據(jù)庫(kù)、視圖之類的。這里介紹一些常用的、簡(jiǎn)單的命令:l,列出所有數(shù)據(jù)庫(kù);c[onnect],連接到數(shù)據(jù)庫(kù)某個(gè)數(shù)據(jù)庫(kù),如果先前有連接到某個(gè)數(shù)據(jù)庫(kù)那么這個(gè)操作就是更換連接的數(shù)據(jù)庫(kù);dt,查看正在使用的數(shù)據(jù)庫(kù)中存在哪些表(注意,默認(rèn)創(chuàng)建的表似乎是不會(huì)列出來(lái)的);
g執(zhí)行psql的上一個(gè)命令。q退出psql。
以上就是psql的基本用法了,你可以按照自己的在上面執(zhí)行SQL語(yǔ)句,比如:
create table user ( id int primary key );
注意SQL命令以;結(jié)尾就可以了。
創(chuàng)建完成后可以使用:
dt
來(lái)查看你是否創(chuàng)建成功。
接下來(lái)就是你發(fā)揮創(chuàng)造力的時(shí)候了,自己嘗試著使用psql吧。
補(bǔ)充postgres容器的環(huán)境變量
POSTGRES_PASSWORD,必要的環(huán)境變量。這個(gè)環(huán)境變量將設(shè)置PostgreSQL容器中特權(quán)用戶的密碼。如果你要使用PostgreSQL鏡像,讓它以容器的形式的運(yùn)行,那么這個(gè)環(huán)境變量就必須要設(shè)置,它一定不能夠?yàn)榭栈蛘呶炊x。默認(rèn)的特權(quán)用戶將由POSTGRES_USER來(lái)定義。POSTGRES_USER,可選的環(huán)境變量。設(shè)置PostgreSQL容器中的特權(quán)用戶名,需要與POSTGRES_PASSWORD一起使用,以此設(shè)置好特權(quán)用戶的名字和密碼。如果該環(huán)境變量未被指定,那么默認(rèn)的特權(quán)用戶名為postgres。POSTGRES_DB,可選的環(huán)境變量。定義容器首次運(yùn)行創(chuàng)建的默認(rèn)數(shù)據(jù)庫(kù)的名字。如果該環(huán)境變量未被使用,那么該環(huán)境變量的值等于POSTGRES_USER的值。POSTGRES_INITDB_ARGS,可選的環(huán)境變量。大概最終是以這種方式被利用:postgres initdb ${POSTGRES_INITDB_ARGS}。POSTGRES_INITDB_WALDIR,可選的環(huán)境變量。定義PostgreSQL事務(wù)日志的位置。默認(rèn)的事務(wù)日志的位置是PostgreSQL主數(shù)據(jù)文件夾(PGDATA指定)下的一個(gè)子文件夾。POSTGRES_HOST_AUTH_METHOD,可選的環(huán)境變量。(個(gè)人理解,似乎是與密碼摘要相關(guān)的東西,這一般不需要我們關(guān)注,如果有興趣可以去PostgreSQL: Documentation: 14: 21.5. Password Authentication了解一下)。PGDATA,可選的環(huán)境變量。定義PostgreSQL主數(shù)據(jù)文件夾的位置,默認(rèn)是/var/lib/postgresql/data,如果有調(diào)整位置的需求那么可以按需求設(shè)置該變量的值。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Dockerfile部署SpringBoot項(xiàng)目的方法
這篇文章主要介紹了利用Dockerfile部署SpringBoot項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
非docker方式部署openwebui的完整過(guò)程記錄
這篇文章主要介紹了從使用Docker部署OpenWebUI到直接部署的切換過(guò)程,包括停止并刪除未使用的Docker鏡像以釋放硬盤空間,并記錄了直接部署的具體步驟,需要的朋友可以參考下2025-02-02
如何Docker化Python Django應(yīng)用程序
今天小編就為大家分享一篇關(guān)于如何Docker化Python Django應(yīng)用程序的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-09-09
Docker+Jenkins實(shí)現(xiàn)一鍵自動(dòng)化部署項(xiàng)目的圖文教學(xué)
Jenkins是一個(gè)廣泛使用的開源持續(xù)集成工具,它能自動(dòng)化構(gòu)建,測(cè)試和部署軟件項(xiàng)目,本文主要介紹了關(guān)于docker搭建Jenkins實(shí)現(xiàn)一鍵自動(dòng)化部署項(xiàng)目,需要的朋友可以參考下2025-05-05
DockerToolBox文件掛載的實(shí)現(xiàn)代碼
這篇文章主要介紹了DockerToolBox文件掛載的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
docker啟動(dòng)nginx及常見nginx配置方式
這篇文章主要介紹了docker啟動(dòng)nginx及常見nginx配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
使用docker部署django技術(shù)棧項(xiàng)目的方法步驟
這篇文章主要介紹了使用docker部署django技術(shù)棧項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

