centos7 上搭建基于docker的postgis + flask

news/2024/7/9 22:27:20 标签: docker, 数据库, postgresql, flask, ip

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访问。


http://www.niftyadmin.cn/n/905568.html

相关文章

Django之404、500、400错误处理

要自定义处理url请求错误需要进行三步操作&#xff1a;主要错误有&#xff1a; 404错误&#xff1a;page not found视图 500错误&#xff1a;server error视图 400错误&#xff1a;bad request视图 以404错误为例&#xff0c;500、404同理 我这里创建了一个应用&#xff0c;名为…

保罗·艾伦

我们不会写无聊的东西&#xff0c;这个事情实在太猛 先问大家一个问题&#xff0c;微软的创始人是谁&#xff1f; 如果你认为是比尔盖茨的话&#xff0c;那么你绝对需要认真看看下面的文章 本文标题没有错误&#xff0c;因为微软事实上的创始人我们认为并非比尔盖茨 而是这位老…

焦旭超201771010109《面向对象程序设计(java)》第八周学习总结

一、实验目的与要求 (1) 掌握接口定义方法&#xff1b; (2) 掌握实现接口类的定义要求&#xff1b; (3) 掌握实现了接口类的使用要求&#xff1b; (4) 掌握程序回调设计模式&#xff1b; (5) 掌握Comparator接口用法&#xff1b; (6) 掌握对象浅层拷贝与深层拷贝方法&#xff1…

leetcode[19]删除链表的倒数第N个节点 python3实现(经典快慢指针+虚节点)

# 给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。 # # 示例&#xff1a; # # 给定一个链表: 1->2->3->4->5, 和 n 2. # # 当删除了倒数第二个节点后&#xff0c;链表变为 1->2->3->5. # # # 说明&…

docker hub连接github无法构建镜像的问题解决

初次使用docker hub关联github&#xff0c;参考官方教程&#xff1a; http://docs.docker.oeynet.com/docker-hub/github/#creating-an-automated-build 关联了github仓库&#xff0c;结果遇到了无法自动构建的问题&#xff0c;手动点击trigger也没有反应&#xff1a; 折腾…

django之 使用py文件操作django项目中的表

django之 使用py文件操作django项目中的表 要想在一个另外的py文件中操作django,可以使用如下的代码 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE",mysite.settings) #mysite用的是自己的project import django django.setup()from app01 import mode…

docker + github + centos 设置crontab定时任务实现内网环境下自动部署

环境&#xff1a;内网centos7服务器一台&#xff0c;能正常访问互联网。 目标&#xff1a;代码push到github后&#xff0c;能自动在服务器上更新部署docker镜像。 整体思路 github仓库更新后&#xff0c;可通过关联docker hub仓库自动构建镜像&#xff0c;参考官方教程&…

python 制作一对一聊天

用到的参考资料 https://blog.csdn.net/jia666666/article/details/81624550 https://blog.csdn.net/jia666666/article/details/81624837 https://blog.csdn.net/Mengwei_Ren/article/details/71305885 https://www.cnblogs.com/dcb3688/p/4586373.html 我用的是pyqt5做用户界…