自定义容器背景
由于最近产品开发的需要,写了一个包含下载和上传的项目,可以支持.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转换坐标系函数。支持各种坐标系,点线面各类型转换
坐标系转换函数