容器部署和使用指南
本指南将介绍如何在 Quectel Pi H1 设备上安装和使用 Docker,以便进行容器化应用的部署。
简介
Docker 是一种轻量级的容器化技术,具有以下特点:
- 易管理:使用 Docker 命令管理容器和镜像,依赖隔离,简化部署流程。
- 跨平台:支持 Windows、macOS 和 Linux 系统,可在多种平台上运行和部署容器。
- 可移植性:通过 Dockerfile 和镜像实现环境一致性,便于在不同机器或云平台上快速迁移和部署。
- 高效资源利用:基于容器化技术,共享主机内核,资源占用低,启动速度快,适合微服务架构。
准备工作
在开始安装 Docker 之前,请确保满足以下条件:
系统要求:
- Quectel Pi H1 设备已正常启动
- 已连接到网络(用于下载 Docker 镜像)
- 具有 root 权限或 sudo 权限
网络准备:
- 确保设备可以访问互联网(用于从 Docker Hub 拉取镜像)
- 如果在中国大陆地区,可能需要配置 Docker 镜像源以加速下载
磁盘空间:
- 确保有足够的磁盘空间用于存储 Docker 镜像和容器(建议至少 2GB 可用空间)
安装步骤
更新软件包列表并安装 Docker
sudo apt update
sudo apt install docker.io
配置 iptables
Docker 需要配置 iptables 才能正常工作,执行以下命令:
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
执行上述命令后,需要重启系统以使配置生效:
sudo reboot
验证安装
系统重启后,验证 Docker 是否安装成功:
docker --version
若终端输出类似以下信息,则表示安装成功:
Docker version 26.1.5+dfsg1, build a72d7cd
添加用户权限
为了在不使用 sudo 的情况下运行 Docker 命令,可以将当前用户添加到 Docker 用户组:
sudo usermod -aG docker $USER
添加后,需要启动 Docker 服务并重新登录或重启系统以使配置生效:
# 启动 Docker 服务
sudo systemctl start docker
# 设置 Docker 服务开机自启
sudo systemctl enable docker
重新登录后,可以使用以下命令验证:
docker ps
如果不需要使用 sudo 即可执行,说明配置成功。
配置 Docker 镜像源(可选)
如果在中国大陆地区,访问 Docker Hub 可能较慢,可以配置国内镜像源加速下载。使用以下命令创建 /etc/docker/daemon.json 文件:
sudo mkdir -p /etc/docker
sudo sh -c 'echo "{
\"registry-mirrors\": [
\"https://docker.mirrors.ustc.edu.cn\",
\"https://hub-mirror.c.163.com\"
]
}" > /etc/docker/daemon.json'
配置完成后重启 Docker 服务:
sudo systemctl restart docker
功能使用
提示:
- 镜像(Image):包含应用程序及其运行环境(包括依赖、库、配置文件等)的只读模板。
- 容器(Container):镜像的运行实例,提供基于镜像的可执行环境,包含应用程序和所有依赖,但与主机系统隔离。
查看帮助
使用 Docker 内置的帮助命令查看所有命令的使用方法:
docker --help
docker <command> --help

例如:
docker run --help
docker ps --help
查看 Docker 系统信息
使用 docker info 命令查看 Docker 系统信息,包括版本、系统配置、存储驱动、网络配置等:
docker info

基本操作
拉取 Docker 镜像
使用 docker pull 命令从 Docker Hub 拉取所需的应用镜像:
docker pull <image_name>
# 示例:拉取 hello-world 最新镜像
docker pull hello-world

运行 Docker 容器
使用 docker run 命令基于拉取的镜像运行容器:
# 运行 hello-world 容器(运行后会立即退出)
docker run hello-world
# 运行并指定容器名称
docker run --name my-hello hello-world

注意:hello-world 镜像是一个演示镜像,运行后会打印欢迎信息然后退出。如果需要交互式操作或持续运行的容器,可以使用其他镜像,例如:
# 交互式运行容器(使用 ubuntu 镜像)
docker run -it ubuntu:20.04 /bin/bash
# 后台运行容器(使用 ubuntu 镜像)
docker run -d --name mycontainer ubuntu:20.04 tail -f /dev/null
查看容器和镜像
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看本地镜像
docker images
停止和删除容器
# 停止容器
docker stop <container_id>
# 删除容器
docker rm <container_id>
# 删除镜像
docker rmi <image_id>
保存容器为新镜像
如果对容器进行了修改,可以使用 docker commit 命令将容器保存为新的镜像:
docker commit <container_id> <new_image_name>
例如:
# 查看容器 ID
docker ps -a
# 将容器保存为新镜像
docker commit <container_id> my-hello-world:v1
数据卷(Volumes)
数据卷用于在容器和主机之间共享数据,即使容器被删除,数据卷中的数据仍然保留。
创建数据卷
docker volume create myvolume
使用数据卷运行容器
# 使用 hello-world 镜像(注意:hello-world 运行后会立即退出)
docker run -v myvolume:/data hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d -v myvolume:/data ubuntu:20.04 tail -f /dev/null
上述命令将数据卷 myvolume 挂载到容器的 /data 目录。
直接挂载主机目录
# 使用 hello-world 镜像
docker run -v /host/path:/container/path hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d -v /host/path:/container/path ubuntu:20.04 tail -f /dev/null
将主机的 /host/path 目录挂载到容器的 /container/path 目录。
管理数据卷
# 查看数据卷列表
docker volume ls
# 查看数据卷详情
docker volume inspect myvolume
# 删除数据卷
docker volume rm myvolume
端口映射
端口映射允许将容器内的端口映射到主机的端口,以便从外部访问容器内的服务。
基本端口映射
docker run -d -p 8080:80 nginx
将容器的 80 端口映射到主机的 8080 端口。
指定主机 IP 的端口映射
docker run -d -p 127.0.0.1:8080:80 nginx
只允许通过主机的 127.0.0.1 访问。
查看端口映射
docker port <container_id>
环境变量
环境变量可以在运行容器时传递给容器内的应用程序。
使用 -e 参数设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=password mysql:5.7
从文件读取环境变量
# 使用 hello-world 镜像
docker run --env-file .env hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d --env-file .env ubuntu:20.04 tail -f /dev/null
容器网络
Docker 提供了多种网络模式,用于容器之间的通信。
创建自定义网络
docker network create mynetwork
将容器连接到网络
# 使用 hello-world 镜像
docker run --network mynetwork --name container1 hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d --network mynetwork --name container2 ubuntu:20.04 tail -f /dev/null
连接到同一网络的容器可以通过容器名称相互通信。
管理网络
# 查看网络列表
docker network ls
# 查看网络详情
docker network inspect mynetwork
# 断开容器网络连接
docker network disconnect mynetwork container1
容器重启策略
可以设置容器的重启策略,使容器在退出后自动重启:
# 使用 hello-world 镜像(注意:hello-world 运行后会立即退出)
docker run --restart=always --name my-hello hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d --restart=always --name mycontainer ubuntu:20.04 tail -f /dev/null
重启策略选项:
no:不自动重启(默认)always:总是重启on-failure:仅在非正常退出时重启unless-stopped:除非手动停止,否则总是重启
容器资源限制
可以限制容器使用的 CPU 和内存资源:
限制内存使用
# 使用 hello-world 镜像
docker run -m 512m hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d -m 512m ubuntu:20.04 tail -f /dev/null
限制容器最多使用 512MB 内存。
限制 CPU 使用
# 使用 hello-world 镜像
docker run --cpus="1.5" hello-world
# 对于需要持续运行的容器,可以使用其他镜像
docker run -d --cpus="1.5" ubuntu:20.04 tail -f /dev/null
限制容器最多使用 1.5 个 CPU 核心。
其他常用命令
查看容器日志:
docker logs <container_id> docker logs -f <container_id> # 实时查看进入运行中的容器:
docker exec -it <container_id> /bin/bash查看容器资源使用情况:
docker stats docker stats <container_id> # 查看特定容器查看容器详细信息:
docker inspect <container_id>复制文件:
docker cp /host/path/file.txt <container_id>:/container/path/ # 复制到容器 docker cp <container_id>:/container/path/file.txt /host/path/ # 从容器复制暂停/恢复容器:
docker pause <container_id> docker unpause <container_id>清理未使用的资源:
docker system prune -a
常见问题
无法访问 Docker Hub,拉取镜像失败
问题描述:在中国大陆地区,直接访问 Docker Hub 可能较慢或失败。
解决方案:
- 配置 Docker 镜像源(参考安装步骤中的"配置 Docker 镜像源"部分)
- 使用代理服务器
- 使用国内镜像仓库,如阿里云、腾讯云等
执行 docker 命令时提示权限不足
问题描述:执行 docker ps 等命令时提示 permission denied。
解决方案:
- 确保已将用户添加到 Docker 用户组:
sudo usermod -aG docker $USER - 重新登录或重启系统
- 如果仍然不行,可以使用
sudo执行命令(不推荐)
Docker 服务无法启动
问题描述:执行 docker ps 时提示 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方案:
检查 Docker 服务状态:
sudo systemctl status docker如果服务未运行,会显示
inactive (dead)状态。启动 Docker 服务:
sudo systemctl start docker启动后再次检查状态确认服务已运行。
设置 Docker 服务开机自启:
sudo systemctl enable docker确保系统重启后 Docker 服务自动启动。
检查 Docker socket 文件权限:
ls -l /var/run/docker.sock如果文件不存在或权限不正确,重启 Docker 服务:
sudo systemctl restart docker检查用户是否在 docker 组中:
groups如果输出中没有
docker,需要将用户添加到 docker 组(参考安装步骤中的"添加用户权限"部分)。确保 iptables 已正确配置:
如果 Docker 服务启动失败,可能是 iptables 配置问题,参考安装步骤中的"配置 iptables"部分。查看 Docker 服务日志:
sudo journalctl -u docker -n 50查看详细的错误信息,帮助定位问题。
容器启动后立即退出
问题描述:使用 docker run 启动容器后,容器立即退出。
解决方案:
- 检查容器日志:
docker logs <container_id> - 使用交互式模式运行容器:
docker run -it ubuntu:20.04 /bin/bash - 确保容器内有持续运行的进程,或使用
tail -f /dev/null保持容器运行
如何清理未使用的 Docker 资源
问题描述:Docker 占用了大量磁盘空间。
解决方案:
- 清理未使用的容器、网络、镜像:
docker system prune -a - 清理未使用的数据卷:
docker volume prune - 手动删除不需要的镜像和容器
容器无法访问外部网络
问题描述:容器内无法访问互联网。
解决方案:
- 检查主机的网络连接
- 检查 Docker 网络配置:
docker network ls docker network inspect bridge - 重启 Docker 服务:
sudo systemctl restart docker
端口映射不生效
问题描述:配置了端口映射,但无法从外部访问容器服务。
解决方案:
- 检查端口映射是否正确:
docker port <container_id> - 检查防火墙设置,确保端口未被阻止
- 检查容器内的服务是否正常运行:
docker exec -it <container_id> ps aux
数据卷中的数据丢失
问题描述:删除容器后,数据卷中的数据也丢失了。
解决方案:
- 确保使用命名数据卷而不是匿名卷:
docker run -v myvolume:/data hello-world - 删除容器时不要使用
-v参数(会同时删除关联的数据卷) - 定期备份重要数据
如何查看容器的资源使用情况
解决方案:
# 实时查看所有容器的资源使用
docker stats
# 查看特定容器的资源使用
docker stats <container_id>
系统重启后容器未自动启动
问题描述:系统重启后,之前运行的容器没有自动启动。
解决方案:
使用
--restart=always参数运行容器:# 使用 hello-world 镜像 docker run --restart=always --name my-hello hello-world # 对于需要持续运行的容器,可以使用其他镜像 docker run -d --restart=always --name mycontainer ubuntu:20.04 tail -f /dev/null对于已存在的容器,更新重启策略:
docker update --restart=always <container_id>
通过上述步骤和问题解答,您可以在 Quectel Pi H1 设备上成功安装和使用 Docker,方便地进行容器化应用的部署和管理。