3、docker镜像深入理解和发布镜像3.1、镜像的理解3.2、UnionFS(联合文件系统)3.3、镜像分层3.3.1、分层理解3.3.2、docker镜像要采用分层的好处3.4、制作和发布镜像3.4.1、制作镜像3.4.2、发布镜像
操作环境及软硬件参考配置如下:
参考车型:ROSMASTER X3
机器人硬件配置:Arm系列主控,思岚A1激光雷达,AstraPro Plus深度相机
机器人系统:Ubuntu(版本无要求)+ docker(20.10.21及以上版本)
PC虚拟机:Ubuntu(18.04)+ ROS(Melodic)
使用场景:在相对干净的2D平面上使用
1、镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需要的所有内容。我们将应用程序、配置打包成一个成型的、可交付、可部署的运行环境,包括代码、运行时所需要的库、环境变量和配置文件等,这个大包好的运行环境就是image镜像文件。
2、只有通过镜像文件才能生成docker容器实例。
1、Union文件系统(UnionFS)是一种分层的、轻量级的、高性能的文件系统,它是docker镜像的基础,并且支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂在到同一个虚拟文件系统下。
2、镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
Union文件系统的特性:一次性同时加载多个文件系统,但是从外面来看,只能看到一个文件系统;联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有地层的文件和目录。
下载一个镜像时,注意观察下载的日志输出,可以看到是一层一层的在下载:
# 查看镜像分层的方式可以通过命令:docker image inspect 镜像名称
jetson@ubuntu:~$ docker image inspect mysql:latest
[
{
"Id": "sha256:5371f8c3b63eec64a33b35530be5212d6148e0940111b57b689b5ba1ffe808c8",
.........
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:d6d4fc6aef875958d6186f85f03d88e6bb6484ab2dd56b30a79163baceff2f6d",
"sha256:05c3b0b311a02bc56ca23105a76d16bc9b8c1d3e6eac808f4efb1a2e8350224b",
"sha256:7b80f7f05642477ebc7d93de9539af27caab7c41a768db250fe3fe2b5506ca2c",
"sha256:50e037faefab22cb1c75e60abb388b823e96a845650f3abd6d0a27e07a5a1d5e",
"sha256:66040abb3f7201d2cc64531349a8225412db1029447a9431d59d999c941d56f6",
"sha256:857162425652837a362aa5f1c3d4974cc83702728793de52ba48176d5367a89b",
"sha256:7eebed3016f6b6ab68aa8e6be35f0689a3c18d331b7b542984a0050b859eaf26",
"sha256:2fc4c142633d57d795edc0f3fd457f99a35fa611eab8b8c5d75c66e6eb729bc2",
"sha256:7fde2d12d484f0c14dabd9ca845da0bcdaf60bd773a58ca2d73687473950e7fe",
"sha256:9319848a00d38e15b754fa9dcd3b6e77ac8506850d32d8af493283131b9745a3",
"sha256:5ff94d41f068ea5b52244393771471edb6a9a10f7a4ebafda9ef6629874a899b"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
所有的 docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 ubuntu 20.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!
资源共享,比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
方式1、从容器中提交一个镜像:
x# 命令
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名] 【也可省略 -m -a 参数】
# 测试
jetson@ubuntu:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54bf9efae47 ubuntu:latest "/bin/bash" 3 hours ago Up 24 minutes funny_hugle
3b9c01839579 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago jovial_brown
jetson@ubuntu:~$ docker commit c54bf9efae47 ubuntu:1.0
sha256:78ca7be949b6412f74ba12e8d16bd548aaa7c3fa25134326db3a67784f848f8f
jetson@ubuntu:~$ docker images # 生成了ubuntu:1.0镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 1.0 78ca7be949b6 5 seconds ago 69.2MB
yahboomtechnology/ros-foxy 3.4.0 49581aa78b6b 5 hours ago 24.3GB
yahboomtechnology/ros-foxy 3.3.9 cefb5ac2ca02 4 days ago 20.5GB
yahboomtechnology/ros-foxy 3.3.8 49996806c64a 4 days ago 20.5GB
yahboomtechnology/ros-foxy 3.3.7 8989b8860d17 5 days ago 17.1GB
yahboomtechnology/ros-foxy 3.3.6 326531363d6e 5 days ago 16.1GB
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
hello-world latest 46331d942d63 13 months ago 9.14kB
方式2、dockerfile制作镜像:
# 命令
docker build -f dockerfile文件路径 -t 新镜像名字:TAG . # docker build 命令最后有一个 . 表示当前目录
# 测试
docker build -f dockerfile-ros2 -t yahboomtechnology/ros-foxy:1.2 .
关于dockerfile的编写请参考:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
docker仓库(repository)是集中存放镜像文件的场所。最大的公开仓库是docker hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
发布镜像到docker hub步骤: 1、地址:https://hub.docker.com/ ,先注册账号 2、保证账号可以正常登录
3、使用 tag命令修改镜像名称
发布镜像到docker hub的规范是:
xxxxxxxxxx
docker push 注册用户名/镜像名
比如我这里的注册用户名是:pengan88,那就要先修改镜像名称
xxxxxxxxxx
# 命令:
docker tag 镜像ID 修改后的镜像名称
# 测试
jetson@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 1.0 78ca7be949b6 5 seconds ago 69.2MB
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
hello-world latest 46331d942d63 13 months ago 9.14kB
jetson@ubuntu:~$ docker tag 78ca7be949b6 pengan88/ubuntu:1.0
jetson@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pengan88/ubuntu 1.0 78ca7be949b6 23 minutes ago 69.2MB
ubuntu 1.0 78ca7be949b6 23 minutes ago 69.2MB
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
hello-world latest 46331d942d63 13 months ago 9.14kB
4、登录docker hub发布镜像:
xxxxxxxxxx
jetson@ubuntu:~$ docker login -u pengan88
Password: # 这里输入docker hub注册的账号密码
WARNING! Your password will be stored unencrypted in /home/jetson/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
jetson@ubuntu:~$ docker push pengan88/ubuntu:1.0
The push refers to repository [docker.io/pengan88/ubuntu]
ca774712d11b: Pushed
874b048c963a: Mounted from library/ubuntu
1.0: digest: sha256:6767d7949e1c2c2adffbc5d3c232499435b95080a25884657fae366ccb71394d size: 736
5、访问docker hub可查看到已经发布成功