docker-DockerFile基于debian容器,配置postgis

430 阅读4分钟

自定义容器背景

由于最近产品开发的需要,写了一个包含下载和上传的项目,可以支持.shp格式的文件。因为我们用的postgresql 数据库,需要编译postgis,这个过程是有些复杂的,需要配置编译一些其他的插件,如果需要用到一个新的服务器上,就需要重新配置一遍,费时费力。为了能够避免这一问题,就想到了用docker配置,即插即用,节省时间和精力。

为什么用debian配置容器

一般来说Debian作为适合于服务器的操作系统,它比Ubuntu要稳定得多。可以说稳定得无与伦比了。debian整个系统,只要应用层面不出现逻辑缺陷,基本上固若金汤,是个常年不需要重启的系统(当然,这是夸张了点,但并没有夸大其稳定性)。debian整个系统基础核心非常小,不仅稳定,而且占用硬盘空间小,占用内存小。相对debian来说,CentOS略显体积大一点。128M的VPS即可以流畅运行Debian,而CentOS则会略显吃力。所以我们选择了debian镜像来配置容器。

安装docker

docker安装的文档网上很多,这里就不在进行赘述了,可以看这个网站,个人觉得写的很详细。非常全,明了易懂,对新手也很友好。 docker--教程

获取镜像

docker 启动之后,就需要获取镜像了。

## 拉取debian镜像
docker pull debian:10

## 查看是否拉取debian镜像成功
docker images 或 docker image ls

配置DockerFile文件

在一个目录下,新建Dockerfile文件

 mkdir dockerFolder
 cd dockerFolder
 touch Dockerfile
 vim Dockerfile

编辑Dockerfile,把下面代码放进Dockerfile中

FROM debian
RUN set -x; buildDeps='gcc libc6-dev make wget' \
   && apt-get update \
   && apt-get install -y $buildDeps \
   && apt-get install -y xz-utils \
   && cd /usr/local \
   && wget https://nodejs.org/dist/v14.16.0/node-v14.16.0-linux-x64.tar.xz \
   && tar xf node-v14.16.0-linux-x64.tar.xz \
   && ln -sf /usr/local/node-v14.16.0-linux-x64/bin/npm   /usr/local/bin/npm \
   && ln -sf /usr/local/node-v14.16.0-linux-x64/bin/node   /usr/local/bin/node


COPY  gdal-2.3.1.tar.gz /usr/local/
COPY  geos-3.6.2.tar.bz2 /usr/local/
COPY  json-c-0.13.1.tar.gz /usr/local/
COPY  postgis-3.0.1.tar.gz /usr/local/
COPY  postgresql-12.0.tar.gz /usr/local/
COPY  proj-5.1.0.tar.gz /usr/local/
COPY  protobuf-c-1.3.3.tar.gz /usr/local/
COPY  protobuf-v3.5.0.tar.gz /usr/local/

RUN cd /usr/local \
    && tar -zxvf postgresql-12.0.tar.gz \
    && cd postgresql-12.0 \
    && apt-get install -y  libreadline-dev \  ## centos为:yum -y install readline-devel
    && apt-get install zlib1g.dev \
    && ./configure --prefix=/usr/local/pgsql \  
    && make \
    && make install \

RUN cd /usr/local \
    && apt-get install -y bzip2 \
    && apt-get install g++
    && tar -jxvf geos-3.6.2.tar.bz2  \
    && cd geos-3.6.2 \
    && ./configure --prefix=/usr/local/geos \  
    && make \
    && make install \

RUN cd /usr/local \
    && tar -zxvf proj-5.1.0.tar.gz   \
    && cd proj-5.1.0 \
    && ./configure --prefix=/usr/local/proj \  
    && make \
    && make install \

RUN cd /usr/local \
    && tar -zxvf json-c-0.13.1.tar.gz   \
    && cd json-c-0.13.1 \
    && apt-get install -y autoconf automake libtool \
    && ./configure --prefix=/usr/local/json-c \  
    && make \
    && make install \   

RUN cd /usr/local \
    && tar -zxvf gdal-2.3.1.tar.gz   \
    && cd gdal-2.3.1 \
    && ./configure --prefix=/usr/local/gdal \  
    && make \
    && make install \   


RUN cd /usr/local \
    && tar -zxvf protobuf-v3.5.0.tar.gz   \
    && cd protobuf-3.5.0 \
    && apt-get install -y autoconf automake libtool \
    && apt-get install -y curl \
    && apt-get install -y unzip \
    && sh ./autogen.sh \
    && ./configure --prefix=/usr/local/protobuf \  
    && make \
    && make install \   



RUN cd /usr/local \
    && tar -zxvf protobuf-c-1.3.3.tar.gz   \
    && cd protobuf-c-1.3.3 \
    && apt-get install -y  pkg-config \
    && export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig \
    && ./configure --prefix=/usr/local/protobuf-c \
    && make \
    && make install \
    
 

RUN cd /usr/local \
    && tar -zxvf postgis-3.0.1.tar.gz   \
    && cd postgis-3.0.1 \
    && apt-get install -y libxml2-dev \
    && ./configure --with-pgconfig=/usr/local/pgsql/bin/pg_config --with-geosconfig=/usr/local/geos/bin/geos-config --with-projdir=/usr/local/proj --with-gdalconfig=/usr/local/gdal/bin/gdal-config --with-protobufdir=/usr/local/protobuf-c --with-jsondir=/usr/local/json-c \
    && make \
    && make install \
    /usr/local/pgsql/bin

RUN ln -sf /usr/local/pgsql/bin/initdb /usr/bin/initdb \
    && ln -sf /usr/local/geos/lib/libgeos_c.so.1 /usr/local/pgsql/lib/ \
    && adduser postgres \
    && mkdir /usr/local/pgsql/data \
    && chown postgres /usr/local/pgsql/data 
                            

1:我们的项目是用的egg.js框架,所以第一部分配置了node,其他语言请自行配置。

2:第二部分我用了COPY指令把压缩包放到容器中,也可以直接用RUN 指令用wget的方法直接下载,但是这个下载的过程有点慢,而且报错得话,再次运行Dockerfile,还是会重复下载,很费时间,建议现在服务器上准备好需要的安装包,用COPY指令复制进容器。*

3:由于Dockerfile内容较长,建议新手一段内容一段内容进行配置,可以避免不必要的坑。

运行DockerFile文件

在Dockerfile文件所在目录,执行文件

 docker build -t debian .

最后一行出现 一下代码,表示配置成功
Successfully built <44aa4490ce2c>

进入debian容器

 docker run -it  debian /bin/bash
 su postgres

可以进入postgres用户就表示配置成功了。

打包debian容器

docker save -o debian.tar debian

生成一个tar包,就可以拿到任何环境下使用

在新的环境载入镜像

docker load -i debian.tar

载入成功之后,就可以使用镜像了。

推荐一个非常好用的坐标系转换的函数, 基于PG+PostGIS转换坐标系函数。支持各种坐标系,点线面各类型转换 坐标系转换函数