GVKun编程网logo

1-3docker commit 定制镜像

19

想了解1-3dockercommit定制镜像的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于4、docker镜像:花卷结构、commit镜像、Docker(十一)-Dockercomm

想了解1-3docker commit 定制镜像的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于4、docker 镜像:花卷结构、commit 镜像、Docker (十一)-Docker commit 创建镜像、Docker - 镜像 - 利用 commit 理解镜像构成、docker commit新镜像之后删除旧镜像的新知识。

本文目录一览:

1-3docker commit 定制镜像

1-3docker commit 定制镜像

以定制⼀个 Web 服务器为例⼦

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 diff 命令看到具体的改动。
我们可以⽤下⾯的命令将容器保存为镜像:
docker commit --author zjy --message 修改了首页 webserver nginx:v2
#中 --author 是指定修改的作者
 --message 则是记录本次修改的内容
docker images

我们还可以⽤ docker history 具体查看镜像内的历史记录

新的镜像定制好后,我们可以来运⾏这个镜像
docker run -d --name webserver2 -p 8081:80 nginx:v2

 

 注意:commint 实现中用的比较少,测试可以用 

4、docker 镜像:花卷结构、commit 镜像

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 (十一)-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 理解镜像构成

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新镜像之后删除旧镜像

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新镜像之后删除旧镜像等相关内容,可以在本站寻找。

本文标签: