标签:控制 ade doc time 基础 项目 ash aufs pre
docker镜像是容器启动的基础,镜像里面包含容器启动所需要的文件系统及其内容。docker镜像采用分层构建的机制,这种分层大致分为两部分,一部分是最底层的引导文件系统bootfs,类型有aufs,btffs或者overlay2等;另一部分真正让用户来构建用户空间并运行进程的容器称为rootfs。
rootfs:位于bootfs之上,表现为docker的根文件系统,比如/dev、/bin之类。
启动容器时,docker daemon会试图从本地获取相关镜像;本地不存在时,会从docker Registry(默认就是docker hub)中下载并保存到本地。
docker registry用于保存docker镜像,包括镜像的层次结构和元数据,用户可以自建registry,也可以使用官方的docker hub。registry里面的镜像通常由开发人员制作,而后推送至registry上保存,以供用户使用。另外,为了安全起见,docker daemon要求docker registry必须是https的,如果不是就需要配置docker daemon。registry分类如下:
repository是由某个特定docker镜像的所有迭代版本所组成,一个registry可以存在多个repository。repository分为顶层仓库和用户仓库。
镜像的生成途径
基于容器制作镜像
[root@docker ~]# docker run --name busy01 -it busybox
/ # mkdir -p /data/html
/ # echo 'this is a test ' >/data/html/index.html
/ # ps
PID USER TIME COMMAND
1 root 0:00 sh
7 root 0:00 ps
/ # which httpd
/bin/httpd
此时不要退出本窗口,另外开一个终端窗口进行镜像制作。
上面使用ps命令可以看到,PID为1的进程是sh,容器中PID为1的进程就相当于我们宿主机的systemd进程,1进程是bash,它运行完就会结束的,PID为1的进程结束也就意味着容器就exit了。所以上面运行busybox容器的窗口是不可以关闭也不可以放在后台运行的。这里就顺便再提一下应用程序的运行:如果想让一个应用类的容器长久的运行下去,要么起一个类似busybox的容器,然后前台运行一个应用(比如httpd:httpd -f -h /data/html),这个窗口永远不能关闭;要么在把容器的CMD设置为前台运行应用的命令(也就是设置应用的PID为1)。
[root@docker ~]# docker container inspect busy01 | grep Cmd -A1
"Cmd": [
"sh"
[root@docker ~]# docker container commit -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p busy01 hamerle/httpd:v1
# -c:以列表的形式修改dockerfile的指令。此例只修改CMD指令,使新容器CMD指令为httpd(也就是PID为1的进程是httpd),之前是sh。
# -p:提交过程中暂停容器的运行,防止文件保存的不完整。
# -p的后面跟的要操作容器的名字,最后是提交后生成新镜像的名字和tag。
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hamerle/httpd v1 099c89327481 2 minutes ago 1.2MB
busybox latest 64f5d945efcc 3 weeks ago 1.2MB
[root@docker ~]# docker container run --name httpd01 -d hamerle/httpd:v1
[root@docker ~]# docker container inspect httpd01 | grep Cmd -A4
"Cmd": [
"/bin/httpd",
"-f",
"-h",
"/data/html"
[root@docker ~]# docker container inspect httpd01 | grep IPAddress
"IPAddress": "172.17.0.3",
[root@docker ~]# curl 172.17.0.3
this is a test # 访问成功
镜像分享至docker hub
[root@docker ~]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
# 从上面命令帮助可以看出,登录是要跟server地址的,但是默认登录就是docker hub,所以不用加server地址
[root@docker ~]# docker login -u hamerle
Password:
Login Succeeded
# 验证成功,开始进行push操作。此处我加了tag,如果不加tag,就是将此镜像的所有版本都push上去。
[root@docker ~]# docker image push hamerle/httpd:v1
镜像分享至阿里云
[root@docker ~]# docker logout
[root@docker ~]# docker login --username=hamerle registry.cn-shanghai.aliyuncs.com
Password:
Login Succeeded
# 验证完成后,需要以阿里云的访问路径及仓库名称重新打一个tag才能进行后续的push操作。
[root@docker ~]# docker tag hamerle/httpd:v1 registry.cn-shanghai.aliyuncs.com/hamerle/httpd:v2
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hamerle/httpd v1 099c89327481 2 hours ago 1.2MB
registry.cn-shanghai.aliyuncs.com/hamerle/httpd v2 099c89327481 2 hours ago 1.2MB
busybox latest 64f5d945efcc 3 weeks ago 1.2MB
[root@docker ~]# docker image push registry.cn-shanghai.aliyuncs.com/hamerle/httpd:v2
标签:控制 ade doc time 基础 项目 ash aufs pre
原文地址:https://www.cnblogs.com/ccbloom/p/10979440.html