docker基于已有容器和通过Dockerfile进行制作镜像配置介绍

目录

一.制作镜像的两种方式

1.在已有容器中更新并提交这个镜像

2.使用Dockerfile来制作

二.基于容器制作镜像

1.格式

(1)主要格式

(2)可选参数

2.示例

3.基于容器制作镜像的缺点

二.基于Dockerfile制作镜像

1.简介

2.相关注意事项

(1)Dockerfile 编写的基本结构

(2)一台主机可以有多个Dockerfile

(3)Dockerfile中指定的所有COPY、ADD等内容都需要与Dockerfile位于同一级目录下

3.Dockerfile指令介绍

(1)FROM

(2)MAINTAINER

(3)COPY

(4)ADD

(5)WORKDIR

(6)RUN

(7)EXPOSE

(8)ENV

(9)VOLUME

(10)CMD

(11)ENTRYPOINT

(12)HEALTHCHECK

(13)ONBUILD

4.制作

(1)主要是使用build命令

(2)案例演示


一.制作镜像的两种方式

通常我们pull下来的镜像是默认的配置,显然难以满足我们的学习和工作需求,那么就可以按需要制作镜像,从而方便在此次之后的使用需求。

1.在已有容器中更新并提交这个镜像

2.使用Dockerfile来制作

二.基于容器制作镜像

1.格式

(1)主要格式

docker commit 参数 容器名称

[root@localhost ~]# docker commit -p bu1
sha256:efbd10d0e00a552f86747a6001323992c030df81338f670f6916c47948e39f74

(2)可选参数

-a指定作者
-c修改dockerfile指令用于创建的镜像,CMD
-m记录本次修改的内容(描述信息)
-p在提交期间暂停容器,默认为true

2.示例

(1)基于已有的nginx的容器来进行制作已经存在html文件改变容器存储层内容)和vim编辑器的镜像

#这是现有的nginx镜像,在经过apt-get update和apt-get install -y vim 后,该镜像中已经拥有默认的html文件、已经修改完成的nginx.conf、vim工具
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                               NAMES
de0cf1a38417   nginx       "/docker-entrypoint.…"   42 minutes ago   Up 42 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx

(2)制作(参照最新增量的变化)

[root@localhost ~]# docker commit -p mynginx
#为其打标签方便使用
[root@localhost ~]# docker tag a35 nginx:1.0
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      1.0       a3517d29f691   55 minutes ago   249MB
nginx        latest    e784f4560448   3 weeks ago      188MB
mysql        latest    e9387c13ed83   4 weeks ago      578MB
busybox      latest    65ad0d468eb1   12 months ago    4.26MB
centos       latest    5d0da3dc9764   2 years ago      231MB
owncloud     latest    327bd201c5fb   5 years ago      618MB

(3)通过该镜像来运行容器并检验(首先需要关闭端口有容器冲突的端口)

[root@localhost ~]#  docker run --name mynginx1 -p 80:80 -d mynginx:1.0
[root@localhost ~]# docker exec -it 9ed /bin/bash -c "curl localhost"
hello
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS          PORTS                               NAMES
9ed3c05f8c8c   mynginx:1.0   "/docker-entrypoint.…"   About a minute ago   Up 24 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mynginx1

 (4)docker diff 查看容器内哪些文件产生了变化

[root@localhost ~]# docker diff mynginx1
C /root
C /root/.viminfo
C /root/.bash_history
C /run
C /run/nginx.pid
C /etc
C /etc/nginx
C /etc/nginx/nginx.conf
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf

3.基于容器制作镜像的缺点

(1)在基于容器制作镜像后,使用容器时自己要修改的文件和一些不希望修改的文件也一起产生变动,数据量一旦大起来就显得极为繁杂

(2)只有自己知道自己在制作时干过什么甚至过段时间自自己都不知道干过什么,难以为进一步的增量操作提供正确参考

(3)基于分层存储下的增量运转模式,随着修改次数的增多,镜像的臃肿程度呈递增状态

二.基于Dockerfile制作镜像

1.简介

把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这就是Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令会构建一层,每一条
指令的内容是描述该层应当如何构建。

2.相关注意事项

(1)Dockerfile 编写的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,文件名为“Dockerfile”

(2)一台主机可以有多个Dockerfile

要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构新的镜像

(3)Dockerfile中指定的所有COPY、ADD等内容都需要与Dockerfile位于同一级目录下

3.Dockerfile指令介绍

(1)FROM

Dockerfile文件内容以FROM开头,是在构建镜像中指定基础镜像,之后的动作基于FROM指定的基础镜像环境下进行,如果这个镜像在本地主机docker上不存在,将会从docker公共库拉取。在有多个镜像需求时FROM可以出现多次。(特殊空白镜像——scratch,可以直接将编写好的可执行文件放进去进行镜像制作)
FROM centos:6

(2)MAINTAINER

提供镜像制作者的详细信息,一般紧跟FROM之后

FROM centos:6
MAINTAINER "name <name@163.com>"

(3)COPY

复制文件或目录到容器里指定的路径

文件或目录为多个时支持通配符匹配

文件或目录必须是Dockerfile所在路径的上下文目录不能在其父目录

当指定的是目录时,其本身不会被复制但其下的文件或子目录会被递归复制

COPY的文件的权限和修改时间等会被保留

#此示例的效果是,删除默认页面并使用主机上的html文件替换页面并显示,主要使用copy模块
[root@localhost docker]# ll
total 8
-rw-r--r-- 1 root root 113 May 31 21:32 Dockerfile
-rw-r--r-- 1 root root  13 May 31 20:31 index.html
[root@localhost docker]# cat Dockerfile 
FROM nginx
MAINTAINER "Along sulibao"
RUN rm -rf /usr/share/nginx/html/*    #先删除nginx的默认界面
COPY index.html /usr/share/nginx/html/   #再将主机上index.html目录移动到web工作目录

#这个情况下就要确保存放Dockerfile的同级目录下要有index.html文件,/data/web/html/是目标目录

(4)ADD

类似于COPY指令,支持tar文件和url路径,如果指定的是同是在一个系统上的压缩的tar文件,其将会被执行类似于“tar -x”的解包操作,而通过url获取的则不会被操作

FROM centos:6
MAINTAINER "name <name@163.com>"
COPY index.html /data/web/html/
ADD xxx.tar.gz /usr/local/src/  #xxx.tar.gz同样放在Dockerfile统计目录,如果是url原地址则直接指定即可

(5)WORKDIR

用于为RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目录,WORKDIR可以出现多次,不存在时会自动创建该目录,也支持ENV定义的变量。

建议的做法是尽可能地减少workdir指令的数量,以确保 Dockerfile 更易于理解和维护。通常情况下,你可以在 Dockerfile 的顶部使用一个workdir指令来设置主要的工作目录,然后在后续的命令中使用相对路径来操作文件和目录。

FROM centos:6
MAINTAINER "name <name@163.com>"
COPY index.html /data/web/html/
WORKDIR /usr/local/      #之后进入通过这个镜像运行的容器,默认就是在/usr/local
ADD xxx.tar.gz /usr/local/src/ 

(6)RUN

指定制作镜像过程中运行的程序,可以是任何命令,直接指定命令通常是一个以“/bin/sh”或/bin/bash“”运行shell命令。

RUN指令用于在镜像构建过程中执行命令,并在镜像的新一层中提交结果。这些命令通常用于安装软件包、下载文件、编译代码等操作。

RUN指令都会在镜像中创建一个新的镜像层,因此需要注意在一个RUN指令中尽可能地将多个命令串联起来,以减少镜像的层数,从而减小镜像的体积。

FROM centos:6
MAINTAINER "name <name@163.com>"
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
RUN cd ./src && tar -zvxf xxx.tar.gz  #表示切换到这个目录解这个包

(7)EXPOSE

声明运行容器时提供服务的端口,端口开放不会由此决定,但会在使用“-P”随机端口运行容器时提供参考,可以以"port/协议"方式来指定传输层协议(tcp/udp),支持同时指定多个端口

FROM centos:6
MAINTAINER "name <name@163.com>"
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
RUN cd ./src && tar -zvxf xxx.tar.gz

(8)ENV

为制作镜像定义环境变量,其可以被任意调用

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  #在后面需要使用时就可以通过“$DOC_ROOT”的方式来引用
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
RUN cd ./src && tar -zvxf xxx.tar.gz

(9)VOLUME

在制作镜像过程中在image内创建一个挂载点目录来挂载本容器卷或其他容器卷

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  #在后面需要使用时就可以通过“$DOC_ROOT”的方式来引用
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
VOLUME /data/myweb
RUN cd ./src && tar -zvxf xxx.tar.gz

(10)CMD

类似RUN指令,可以存在多个,可以在Dockerfile构建出新镜像并启动容器时运行任何命令或程序,或者为启动的容器指定默认运行程序。

一个 Dockerfile 中可以有多个CMD指令,但只有最后一个CMD指令会生效,它会覆盖之前的CMD指令。

如果在运行容器时提供了命令,那么它将覆盖 Dockerfile 中设置的默认命令

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
VOLUME /data/myweb
RUN cd ./src && tar -zvxf xxx.tar.gz
CMD /bin/httpd -f -h ${DOC_ROOT}  #也可以CMD ["/bin/httpd","-f","-h","${DOC_ROOT}"]

(11)ENTRYPOINT

类似CMD,指定容器运行时的默认程序,不会被RUN命令选项覆盖(除了RUN --entryypoint),作为一个单独的可执行程序。在指定了ENTRYPOINT又指定了CMD后,CMD的内容被当做参数传给ENTRYPOINT指定不再直接运行命令或程序。

ENTRYPOINT定义了容器的主要入口点,即在容器启动时要运行的第一个命令。通常,ENTRYPOINT指定的命令会在Docker容器启动时立即执行

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
VOLUME /data/myweb
RUN cd ./src && tar -zvxf xxx.tar.gz
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}   #也可以像上面CMD那样用“[]”写

(12)HEALTHCHECK

可以实现告知docker怎样检测它是否还在正常运转,只能出现一次,若出现多次只有最后一个生效

可选参数

--interval=DURATION (default:30s)
隔多久探测一次,默认30s
--timeout=DURATION (default:30s)
服务器响应超时时长,默认30s
--retries=N (default:3)
标记失败几次将容器视为不正常状态,默认3次

返回值含义

0——容器健康

1——容器不健康 

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
VOLUME /data/myweb
RUN cd ./src && tar -zvxf xxx.tar.gz
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}  
HEALTHCHECK CMD curl xxx.xxx.xxx.xxx:xx    #验证某个容器的某个端口

(13)ONBUILD

在Dockerfile中定义一个触发器,后面跟的是RUN、COPY等指定,被指定的指令只有在被当前镜像被作为基础镜像去制作下一级镜像时才会被执行。不能ONBUID嵌套ONBUILD

FROM centos:6
MAINTAINER "name <name@163.com>"
ENV DOC_ROOT=/data/web/html/  
COPY index.html /data/web/html/
WORKDIR /usr/local/
ADD xxx.tar.gz /usr/local/src/ 
EXPOSE 80/tcp
VOLUME /data/myweb
RUN cd ./src && tar -zvxf xxx.tar.gz
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}  
HEALTHCHECK CMD curl xxx.xxx.xxx.xxx:xx   
ONBUILD RUN echo "<h1>here server2</h1>" >> /data/web/html/index.html

4.制作

(1)主要是使用build命令

docker build 参数 路径

常用可选参数

-t指定要创建的目标镜像名称
-cCPU权重
-m内存限制

(2)案例演示

[root@localhost centos]# pwd
/centos
[root@localhost centos]# ll
total 1060
-rw-r--r-- 1 root root     270 Aug 24 21:52 Dockerfile
-rw-r--r-- 1 root root       6 Aug 24 21:16 index.html
-rw-r--r-- 1 root root 1073322 Aug  9 19:20 nginx-1.22.0.tar.gz

[root@localhost centos]# vim Dockerfile 
FROM busybox:latest
MAINTAINER "sulibao <sulibao2003@163.com>"
ENV DOC_ROOT=/data/web/html/
COPY index.html ${DOC_ROOT}
ADD nginx-1.22.0.tar.gz /usr/local
VOLUME /data/mysql
EXPOSE 8080:80/tcp
RUN ls /usr/local

[root@localhost centos]# docker build -t myhttpd ./   #制作镜像
[+] Building 0.3s (9/9) FINISHED                                                                                                              docker:default
 => [internal] load build definition from Dockerfile                                                                                                    0.0s
 => => transferring dockerfile: 250B                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                                                                                       0.0s
 => [1/4] FROM docker.io/library/busybox:latest                                                                                                         0.0s
 => [internal] load build context                                                                                                                       0.0s
 => => transferring context: 71B                                                                                                                        0.0s
 => CACHED [2/4] COPY index.html /data/web/html/                                                                                                        0.0s
 => CACHED [3/4] ADD nginx-1.22.0.tar.gz /usr/local                                                                                                     0.0s
 => [4/4] RUN ls /usr/local                                                                                                                             0.2s
 => exporting to image                                                                                                                                  0.1s
 => => exporting layers                                                                                                                                 0.1s
 => => writing image sha256:af6af0f426c763b7b8a521a5fcc24d8d2a2897bb0e5929fe7d72878c9fc7ef52                                                            0.0s
 => => naming to docker.io/library/myhttpd                                                      

[root@localhost centos]# docker run -itd --name web1 -P myhttpd:latest 
96e02b52f243e15bdd706ca8e489593d69e66999386cd9fc23ba0e742a499f27
[root@localhost centos]# docker exec -it web1 /bin/sh  #运行容器并查看功能是否已经实现
/ # ls /usr/local/
nginx-1.22.0
/ # cd /usr/local/nginx-1.22.0/
/usr/local/nginx-1.22.0 # ls
CHANGES     CHANGES.ru  LICENSE     README      auto        conf        configure   contrib     html        man         src

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Docker镜像管理和私有仓库建构是Docker的重要组成部分。镜像管理是指如何管理和维护Docker镜像,包括创建、删除、更新和查看镜像等操作。私有仓库建构是指如何建立自己的Docker仓库,用于存放和分享自己的Docker镜像。 以下是关于Docker容器镜像管理和私有仓库建构的一些基本知识点: 1. 镜像管理 Docker镜像是一个可执行的软件包,包含了运行某个应用程序所需的所有文件和依赖项。Docker镜像可以基于已有镜像创建,也可以从Dockerfile构建。 基于已有镜像创建新的镜像: ``` docker commit [CONTAINER_ID] [NEW_IMAGE_NAME] ``` 从Dockerfile构建新的镜像: ``` docker build -t [IMAGE_NAME] [DOCKERFILE_PATH] ``` 查看本地所有镜像: ``` docker images ``` 删除本地指定的镜像: ``` docker rmi [IMAGE_NAME] ``` 2. 私有仓库建构 Docker Hub是一个公共的Docker仓库,但是有时候我们需要建立自己的私有仓库,用于存放和分享自己的Docker镜像Docker官方提供了Docker Registry来搭建私有仓库,也可以使用第三方工具如Nexus、GitLab等来搭建私有仓库。 使用Docker Registry搭建私有仓库: ``` docker run -d -p 5000:5000 --name registry registry:2 ``` 在Dockerfile中指定私有仓库地址: ``` FROM [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ``` 将本地镜像推送到私有仓库: ``` docker tag [LOCAL_IMAGE_NAME] [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] docker push [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ``` 从私有仓库拉取镜像: ``` docker pull [PRIVATE_REGISTRY]:[PORT]/[IMAGE_NAME]:[TAG] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树下一少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值