3、docker镜像深入理解和发布镜像3.1、镜像的理解3.2、UnionFS(联合文件系统)3.3、镜像分层3.3.1、分层理解3.3.2、docker镜像要采用分层的好处3.4、制作和发布镜像3.4.1、制作镜像3.4.2、发布镜像3.4.2.1、发布镜像到docker hub步骤:3.4.2.2、发布镜像生成tar压缩包步骤:
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"
}
}
]
资源共享,比如有多个镜像都从相同的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
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
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
hello-world latest 46331d942d63 13 months ago 9.14kB
方式2、dockerfile制作镜像:
xxxxxxxxxx
# 命令
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/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
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可查看到已经发布成功
以下方法都是在宿主机中操作,而非docker里面操作
1、方式一:docker export 和 docker import(从容器中导出压缩包)
通过docker ps -a 查询到容器的ID,使用以下命令将该容器生成压缩包
xdocker export -o xxx.tar [容器 ID]
#压缩包名字可以自己取,例如docker export -o ros2-base:1.0.1.tar [容器 ID]
生成压缩包后使用docker import导入到镜像库
xdocker import xxx.tar [镜像名]:[tag]
#例如docker import ros2-base:1.0.1.tar yahboomtechnology/ros2-base:1.0.1
#镜像名和tag可以自己定,tag相当于版本号
2、方式二:docker save 和 docker load(从镜像中导出压缩包)
通过docker images 查询镜像的名字和标签号,使用以下命令将该镜像生成压缩包
xdocker save -o xxx.tar [镜像名]:[tag]
#压缩包名字可以自己定
#例如docker save -o ros2-base1.0.1.tar yahboomtechnology/ros2-base:1.0.1
生成压缩包后使用docker load导入到镜像库
xdocker load -i xxx.tar
#这里是自己的压缩包名字
3、两种方式的区别
docker export 是从容器(container)中生成,docker save 是镜像(image)中生成。docker export 比 docker save 保存的包要小,原因是 save 保存的是一整个分层的文件系统,export 导出的只是容器一层文件系统。docker import 和 docker load 导入都会生成镜像。docker import 可以对镜像指定新名称及版本号,docker load 无法对镜像重命名。