使用Docker部署OpenStreetMap服务器

上个月,老师让我做了Docker的OSM服务器搭建,当时边踩坑边记录,最终搞定了部署,遂博客记录。

一、安装并配置Docker

本部分介绍centOS 7环境下docker的安装步骤,内容来自http://www.runoob.com/docker/docker-tutorial.html,其他环境下的安装,也可参考该地址。

如果你已经安装好docker。可以跳过此部分。

在终端使用

uname -r

查看你centOS内核版本,需要centOS 7 64位,内核版本3.10或以上

移除就的Docker版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

安装一些必要的工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum缓存:

sudo yum makecache fast

安装 Docker-ce:

sudo yum -y install docker-ce

启动 Docker 后台服务:

sudo systemctl start docker

测试运行 hello-world:

docker run hello-world

此时,应看到“Hello from Docker”。

至此,Docker安装完成。

二、构建镜像

本部分镜像的构建基于Ubuntu 18.04。内容译载自https://switch2osm.org/manually-building-a-tile-server-18-04-lts/,其他版本的搭建方式也可在该地址找到。

如果你不关心镜像的构建过程,可以跳过此部分,进入第三部分,直接开始使用。

  1. 下载并打开Ubuntu 18.04的docker镜像
    docker pull ubuntu:18.04  # 下载镜像,此步可省略,创建镜像时会自动下载
    docker run –it –p 80:80 ubuntu:18.04  # 使用镜像创建容器
  2. 在打开的容器中,开始配置
    apt-get update 
    apt-get install -y sudo
    
    // 安装基本依赖
    sudo apt install -y libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg curl
    
    // 安装postgresql 及 postgis (安装过程需要选择地区)
    sudo apt-get install -y postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts
    
    // 开启postgresql服务
    sudo service postgresql start
    
    // 使用用户名 devsum 创建数据库,你可以修改为别的名字
    sudo -u postgres -i
    createuser devsum  # 如果询问是否设置为superuser,请选择是
    createdb -E UTF8 -O devsum gis  # 创建名为gis的库
    
    // 配置数据库
    psql
    \c gis
    CREATE EXTENSION postgis;
    CREATE EXTENSION hstore;
    ALTER TABLE geometry_columns OWNER TO devsum;
    ALTER TABLE spatial_ref_sys OWNER TO devsum;
    \q
    exit
    
    // 添加账户
    sudo useradd -m devsum
    
    // 安装 osm2pgsql,用于将osm数据存入数据库
    mkdir /home/devsum/src
    cd /home/devsum/src
    git clone git://github.com/openstreetmap/osm2pgsql.git
    cd osm2pgsql
    
    // 安装一些构建osm2pgsql所需的依赖
    sudo apt install -y make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev
    
    // 构建并安装 osm2pgsql
    mkdir build && cd build
    cmake ..
    sudo make install
    
    // 安装Mapnik 
    sudo apt-get install -y autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik
    
    // 安装 mod_tile 和 renderd
    // 编译 mod_tile 源代码
    cd /home/devsum/src
    git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git
    cd mod_tile
    ./autogen.sh
    // 构建并安装
    ./configure
    make
    sudo make install
    sudo make install-mod_tile
    sudo ldconfig
    
    // 配置样式表
    cd /home/devsum/src
    git clone git://github.com/gravitystorm/openstreetmap-carto.git
    cd openstreetmap-carto
    // 安装carto sudo apt install -y npm nodejs sudo npm install -g carto carto -v # 检查carto版本高于1.1.0

    //将git下来的项目转换成mapnik可读的文件 carto project.mml > mapnik.xml // 下载地图(为测试,选用一个小的地图数据) mkdir /home/devsum/data cd /home/devsum/data wget http://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf // 导入地图数据到数据库 (此处需要修改-c参数的值(node cache)当你的机器内存为1G时,推荐设置为小于800) sudo su devsum osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script /home/devsum/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 -S /home/devsum/src/openstreetmap-carto/openstreetmap-carto.style /home/devsum/data/azerbaijan-latest.osm.pbf e exit # 回到root用户 // 下载shapefile cd /home/devsum/src/openstreetmap-carto/ scripts/get-shapefiles.py # 会花费较长时间,并可能失败注1 // 下载font sudo apt-get install -y fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont

    注1:如果下载耗时过长,你可以自己下载(https://pan.baidu.com/s/14SLismMSLlXm1Db_JOgIEQ 提取码:mbci )后解压至到容器的/home/devsum/src/openstreetmap-carto/data/目录下。(每个压缩包文件解压到一个文件夹)

  3. 配置Web服务器

   3.1 配置renderd

 sudo nano /usr/local/etc/renderd.conf  # 打开renderd配置文件

  修改以下内容:

num_threads=4  # 当机器内存为2GB左右时,修改为2
XML=/home/renderaccount/src/openstreetmap-carto/mapnik.xml  # 将renderaccount修改为选择的用户名,如devsum

   3.2 配置Apache

sudo mkdir /var/lib/mod_tile
sudo chown devsum /var/lib/mod_tile

sudo mkdir /var/run/renderd
sudo chown devsum /var/run/renderd

   3.3 在Apache中配置mod_tile

sudo nano /etc/apache2/conf-available/mod_tile.conf  # 修改该文件
LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so  # 添加此行

  保存退出后,运行:

sudo a2enconf mod_tile

  3.4 在Apache中配置renderd

  

sudo nano /etc/apache2/sites-available/000-default.conf # 修改该文件

  在“ServerAdmin”与“DocumentRoot”行间添加以下内容:

LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

  完成后,启动Apache服务

sudo service apache2 start

  3.5 前台运行renderd

  接下来,我们尝试在前台运行renderd以检查配置是否成功。

sudo service postgresql start  # 首先运行postgresql服务
sudo su devsum  # 需要切换用户
renderd -f -c /usr/local/etc/renderd.conf  # 开启渲染

  

  此时,打开浏览器,访问127.0.0.1/hot/0/0/0.png(如果部署在服务器上,应输入服务器IP),应该显示如下图像:

  至此,配置基本完成。

  Ctrl+C终止渲染。

  3.6 配置后台renderd

  

nano /home/devsum/src/mod_tile/debian/renderd.init  # 修改renderaccount为devsum(或其他在上面设置的用户名)
sudo cp /home/devsum/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd
sudo cp /home/devsum/src/mod_tile/debian/renderd.service /lib/systemd/system/

  4. 提交镜像

  至此,容器已经配置完成。需要将它打包为一个镜像。打包之前,先创建一个脚本,以方便开启服务。

  

nano /home/devsum/start-service.sh
//  输入以下内容:
#!/bin/bash
sudo service postgresql start
sudo service apache2 start
sudo service renderd start

  保存并退出,退出docker容器。

  为测试功能,可将容器内osm_tile目录下的extra下的样例从容器中复制到主机上:

  

docker cp %容器ID%:/home/devsum/src/mod_tile/extra/sample_leaflet.html ~/  # 容器ID可以使用docker ps –a命令查看

  

  将容器提交为镜像:

docker commit –a=”devsum” –m=”Config Done” %容器ID% devsum/openstreetmap:v1

三、使用Dockerfile文件构建服务器

在上个部分中,我们完成了镜像的配置,本节将使用该镜像进行构建,如果你跳过了上一个部分,也不同担心,可以直接使用我的镜像。

创建一个文件Dockerfile,输入以下内容:

1.    FROM devsum/openstreetmap:v1
2.    # 如果你在上一个部分中配置了镜像,你可以修改第一行参数为你的镜像名,也可以直接使用我的镜像,创建容器时会自动下载,你也可以使用 docker pull devsum/openstreetmap:v1命令手动下载
3.    EXPOSE 80
4.    CMD sh /home/devsum/start-service.sh && tail -f /var/log/apache2/access.log

打开终端,切换到dockerfile所在目录。使用

docker build -t osm-server .  # 最后有一个点别漏了

构建docker容器,构建成功后,你应该看到“Successfully built”字样。

后台运行该容器:

docker run -d -p 80:80 osm-server

用浏览器打开上一部分中复制出来的HTML文件(如果你跳过了上一部分,可以点击此处下载),应该看到地图显示结果(如果是服务器上搭建,请先修改html文件中的127.0.0.1为服务器ip):

 四、使用自己的地图数据

以上的步骤中,我使用的地图数据是azerbaijan的地图数据(其他的地图数据可以在http://download.geofabrik.de/下载),接下来我将演示如何使用自己的地图数据。(或者你也可以在第二部分中直接使用自己的地图数据)

准备好地图数据(可以是自己的地图数据或下载的别的地图数据),本部分我以日本-四国的数据作为演示(因为较小)。

创建Dockerfile,内容编辑如下:(第4行修改为你使用的地图数据文件的名字)

FROM devsum/openstreetmap:v1
MAINTAINER devsum

ARG mapData=shikoku-latest.osm.pbf
ADD ${mapData} /home/devsum/data
EXPOSE 80
RUN sudo service postgresql start && sudo su devsum -c "osm2pgsql -d gis --create --slim  -G --hstore --tag-transform-script /home/devsum/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 -S /home/devsum/src/openstreetmap-carto/openstreetmap-carto.style /home/devsum/data/${mapData}"
CMD sh /home/devsum/start-service.sh && tail -f /var/log/apache2/access.log将地图数据与Dockerfile放在同一目录下,按照第三部分build并后台运行即可。

将地图数据与Dockerfile放在同一目录下,按照第三部分build并后台运行即可。

使用日本-四国地图数据的显示结果如下:

猜你喜欢

转载自www.cnblogs.com/devsum/p/11048938.html