上个月,老师让我做了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/,其他版本的搭建方式也可在该地址找到。
如果你不关心镜像的构建过程,可以跳过此部分,进入第三部分,直接开始使用。
- 下载并打开Ubuntu 18.04的docker镜像
docker pull ubuntu:18.04 # 下载镜像,此步可省略,创建镜像时会自动下载 docker run –it –p 80:80 ubuntu:18.04 # 使用镜像创建容器
- 在打开的容器中,开始配置
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/目录下。(每个压缩包文件解压到一个文件夹)
- 配置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并后台运行即可。
使用日本-四国地图数据的显示结果如下: