Centos7 离线安装Docker(简单二进制安装)记录了如何安装docker,本文在docker上部署了postgis +flask应用。
dockerpostgis_2">docker部署postgis
参考:
Set Up a PostGIS Database With Docker
https://github.com/postgis/docker-postgis
下载镜像:
docker pull postgis/postgis
(运行postgis镜像会使用到postgres镜像,联网环境下会自动pull下来)
数据持久化
作为数据库镜像,为了使数据持久化(容器删掉数据还在),需创建volume:
docker volume create pg_data
关于数据持久化,参考:
什么是Docker Volume?
Docker的持久化存储和数据共享(四) - 掘金
启动postgis容器
docker run --name postgis -e POSTGRES_PASSWORD=zzjz123 -d -p 5432:5432 -v pg_data:/var/lib/postgresql/data --restart=always postgis/postgis
参数说明:
-v pg_data:/var/lib/postgresql/data
:加载本地volume到容器文件路径,容器数据库的内容会在本地pg_data中保存(/var/lib/postgresql/data是postgres镜像默认数据存储路径)。以后即使删掉容器重新运行新的数据库容器,只要仍如此加载volume,就能看到原先的数据。
--restart=always
:设置该容器随docker虚拟机启动;
进入psql命令行
运行了数据库容器后,用以下命令连接数据库,可进入psql命令行:
docker run -it --link postgis:postgres --rm postgres \
sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'
正常状态提示符为:
postgres=#
若出现:
postgres=-
表示在等待上一条指令的结束(命令一般需用分号;
结束)
基础指令:
创建database:create database xxx;
查看所有database:\l
选择database:\c [database]
查看table:\dt
列出所有数据:select * from lastappeared;
导入导出数据库
参考:docker postgres 导出导入数据
导出数据库
1、windows环境:
使用pg_dump导出windows下的postgis数据库。
pg_dump.exe在win7 postgresql安装目录/bin文件夹下,在该目录下打开cmd,执行:
格式:pg_dump -U [username] [database] > 保存路径.sql
例如:pg_dump -U postgres nyc > D:/nyc.sql
2、docker环境:
格式:docker exec -ti 容器 pg_dump -U 用户名 -d 数据库名 > 本地文件路径.sql
例如:docker exec -ti postgis pg_dump -U postgres -d nyc > ~/nyc_backup.sql
直接将容器中的数据导出到了本地的~/nyc_backup.sql。
$ pg_dump --help
用法:
pg_dump [选项]... [数据库名字]
联接选项:
-d, --dbname=DBNAME 对数据库 DBNAME备份
-h, --host=主机名 数据库服务器的主机名或套接字目录
-p, --port=端口号 数据库服务器的端口号
-U, --username=名字 以指定的数据库用户联接
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
--role=ROLENAME 在转储前运行SET ROLE
导入数据库
将上面得到的sql文件导入到docker postgis中。
首先使用psql创建数据库:
create database nyc;
导入数据库:
docker cp nyc.sql postgis:/
docker exec postgis sh -c 'exec psql -U postgres -d nyc < nyc.sql'
若要升级数据表,最好将原表先删除,再重新导入:
DROP DATABASE nyc;
否则pg_dump默认是追加记录,而非替换。
查看防火墙状态:
firewall-cmd --state
关闭防火墙:
systemctl stop firewalld.service
即可在外部访问。
dockerflask_154">docker部署flask
目标:将flask应用打包成image部署到docker上,并能访问上面部署的postgis数据库。
参考:實作 Dockerfile + flask 教學 (附GitHub完整程式)
绑定参数和环境变量
为了使打包成的image能接收自定义参数(比如希望能修改ip、port等),可通过设置环境变量的方式向程序传递参数。
在python中获取环境变量:
# get environment variables
dbAddr = os.environ.get("DBADDR")
dbPort = os.environ.get("DBPORT")
dbUser = os.environ.get("DBUSER")
dbPass = os.environ.get("DBPASS")
以后运行镜像时,用-e
参数设置这些环境变量值即可。
撰写Dockerfile
在flask应用根目录下建立Dockerfile、requirements.txt,文件结构如下:
├── Dockerfile
├── main.py
└── requirements.txt
Dockerfile内容如下:
FROM python:3.7.2-stretch
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD python app.py
其中:
FROM
:基础镜像(base image)
WORKDIR
:建立工作目录
ADD
:复制指定的文件、目录或远程文件url,加入到image文件系统中指定位置。
RUN
:创建image过程中执行的指令,每个run会创建一个layer。
CMD
:每个 Dockerfile 只能有一个CMD 指令,是在容器运行时执行的指令。
requirments.txt描述用到的包,内容如下:
aniso8601==8.0.0
certifi==2020.6.20
click==7.1.2
Flask==1.1.2
Flask-Cors==3.0.9
Flask-RESTful==0.3.8
Flask-SQLAlchemy==2.4.4
Flask-WTF==0.14.3
GeoAlchemy2==0.8.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
psycopg2==2.8.6
pymongo==3.11.0
pytz==2020.1
six==1.15.0
SQLAlchemy==1.3.19
Werkzeug==1.0.1
wincertstore==0.2
WTForms==2.3.3
打包镜像
docker终端进入该目录,执行:
$ docker image build -t flask_api .
运行
$ docker run -d -p 5000:5000 -e DBADDR=172.17.0.2 -e DBPORT=5432 -e DBUSER=postgres -e DBPASS=zzjz123 --name flask_api flask_api
其中,172.17.0.2
是postgis容器的ip地址,查看容器ip指令:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \ [container]
此时可正常访问:http://192.168.184.136:5000/lastappeared
也可使用Host模式,加入--net=host
参数。该模式共享host的IP,直接使用本地ip即可访问:
docker run -d --name flask_api --net=host flask_api
注:为了使外部主机可以访问,需关闭防火墙:
查看防火墙状态:firewall-cmd --state
关闭防火墙:systemctl stop firewalld.service
扩展:Docker网络模式
参考:How to Get A Docker Container IP Address - Explained with Examples
Bridge模式下,外部访问容器是通过端口映射实现的,windows下通过machine ip:port
实现访问。
查看machine ip命令:
$ docker-machine ip
192.168.99.100
Host模式下,容器共享本地ip,在本地可通过localhost访问。