容器部署和使用指南

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