想了解1-3dockercommit定制镜像的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于4、docker镜像:花卷结构、commit镜像、Docker(十一)-Dockercomm
想了解1-3docker commit 定制镜像的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于4、docker 镜像:花卷结构、commit 镜像、Docker (十一)-Docker commit 创建镜像、Docker - 镜像 - 利用 commit 理解镜像构成、docker commit新镜像之后删除旧镜像的新知识。
本文目录一览:- 1-3docker commit 定制镜像
- 4、docker 镜像:花卷结构、commit 镜像
- Docker (十一)-Docker commit 创建镜像
- Docker - 镜像 - 利用 commit 理解镜像构成
- docker commit新镜像之后删除旧镜像
1-3docker commit 定制镜像
1、commit 定制镜像
docker pull nginx:1.17
运行容器 --name:容器名字 -d:后台 -p本地端口:容器内端口
docker run --name webserver -d -p 8080:80 nginx:1.17
#进入容器
docker exec -it webserver /bin/bash
#进入容器执行并退出exit
root@2e2d8381dba6:/# echo ''<h1>Hello,zjy!</h1>'' > /usr/share/nginx/html/index.html
root@2e2d8381dba6:/# exit

docker commit --author zjy --message 修改了首页 webserver nginx:v2
#中 --author 是指定修改的作者
--message 则是记录本次修改的内容
docker images
docker run -d --name webserver2 -p 8081:80 nginx:v2

注意:commint 实现中用的比较少,测试可以用
4、docker 镜像:花卷结构、commit 镜像
1、是什么
docker images
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
1、UnionFS(联合文件系统): 不同目录挂载到同一个虚拟文件系统
UnionFS(联合文件系统):Union 文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下 (unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
2、Docker 镜像加载原理:bootfs+rootfs
Docker 镜像加载原理:
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFS。
bootfs (boot file system) 主要包含 bootloader 和 kernel, bootloader 主要是引导加载 kernel, Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。
rootfs (root file system) ,在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。
平时我们安装进虚拟机的 CentOS 都是好几个 G,为什么 docker 这里才 200M??
对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的 linux 发行版,bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以公用 bootfs。
3、分层的镜像:花卷
以我们的 pull 为例,在下载的过程中我们可以看到 docker 的镜像好像是在一层一层的在下载
docker pull hello-world
docker images
docker pull centos
docker images
400M tomcat 几百M???
4、为什么 Docker 镜像要采用这种分层结构呢:共享 base 镜像资源
最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
base 镜像
第一个镜像非常慢
下载后面的都很快
2、特点
Docker 镜像都是只读的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作 “容器层”,“容器层” 之下的都叫 “镜像层”。
docker pull tomcat
docker run -it tomcat
1、tomcat 是容器层,其他都是镜像层
3、Docker 镜像 commit 操作补充
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
回顾
常用命令,镜像命令,思考
容器命令,P p
1、 从 Hub 上下载 tomcat 镜像到本地并成功运行
docker images tomcat
docker run -it -p 8888:8080 tomcat
# 8888 docker对外暴露的端口
# 8080 tomcat的端口
docker ps
# 浏览器访问 localhost:8888
docker run -it P tomcat
# 随机分配
docker ps
docker ps -n 3
2、故意删除上一步镜像生产 tomcat 容器的文档
ctrl + p +q
# 退出
docker ps
docker exec -it 434 /bin/bash
cd /usr/local/tomcat/webapps
ls
rm -rf docs
打开火狐访问8888
刷新没有doc
3、以它为模板 commit 一个没有 doc 的 tomcat 新镜像
也即当前的 tomcat 运行实例是一个没有文档内容的容器,
以它为模板 commit 一个没有 doc 的 tomcat 新镜像 atguigu/tomcat02
docker search tomcat
# 命名空间atguigu
docker ps
# 提交
docker commit -a="zzz" -m= "tomcat without doc" 34343 atguigu/mytomcat:1.2
docker images
4、启动我们的新镜像并和原来的对比
启动 atguigu/tomcat02,它没有 docs
新启动原来的 tomcat,它有 docs
# 删容器
docker ps -q
docker rm -f $(docker ps -q)
# 以我们的Tomcat启动容器
docker images
docker run -it -p7777:8080 atguigu/mytomcat:1.2
# 浏览器访问7777
# 新的镜像1.2生成的容器没有docs
# 没有docs
# 以官方Tomcat
docker run -it -p 7788:8080 tomcat
# 浏览器访问7777有docs
5、交互模式,后台模式
前台运行,交互式
docker run -it -p 7777:8080 tomcat
后台守护
docker run -d -p 6666:8080 tomcat
docker ps
Docker (十一)-Docker commit 创建镜像
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
修改已有的镜像
查看已有的镜像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 9 days ago 111MB
下面进入到 ubuntu 容器中:
$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/#
注意: 记住容器的 ID,稍后还会用到。
在容器中添加 添加 Python3
开发环境。
root@543a324ea841:/# apt update // 更新软件源
root@543a324ea841:/# apt install python3 // 安装 python3
root@543a324ea841:/# exit // 退出 Ubuntu 容器 exit
当结束后,我们使用 exit
来退出,现在我们的容器已经被我们改变了,使用 docker commit
命令来提交更新后的副本。
$ sudo docker commit -m "Add python3" -a "Docker Newbee" 543a324ea841 ubuntu
sha256:7c0cf1cc5ef36a86252e94eea39c645f53be7dfda87bdcded6d2999917190ffd
-
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-
-a 可以指定更新的用户信息;
之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名。 创建成功后会返回这个镜像的 ID 信息。
查看镜像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7c0cf1cc5ef3 About a minute ago 111MB
ubuntu <none> 2a4cca5ac898 9 days ago 111MB
之后,可以使用新的镜像来启动容器
$ sudo docker run -t -i ubuntu:latest /bin/bash
root@8e40ef590fb1:/#
利用 Dockerfile 来创建镜像
使用 docker commit
来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build
来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
新建一个目录和一个 Dockerfile
$ mkdir py
$ cd py
py$ touch Dockerfile
Dockerfile 中每一条指令都创建镜像的一层,例如:
$ vim Dockerfile
# this is a comment
FROM ubuntu:16.04
MAINTAINER Docker py <pyuser@docker.com>
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN python3 -m pip install selenium
Dockerfile 基本的语法是
- 使用
#
来注释 - FROM 指令告诉 Docker 使用哪个镜像作为基础
- 接着是维护者的信息
- RUN 开头的指令会在创建中运行,比如安装一个软件包,在这里使用
apt
来安装了一些软件
编写完成 Dockerfile 后可以使用 docker build
来生成镜像。
sudo docker build -f Dockerfile -t ubuntu-py:v1 .
-
-t 标记来添加 tag,指定新的镜像的用户信息。
-
“.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径
可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后, Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit
一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
Docker - 镜像 - 利用 commit 理解镜像构成
利用 commit 理解镜像构成
镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
$ docker run --name webserver -d -p 80:80 nginx
这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。
在本地的话可以直接访问 :80,我们会看到默认的 Nginx 欢迎页面。
现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用docker exec
命令进入容器,修改其内容。
$ (winpty) docker exec -it webserver bash
root@3729b97e8226:/# echo 'Hello,Docker!
' > /usr/share/Nginx/html/index.html
root@3729b97e8226:/# exit
exit
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。
$ docker diff webserver
C /root
A /root/.bash_history
C /run
C /usr
C /usr/share
C /usr/share/Nginx
C /usr/share/Nginx/html
C /usr/share/Nginx/html/index.html
C /var
C /var/cache
C /var/cache/Nginx
A /var/cache/Nginx/client_temp
A /var/cache/Nginx/fastcgi_temp
A /var/cache/Nginx/proxy_temp
A /var/cache/Nginx/scgi_temp
A /var/cache/Nginx/uwsgi_temp
要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
$ docker commit \
--author "Tao Wang " \
--message "修改了默认网页" \
webserver \
Nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。
$ docker image ls Nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
Nginx v2 07e334659748 9 seconds ago 181.5 MB
Nginx 1.11 05a60462f8ba 12 days ago 181.5 MB
Nginx latest e43d811ce2f4 4 weeks ago 181.5 MB```
我们还可以用 docker history
具体查看镜像内的历史记录,如果比较 <a href="https://www.jb51.cc/tag/Nginx/" target="_blank">Nginx</a>:latest
的历史记录,我们会发现新增了我们刚刚提交的这一层。
bash
$ docker history Nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
07e334659748 54 seconds ago Nginx -g daemon off; 95 B 修改了默认网页
e43d811ce2f4 4 weeks ago /bin/sh -c #(nop) CMD ["Nginx" "-g" "daemon 0 B
4 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B
4 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/Nginx/ 22 B
4 weeks ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 58.46 MB
4 weeks ago /bin/sh -c #(nop) ENV Nginx_VERSION=1.11.5-1 0 B
4 weeks ago /bin/sh -c #(nop) MAINTAINER Nginx Docker Ma 0 B
4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
4 weeks ago /bin/sh -c #(nop) ADD file:23aa4f893e3288698c 123 MB
新的镜像定制好后,我们可以来运行这个镜像。:80
docker run --name web2 -d -p 81:80
Nginx:v2
docker commit新镜像之后删除旧镜像
1.目的
在旧镜像上的基础上添加一些文件,修改之后commit出一个新镜像,再把以前的旧镜像删除
2.实现方式
2.1使用Dockerfile新建
2.2使用commit命令,本文使用第二种
3.步骤
假设原镜像为: nginx:latest
3.1启动镜像
docker run -it nginx:latest /bin/bash
3.2再打开一个Shell窗口
其中 612f701cc061 为 CONTAINER ID
docker commit 612f701cc061 nginx2
3.3查看镜像
可以看见二者 IMAGE ID 并不一样,
新镜像ID fff815b9c91f
旧镜像ID b175e7467d66
3.4删除镜像
先停止上面启动的镜像,并删除相关容器,然后删除旧镜像,并不能成功,镜像存在依赖
docker rmi b175e7467d66
查看是否存在依赖, b175e7467d66 为 IMAGE ID
docker inspect --format=''{{.Id}} {{.Parent}}'' $(docker images --filter since=b175e7467d66 --quiet)
确实存在commit出来的 fff815b9c91f 镜像依赖
3.5保存新镜像
docker save -o nginx.tar nginx2:latest
3.6删除新旧镜像
docker rmi fff815b9c91f b175e7467d66
3.7load新镜像
docker load -i ./nginx.tar
至此已达到目的,相关网页
https://stackoverflow.com/questions/42834293/deleting-old-images-in-docker-osx
关于1-3docker commit 定制镜像的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于4、docker 镜像:花卷结构、commit 镜像、Docker (十一)-Docker commit 创建镜像、Docker - 镜像 - 利用 commit 理解镜像构成、docker commit新镜像之后删除旧镜像等相关内容,可以在本站寻找。
本文标签: