Docker中的 PostgreSQL笔记
使用Docker创建PostgreSQL,并使用Python3的pandas库进行操作。
环境:
在macOS Catalina 10.15.6上进行确认,进行文章重写。
Docker版本19.03.8,构建版本afacb8b。
在macOS上,使用的是zsh作为shell,但主机端的提示符写作“$”。
在主机上创建数据库的挂载点。
在当前目录下创建一个名为vols的文件夹。
mkdir ${PWD}/vols
启动容器
-
- Container name pg_docker
-
- パスワード設定 postgres POSTGRES_PASSWORD=postgres
-
- ポート host port:container port 5432:5432
-
- volumeをマウント $PWD/vols:/var/lib/postgresql/
カレントディレクトリのvolsにdockerのpostgresqlをマウント
docker run --rm --name pg-docker -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $PWD/vols:/var/lib/postgresql/data postgres
确认容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dc570e3835c postgres "docker-entrypoint.s…" 16 hours ago Up 16 hours 0.0.0.0:5432->5432/tcp pg-docker
在Container NAME中,使用shell连接到Container。
-
- containerに接続、Shellを立ち上げる docker exec コンテナに入るとプロンプトが変わります
-it インターラクティブ ttyを指定
/bin/bash bashを立ち上げる
postgresユーザーになる su – postgres また、プロンプトが変わります
一覧を表示する psql -l
$ docker container exec -it pg-docker /bin/bash
root@db8619e414e8:/# su - postgres
postgres@db8619e414e8:~$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
使用createdb命令创建名为mydb的数据库,构造CREATE语句。
mydb=# CREATE TABLE weather (
id serial,
day date not null,
city varchar(80) not null,
temp_max numeric not null, -- 最低気温
temp_min numeric not null, -- 最高気温
wind real,
PRIMARY KEY (id)
);
用psql登录到mydb数据库并创建表格
-
- 使用psql进入名为mydb的数据库
-
- 创建weather表 CREATE TABLE
-
- 查看weather表的定义 \d 表名
-
- 插入数据 INSERT INTO
-
- 查看数据 SELECT
-
- 退出psql \q
-
- 退出postgres用户 exit
- 退出docker容器 exit
天气表定义
id列 是序列型的主键
day列 是日期型的,不能为空
temp_max列 是数字型的,不能为空
temp_min列 是数字型的,不能为空
wind列 是实数型的
postgres@db8619e414e8:~$ psql mydb
psql (12.3 (Debian 12.3-1.pgdg100+1))
Type "help" for help.
mydb=# CREATE TABLE weather (
mydb(# id serial,
mydb(# day date not null,
mydb(# city varchar(80) not null,
mydb(# temp_max numeric not null, -- 最低気温
mydb(# temp_min numeric not null, -- 最高気温
mydb(# wind real,
mydb(# PRIMARY KEY (id)
mydb(# );
CREATE TABLE
mydb=#
mydb=# \d weather
Table "public.weather"
Column | Type | Collation | Nullable | Default
----------+-----------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('weather_id_seq'::regclass)
day | date | | not null |
city | character varying(80) | | not null |
temp_max | numeric | | not null |
temp_min | numeric | | not null |
wind | real | | |
Indexes:
"weather_pkey" PRIMARY KEY, btree (id)
mydb=# INSERT INTO weather VALUES (0,'2019-11-18', 'test',21.3,10.5,0.7);
INSERT 0 1
mydb=# INSERT INTO weather VALUES (1,'2020-07-18', 'test',11.3,7.5,0.7);
INSERT 0 1
mydb=# select * from weather;
id | day | city | temp_max | temp_min | wind
----+------------+------+----------+----------+------
0 | 2019-11-18 | test | 21.3 | 10.5 | 0.7
1 | 2020-07-18 | test | 11.3 | 7.5 | 0.7
(2 rows)
postgres@db8619e414e8:~$ exit
logout
root@db8619e414e8:/# exit
exit
$
确认图像并停止容器
-
- docker image ls で、最新版のpostgres lateatが取得されている
-
- docker container ls -a コンテナの確認 STATUSで、Up ~~~を確認
-
- docker container stop pg-docker コンテナを停止
-
- docker container ls -a コンテナの確認 綺麗に片づいている
runをしたときのオプション –rm が効いている
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres latest 4b52913b0a3a 2 days ago 313MB
nginx latest 0901fa9da894 2 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db8619e414e8 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:5432->5432/tcp pg-docker
$ docker container stop pg-docker
pg-docker
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
使用Python主机与Docker中的PostgreSQL建立连接,并使用Pandas。
请执行以下操作之一以进行 paraphrase:
1. 在执行这个命令之前,请确保停止前一个容器,或者重新运行 docker container run 命令
2. 在安装 psycopg2 之前,请确保停止之前的容器,或者再次运行 docker container run 命令。
$ python
Python 3.7.5 (default, Oct 25 2019, 10:52:18)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> import pandas as pd
>>> # 接続設定
... conn = psycopg2.connect("dbname=mydb host=localhost port=5432 user=postgres password=postgres")
>>>
>>> query = "SELECT * FROM weather;"
>>> df = pd.read_sql(sql=query, con=conn)
>>> df
id day city temp_max temp_min wind
0 0 2019-11-18 test 21.3 10.5 0.7
1 1 2019-12-18 test 11.3 7.5 0.7
>>> exit()
$
连接设置
-
- conn = psycopg2.connect()
dbname=DataBase名 or database=DataBase名
user=ユーザー名
password=パスワード
host=URL
port=ポート番号 defaultの場合省略可
用Pandas的pd.read_sql函数读取SQL查询结果并设置连接。
参考《在Docker中使用PostgreSQL和Docker数据卷挂载》(https://medium.com/faun/postgresql-in-docker-mount-volume-3220fbd0afc4)。