嵌入式Linux下如何启动和使用Docker

发布于:2025-06-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

嵌入式Linux下如何启动和使用Docker

本文通俗介绍在嵌入式Linux系统(如OK3568开发板)上启动和使用Docker的全过程,适合初学者和实际开发人员。内容涵盖:

  1. 启用Docker所需的内核配置方法
  2. Docker rootfs(根文件系统)的构建方法
  3. 如何切换到国内镜像源以提升下载速度
  4. 如何通过ssh远程登录Docker容器
  5. Docker常用命令及常见问题处理

1. 开启Docker相关内核选项

Docker需要部分内核功能的支持。可以通过官方脚本检查并指导你开启这些内核配置项:

  • 下载脚本:
    wget https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh
    
  • 上传到你的开发板,赋予可执行权限并运行:
    chmod +x check-config.sh
    ./check-config.sh
    
  • 脚本会列出哪些内核选项已开启,哪些未开启。注意:有些选项相互依赖,需一并启用。修改内核配置后重新编译和刷写内核。

补充说明:常见必需的内核选项有 CONFIG_NAMESPACESCONFIG_CGROUPSCONFIG_SECCOMPCONFIG_OVERLAY_FS等。具体以脚本检查结果为准。


2. 构建Docker的rootfs(根文件系统)

你可以直接拉取官方镜像(如debianubuntu等),也可以根据需要自定义rootfs,常见方法有:

  • 使用debootstrapmultistrap等工具在PC端构建minimal rootfs后导入为Docker镜像。
  • 编写Dockerfile自定义自己的镜像。

通用流程

  1. 在PC或开发板上构建rootfs目录
  2. tar打包根文件系统
  3. docker import导入为本地镜像

3. 设置Docker镜像加速(包含所有国内可用的镜像源)

由于直接访问国外镜像仓库速度较慢,建议配置尽可能多的国内可用镜像加速服务,同时也可以保留国外官方源及一些公共代理。这样只要有一个可用即可,大大增加拉取镜像的成功率。

推荐做法:所有国内能够访问的源全部填进去,包括常见的加速服务、公开代理、官方源等。

{
  "registry-mirrors": [
    "https://<你的阿里云ID>.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.tuna.tsinghua.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com",
    "https://registry.docker-cn.com",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://dockerproxy.com",
    "https://dockerhub.azu.cn",
    "https://ccr.ccs.tencentyun.com",
    "https://dockerhub.icu",
    "https://dhub.kubesre.xyz",
    "https://docker.chenby.cn",
    "https://docker.1panel.live",
    "https://docker.awsl9527.cn",
    "https://docker.anyhub.us.kg",
    "https://hub.docker.com/",

    // 国外公共代理(如国内可访问也可保留)
    "https://index.docker.io/v1/",
    "https://registry-1.docker.io",
    "https://mirror.gcr.io",
    "https://quay.io",
    "https://ghcr.io",
    "https://mcr.microsoft.com"
  ]
}

配置步骤

  1. 创建或编辑 /etc/docker/daemon.json 文件

    mkdir -p /etc/docker
    vi /etc/docker/daemon.json
    
  2. 粘贴上面内容。多余/失效的可以后续根据需要删减。

  3. 重载并重启Docker

    systemctl daemon-reload
    systemctl restart docker
    

实用建议:填入多组镜像源,Docker会自动选择可用的加速器进行镜像拉取。可以优先选择自己网络环境下最快的源放在最前面(比如阿里云专属ID)。

小贴士:也可以根据实际网络环境自行测试各个镜像源访问速度,进行排序。


4. 拉取并运行Docker镜像

4.1 拉取镜像

docker pull debian:10

如果报错,先检查开发板能否访问外网(如ping www.baidu.com),如无法联网,需配置DNS。

4.2 启动容器并映射端口

使容器后台运行,且将容器22端口映射到主机2222端口,方便之后ssh登录:

docker run -d -p 2222:22 --name my-debian debian:10 tail -f /dev/null
  • 查看容器状态
    docker ps
    
  • 进入容器终端
    docker exec -it my-debian /bin/bash
    

5. 在容器内部安装并启动SSH服务

默认Debian等基础镜像没有安装ssh服务,需手动安装配置。

5.1 检查及安装SSH服务

  • 检查是否已安装:
    ps aux | grep sshd
    
  • 安装openssh-server:
    apt-get update
    apt-get install -y openssh-server
    
  • 创建运行目录:
    mkdir /var/run/sshd
    
  • 设置root密码:
    passwd
    
  • 修改/etc/ssh/sshd_config,确保有如下配置(如无则添加):
    PermitRootLogin yes
    PasswordAuthentication yes
    
  • 启动sshd服务:
    /usr/sbin/sshd
    
  • 如需重启sshd:
    pkill sshd
    /usr/sbin/sshd
    

5.2 测试SSH连接

  • 在宿主机(开发板)用容器IP测试ssh(可通过docker inspect my-debian查找容器IP):
    ssh root@172.17.0.2
    
  • 也可以从其他电脑ssh到开发板IP的2222端口:
    ssh root@开发板IP -p 2222
    
    这个端口2222已经映射到docker 的 22 端口
    在这里插入图片描述

5.3 防火墙设置

如ssh无法连接,需确认防火墙未阻止22端口:

ufw allow 22
systemctl disable firewalld
systemctl stop firewalld

6. Docker常用操作指令(速查表)

6.1 查看信息与帮助

  • 查看Docker版本:docker --version
  • 查看所有命令:docker help
  • 查看详细版本:docker version

6.2 镜像相关

  • 拉取镜像:docker pull <镜像名>
  • 列出本地镜像:docker images
  • 删除镜像:docker rmi <镜像名或ID>
  • 构建镜像:docker build -t 名称:标签 路径
  • 查看镜像信息:docker inspect <镜像名或ID>

6.3 容器相关

  • 运行容器:docker run [参数] <镜像名>
  • 列出容器:docker ps -a
  • 启动/停止:docker start/stop <容器名或ID>
  • 删除容器:docker rm <容器名或ID>
  • 查看日志:docker logs <容器名或ID>
  • 进入容器:docker exec -it <容器名或ID> /bin/bash
  • 查看容器详细信息:docker inspect <容器名或ID>
  • 文件复制:主机到容器 docker cp 本地路径 容器名:/目标路径,容器到主机同理

6.4 网络与存储

  • 列网络:docker network ls
  • 创建网络:docker network create <网络名>
  • 删除网络:docker network rm <网络名>
  • 连接/断开网络:docker network connect/disconnect 网络名 容器名
  • 管理数据卷:docker volume ls/create/rm/inspect <卷名>

6.5 系统管理

  • 查看资源占用:docker stats
  • 清理无用资源:docker system prune
  • 查看服务状态:systemctl status docker

7. 常见问题与解决方法

7.1 拉取镜像无法访问网络源

即使配置了国内镜像,有时仍然拉取失败,可以尝试直接指定完整仓库地址拉取:

docker pull hub.oepkgs.net/openeuler/openeuler:latest

7.2 系统时间错误导致TLS证书异常

若报错提示系统时间早于证书生效时间,请校准开发板时间(常见于刚上电未联网的开发板):

date -s "2025-02-03 23:30:00"

建议联网同步时间或配置NTP服务。

7.3 容器启动后自动退出

后台运行容器时如果主进程(如/bin/bash)结束,容器会自动退出。建议用如下方式启动:

docker run -it --name 容器名 镜像名 /bin/bash

或用 tail -f /dev/null 挂起主进程。

7.4 防火墙或网络冲突导致Docker无法启动

docker.service启动报错,常见原因为桥接网络冲突或防火墙未关,解决办法:

systemctl stop firewalld
systemctl disable firewalld
cd /var/lib/docker/network/
rm -rf files
systemctl restart docker

如遇“bridge name already exists”等网络冲突,可删除相关网络文件后重启Docker。


8. 其他补充知识

  • Docker网络架构:默认容器使用bridge模式,常见还有host、none、overlay等。了解不同模式有助于调试网络问题。
  • 数据持久化:使用-v挂载主机目录或Docker卷可实现数据持久化,避免容器删除后数据丢失。
  • 安全建议:生产环境建议关闭root远程登录,限制端口映射范围,并定期更新镜像及补丁。
  • 自定义镜像:编写Dockerfile可定制开发环境或应用,便于移植和复用。

本文适用于大多数基于Linux的嵌入式开发环境。具体命令和路径可能根据发行版、硬件平台略有不同,请结合实际情况调整。


网站公告

今日签到

点亮在社区的每一天
去签到