在Docker中部署osrm-backend

使用 Docker 安装和运行 OSRM-backend 是一个非常方便的方法,因为 Docker 可以提供一致的环境,避免了许多依赖性和配置问题。以下是如何使用 Docker 安装和运行 OSRM-backend 的步骤:

1. 安装 Docker

确保系统上已经安装了 Docker。如果没有安装,可以使用以下命令安装 Docker:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

2. 启动 Docker 服务

sudo systemctl start docker

3. 设置 Docker 开机自启

sudo systemctl enable docker

3.1配置 Docker 使用国内镜像加速器

编辑 Docker 配置文件 /etc/docker/daemon.json,添加加速器地址(以阿里云为例):

sudo nano /etc/docker/daemon.json

添加以下内容(将 YOUR_MIRROR_URL 替换为你要获取的加速器地址):

{
  "registry-mirrors": ["https://YOUR_MIRROR_URL"]
}

保存并退出编辑器,然后重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

4. 拉取 OSRM-backend 镜像

sudo docker pull osrm/osrm-backend

5. 启动 OSRM 服务

处理完地图数据后,启动 OSRM 服务:

sudo docker run --rm -t -d --name fot-osrm -v /data/fot/map/europe:/data -p 5000:5000 osrm/osrm-backend osrm-routed --algorithm mld /data/switzerland-latest.osrm

6. 下载地图数据

例如:下载瑞士地图数据文件 switzerland-latest.osm.pbf:

wget http://download.geofabrik.de/europe/switzerland-latest.osm.pbf

7. 创建数据目录并移动地图数据

创建数据目录并将地图数据移动到该目录:

sudo mkdir -p /data/fot/map/europe
sudo mv switzerland-latest.osm.pbf /data/fot/map/europe/

8. 处理地图数据

使用 Docker 容器来处理地图数据:

sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/switzerland-latest.osm.pbf
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-partition /data/switzerland-latest.osrm
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-customize /data/switzerland-latest.osrm

9. 测试服务

您可以使用 curl 命令来测试 OSRM 服务是否正常运行:

curl "http://localhost:5000/route/v1/driving/7.4474,46.9481;7.4355,46.9512?overview=false&steps=true"

10.完整的脚本

为了方便,可以将上述步骤整合成一个脚本:

#!/bin/bash

# 安装 Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 配置 Docker 使用国内镜像加速器
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
  "registry-mirrors": ["https://YOUR_MIRROR_URL"]
}
EOF

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 拉取 OSRM-backend 镜像
sudo docker pull osrm/osrm-backend

# 下载地图数据
wget http://download.geofabrik.de/europe/switzerland-latest.osm.pbf

# 创建数据目录并移动地图数据
sudo mkdir -p /data/fot/map/europe
sudo mv switzerland-latest.osm.pbf /data/fot/map/europe/

# 处理地图数据
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/switzerland-latest.osm.pbf
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-partition /data/switzerland-latest.osrm
sudo docker run --rm -v /data/fot/map/europe:/data osrm/osrm-backend osrm-customize /data/switzerland-latest.osrm

# 启动 OSRM 服务
sudo docker run --rm -t -d --name fot-osrm -v /data/fot/map/europe:/data -p 5000:5000
osrm/osrm-backend osrm-routed --algorithm mld /data/switzerland-latest.osrm

将上述脚本保存为 install_osrm.sh,然后执行:

chmod +x install_osrm.sh
./install_osrm.sh

处理地图数据失败处理

当处理单个地区文件比较大时,如处理的italy约1.9G,在执行osrm-extract 遇到了 std::bad_alloc 错误时总是失败,报错

[root@123 europe]# sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/italy-latest.osm.pbf --threads=1
[info] Parsed 0 location-dependent features with 0 GeoJSON polygons
[info] Using script /opt/car.lua
[info] Input file: italy-latest.osm.pbf
[info] Profile: car.lua
[info] Threads: 1
[info] Parsing in progress..
[info] input file generated by osmium/1.14.0
[info] timestamp: 2024-11-11T21:21:10Z
[info] Using profile api version 4
[info] Found 3 turn restriction tags:
[info]   motorcar
[info]   motor_vehicle
[info]   vehicle
[info] Parse relations ...
[info] Parse ways and nodes ...
TBB Warning: Exact exception propagation is requested by application but the linked library is built without support for it
terminate called after throwing an instance of 'tbb::captured_exception'
  what():  std::bad_alloc

这是由于在处理大型 OSM 数据文件时,内存需求超过了系统的实际可用内存。
进一步的解决方案

  1. 增加系统内存:
    如果可能的话,增加系统的物理内存。这对于处理大型 OSM 数据文件非常重要。
  2. 使用更大的交换空间:
    尝试增加交换空间的大小,例如增加到 8GB 或更大。
  3. 减少线程数:
    尽管您已经将线程数设置为 1,但可以尝试进一步减少其他进程的内存使用,确保 osrm-extract 有尽可能多的内存可用。
  4. 分区域处理:
    如果数据文件非常大,可以考虑将数据文件分割成多个较小的区域分别处理。例如,您可以下载意大利不同地区的 OSM 数据文件,然后分别处理每个区域。

方式一、增加交换空间

  1. 停用当前交换空间:
    sudo swapoff -a
  2. 删除旧的交换文件:
    sudo rm /swapfile
  3. 创建新的交换文件:
    sudo fallocate -l 8G /swapfile
    4.设置交换文件的权限:
    sudo chmod 600 /swapfile
    5.设置交换文件:
    sudo mkswap /swapfile
    6.启用交换文件:
    sudo swapon /swapfile
    7.检查交换文件是否已启用:
    sudo swapon --show
    8.执行命令
    sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/italy-latest.osm.pbf --threads=1

方式二、分区域处理

  1. 下载意大利不同地区的 OSM 数据文件:
    从 Geofabrik 下载意大利不同地区的 OSM 数据文件,例如 Lombardy、Sicily 等。
  2. 分别处理每个区域:
    sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/lombardy-latest.osm.pbf --threads=1
    sudo docker run --rm -v /data/fot/map/europe:/data --memory=4g osrm/osrm-backend osrm-extract -p /opt/car.lua /data/sicily-latest.osm.pbf --threads=1
上一篇:掌握 Spring 事务管理:深入理解 @Transactional 注解-事务失效