容器部署和使用指南

本指南将介绍如何在 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,方便地进行容器化应用的部署和管理。