嵌入式Linux下如何启动和使用Docker
本文通俗介绍在嵌入式Linux系统(如OK3568开发板)上启动和使用Docker的全过程,适合初学者和实际开发人员。内容涵盖:
- 启用Docker所需的内核配置方法
- Docker rootfs(根文件系统)的构建方法
- 如何切换到国内镜像源以提升下载速度
- 如何通过ssh远程登录Docker容器
- 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_NAMESPACES
、CONFIG_CGROUPS
、CONFIG_SECCOMP
、CONFIG_OVERLAY_FS
等。具体以脚本检查结果为准。
2. 构建Docker的rootfs(根文件系统)
你可以直接拉取官方镜像(如debian
、ubuntu
等),也可以根据需要自定义rootfs,常见方法有:
- 使用
debootstrap
、multistrap
等工具在PC端构建minimal rootfs后导入为Docker镜像。 - 编写Dockerfile自定义自己的镜像。
通用流程:
- 在PC或开发板上构建rootfs目录
tar
打包根文件系统- 用
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"
]
}
配置步骤
创建或编辑
/etc/docker/daemon.json
文件:mkdir -p /etc/docker vi /etc/docker/daemon.json
粘贴上面内容。多余/失效的可以后续根据需要删减。
重载并重启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端口:
这个端口2222已经映射到docker 的 22 端口ssh root@开发板IP -p 2222
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的嵌入式开发环境。具体命令和路径可能根据发行版、硬件平台略有不同,请结合实际情况调整。