嵌入式Linux拉起docker
的主要内容有以下几点:
- 支持docker打开内核开关的操作方法。
- 支持docker rootfs 的构建方法。
- 更改国内镜像源。
- 如何直接ssh进入docker里的系统。
- docker 的一些操作指令。
支持docker 内核方面操作
下载这个脚本,放到嵌入式Linux中,运行,会打印出需要打开的内核开关哪些开了哪些没开。把对应的内核开关打开就行。需要注意的是。有些内核开关是受到其他内核开关的影响。要把依赖的内核开关全部打开才能打开对应的内核开关。
https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh
支持docker rootfs 构建方面操作
设置docker 国内镜像源
如果git pull 可以下载到想要的镜像,说明是可以访问得到默认的镜像源,不需要执行这一步,如果访问不到默认镜像源,可以尝试切换为国内的镜像源。
创建daemon.json 文件
ok3568 /etc # cd docker/
ok3568 /etc/docker # ls
key.json
ok3568 /etc/docker # touch daemon.json
ok3568 /etc/docker # vi daemon.json
填入下面的网络源地址
{
"registry-mirrors": [
"https://xxxxxx.mirror.aliyuncs.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/"
]
}
执行下面指令重新加载docker 配置参数
ok3568 /etc/docker # systemctl daemon-reload
ok3568 /etc/docker # systemctl restart docker
拉起一个docker镜像
下载docker 镜像
ok3568 /etc/docker # docker pull debian
这里如果报错,查看一下开发板ping 外网能不能通。如果不同,尝试设置dns服务器地址。
拉起一个docker进行实例
并且不自动退出, 把22 端口映射到主机2222 端口,以方便远程
ok3568 ~ # docker run -d -p 2222:22 --name my-debian debian:10 tail -f /dev/null
cc5efd5c7c0c1f414b8f43b4c034758b2844f24d20e287ef2f705090d353a6b5
ok3568 ~ #
ok3568 ~ # docker ps #查看拉起的实例
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc5efd5c7c0c debian:10 "tail -f /dev/null" 14 seconds ago Up 12 seconds 0.0.0.0:2222->22/tcp, :::2222->22/tcp my-debi
ok3568 ~ # docker exec -it my-debian /bin/bash #进入拉起的实例
安装并且开启sshd服务
查看有没有sshd服务
在新拉起的系统里,一般是没有ssh服务的,使用下面指令查看有没有开启sshd服务:
ps aux | grep sshd
安装ssh 服务
如果没有,则安装sshd
root@5c76a613881c:/# apt-get update
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
root@5c76a613881c:/# apt-get install -y openssh-server
Reading package lists... Done
创建sshd运行目录
mkdir /var/run/sshd
创建root用户密码
root@cc5efd5c7c0c:/etc/ssh# passwd
New password:
Retype new password:
passwd: password updated successfully
修改 /etc/ssh/sshd_config 文档中的访问配置
添加下面两句打开root远程权限
PermitRootLogin yes
PasswordAuthentication yes
启动服务
/usr/sbin/sshd
如果需要重启sshd
pkill sshd
/usr/sbin/sshd
测试ssh链接docker
设置完了以后在主板上直接ssh链接docker 内的系统看是否链接得上:
ok3568 ~ # ssh root@172.17.0.2
root@172.17.0.2's password:
Linux 5c76a613881c 5.10.0-openeuler #1 SMP PREEMPT Mon Nov 11 03:49:11 UTC 2024 aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
测试电脑ssh连接docker
如果连接成功。说明docker 内的ssh服务已经没有问题。
这样就可以直接从电脑远程到主板内的docker。
关闭防火墙
如何还是连接不上,看看是不是主板打开了防火墙。
在主板上执行下面指令
ufw allow 22
或者
systemctl disable firewalld
systemctl stop firewalld
docker的基本操作指令
1. Docker 基本命令
1.1 查看 Docker 版本
docker --version
显示当前安装的 Docker 版本信息。
1.2 查看所有可用的命令
docker help
列出 Docker 的所有可用命令及其简要说明。
2. 镜像操作
2.1 拉取镜像
docker pull <image_name>
从 Docker Hub 或其他指定的镜像库下载镜像。例如:
docker pull ubuntu:latest
2.2 列出本地镜像
docker images
显示本地所有镜像的信息,包括镜像 ID、名称、标签、创建时间和大小。
2.3 删除镜像
docker rmi <image_id_or_name>
删除指定的镜像。如果该镜像被容器使用,则需要先停止并删除相关容器。例如:
docker rmi ubuntu:latest
2.4 创建镜像
docker build -t <image_name>:
根据 Dockerfile 创建新的镜像。例如:
docker build -t my-image:1.0 .
2.5 查看镜像详细信息
docker inspect <image_id_or_name>
显示指定镜像的详细信息,包括配置、环境变量和挂载点等。
3. 容器操作
3.1 运行新的容器
docker run [OPTIONS] <image_name>
运行指定镜像创建并启动一个新容器。常用选项包括:
-d:在后台运行容器
–name <container_name>:为容器指定名称
-p <host_port>:<container_port>:端口映射
-v <host_path>:<container_path>:挂载卷
示例:
docker run -d --name my-container -p 8080:80 nginx
3.2 列出所有容器
docker ps -a
列出所有容器,包括正在运行的和已停止的。
3.3 启动已停止的容器
docker start <container_id_or_name>
启动指定的已停止容器。例如:
docker start my-container
3.4 停止正在运行的容器
docker stop <container_id_or_name>
停止指定的容器。例如:
docker stop my-container
3.5 删除容器
docker rm <container_id_or_name>
删除指定的容器。可以使用 -f 强制删除正在运行的容器。例如:
docker rm my-container
3.6 查看容器日志
docker logs <container_id_or_name>
查看指定容器的标准输出和标准错误日志。例如:
docker logs my-container
3.7 进入容器的终端
docker exec -it <container_id_or_name> /bin/bash
在指定容器中启动一个交互式 Bash shell。例如:
docker exec -it my-container /bin/bash
3.8 查看容器的详细信息
docker inspect <container_id_or_name>
获取指定容器的详细信息,包括网络设置、挂载点等。
3.9 复制文件到容器
docker cp <host_path> <container_id_or_name>:<container_path>
将文件从主机复制到容器中。例如:
docker cp ./myfile.txt my-container:/root/
3.10 复制文件从容器到主机
docker cp <container_id_or_name>:<container_path> <host_path>
将文件从容器复制到主机。例如:
docker cp my-container:/root/myfile.txt ./
4. 网络操作
4.1 查看网络
docker network ls
列出所有 Docker 网络。
4.2 创建网络
docker network create <network_name>
创建一个新的 Docker 网络。例如:
docker network create my-network
4.3 删除网络
docker network rm <network_name>
删除指定的 Docker 网络。
4.4 查看网络详细信息
docker network inspect <network_name>
查看指定网络的详细信息,包括连接到该网络的容器。
4.5 连接容器到网络
docker network connect <network_name> <container_id_or_name>
将指定的容器连接到指定网络。
4.6 从网络中断开容器
docker network disconnect <network_name> <container_id_or_name>
从指定网络中断开指定容器。
5. 数据管理
5.1 查看卷
docker volume ls
列出所有 Docker 卷。
5.2 创建卷
docker volume create <volume_name>
创建一个新的卷。例如:
docker volume create my-volume
5.3 删除卷
docker volume rm <volume_name>
删除指定的卷。如果卷被使用,则需要先停止并删除相关容器。
5.4 查看卷详细信息
docker volume inspect <volume_name>
获取指定卷的详细信息。
6. 系统管理
6.1 查看系统资源使用情况
docker stats
实时查看所有容器的资源使用情况。
6.2 清理未使用的资源
docker system prune
删除所有停止的容器、未使用的网络、未标记的镜像等。
6.3 检查 Docker 服务状态
systemctl status docker
查看 Docker 服务的当前状态。
7. 其他常用命令
7.1 更新镜像
docker pull <image_name>
更新本地镜像到最新版本。
7.2 重新启动容器
docker restart <container_id_or_name>
重新启动指定的容器。
7.3 查看 Docker 版本信息
docker version
显示 Docker 客户端和服务端的版本信息。
7.4 退出 Docker CLI
exit
退出当前 Docker CLI 会话。
一些常见问题
1 访问不到网络源
有时候修改了网络源还是访问不到。直接知道网络源的位置试一下
ok3568 /etc # docker pull hub.oepkgs.net/openeuler/openeuler:latest
latest: Pulling from openeuler/openeuler
6ae02feacbb5: Pull complete
0ed4fbf376b1: Pull complete
Digest: sha256:ca97270bb6ac0eed858b539cf93f0c62603b544411c05dc64a521d432c35f8e5
Status: Downloaded newer image for hub.oepkgs.net/openeuler/openeuler:latest
hub.oepkgs.net/openeuler/openeuler:latest
2 系统时间不对
这个错误信息表明 Docker 在尝试从 hub.oepkgs.net 拉取镜像时,遇到了 TLS 证书验证的问题。具体问题是当前系统时间为 1970 年 1 月 1 日,而证书的有效期从 2025 年 2 月 3 日开始。为了解决这个问题,要设置开发板的系统时间。在 2025 年 2 月 3 日 之后。
ok3568 /etc # docker pull hub.oepkgs.net/openeuler/openeuler:latest
Error response from daemon: Get "https://hub.oepkgs.net/v2/": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 1970-01-01T03:18:12Z is before 2025-02-03T23:30:04Z
ok3568 /etc # date -s "2025-02-03 23:30:00"
Mon Feb 3 23:30:00 UTC 2025
[11959.272964] systemd-journald[188]: Oldest entry in /run/log/journal/7765b4ed9155409c8fc487b0fdd78a9c/system.journal is older than the configured file retention duration (1month), suggesting rotation.
[11959.272976] systemd-journald[188]: /run/log/journal/7765b4ed9155409c8fc487b0fdd78a9c/system.journal: Journal header limits reached or header out-of-date, rotating.
3,后台运行docker 闪退
ok3568 /etc # docker run -d --name openeuler1 hub.oepkgs.net/openeuler/openeuler:latest
806c6dc296055c3cfae4f7621e1b612bdc5ccbb6b48f3fed13a2781028b7a951
[12271.740333] docker0: port 1(veth39f7caf) entered blocking state
[12271.740350] docker0: port 1(veth39f7caf) entered disabled state
[12271.740585] device veth39f7caf entered promiscuous mode
[12272.091896] eth0: renamed from veth4d8f0d6
[12272.123846] IPv6: ADDRCONF(NETDEV_CHANGE): veth39f7caf: link becomes ready
[12272.123913] docker0: port 1(veth39f7caf) entered blocking state
[12272.123920] docker0: port 1(veth39f7caf) entered forwarding state
ok3568 /etc # [12272.277147] docker0: port 1(veth39f7caf) entered disabled state
[12272.277385] veth4d8f0d6: renamed from eth0
[12272.362306] docker0: port 1(veth39f7caf) entered disabled state
[12272.363038] device veth39f7caf left promiscuous mode
[12272.363065] docker0: port 1(veth39f7caf) entered disabled state
ok3568 /etc #
ok3568 /etc # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
从你提供的输出来看,Docker 容器 openeuler1 已经成功启动,但在 docker ps 中没有显示。这可能意味着容器在启动后立即崩溃或退出。
这种情况下,可以尝试运行容器的交互模式。
docker run -it --name openeuler1 hub.oepkgs.net/openeuler/openeuler:latest /bin/bash
4,没关闭防火墙
ok3568 ~ # systemctl status docker
x docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Thu 1970-01-01 00:00:29 UTC; 6s ago
TriggeredBy: x docker.socket
Docs: https://docs.docker.com
Process: 770 ExecStart=/usr/bin/dockerd -H fd:// (code=exited, status=1/FAILURE)
Main PID: 770 (code=exited, status=1/FAILURE)
Jan 01 00:00:29 phytiumpi systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
Jan 01 00:00:29 phytiumpi systemd[1]: Stopped Docker Application Container Engine.
Jan 01 00:00:29 phytiumpi systemd[1]: docker.service: Start request repeated too quickly.
Jan 01 00:00:29 phytiumpi systemd[1]: docker.service: Failed with result 'exit-code'.
Jan 01 00:00:29 phytiumpi systemd[1]: Failed to start Docker Application Container Engine.
ok3568 ~ #
failed to start daemon: Error initializing network controller: error creating default "bridge" network: cannot create network b8fd8c684f0ba865d4a13d36e5282fd694bbd37b243c7ec6c9cd29416db98d4b (docker0): conflicts with network 3b9d417c42e816d260136ac354a0d18815e439ef06de24457d7ed651926b012e (docker0): networks have same bridge name
systemctl stop firewalld
systemctl disable firewalld
cd /var/lib/docker/network/
rm -rf files