docker镜像创建与优化

1 . 创建镜像

有两种方法构建镜像:

  1. docker commit :将运行的容器保存成镜像
  2. Dockerfile:自动构建

使用docker commit 创建镜像分为三步:

  1. 运行容器
  2. 修改容器
  3. 将容器保存为镜像

举例:

[root@docker ~]# docker load -i busybox.tar     # 导入镜像
8a788232037e: Loading layer   1.37MB/1.37MB
Loaded image: busybox:latest
[root@docker ~]# docker run -it --name test busybox  # 运行
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ^C
/ # [root@docker ~]# 
[root@docker ~]# 

修改容器

/ # echo "hello toto" > testfile
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr

将容器保存为新的镜像:

docker commit test busybox:v2

查看新生成的镜像:无法看新镜像层的操作

IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
0cdf20286e29        About a minute ago   sh                                              46B                 
59788edf1f3e        9 months ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago         /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB

直接运行新生成的镜像容器:

docker run -it --name test busybox:v2 / # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr   # 里面保存了之前操作的数据。

以Dockerfile 创建镜像

Dockerfile的详细介绍:

1 、FROM:
用于指定base镜像,本地不存在会从远程仓库进行下载

2、MAINTAINER
MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)

3、COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest和COPY [" src" ,"dest "]
src必须指定build context中的文件或目录
dest为容器中的路径

4 、ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可自动下载URL并拷贝到镜像
DD html.tar /var/www ##解压
ADD http://ip/html.tar /var/www ##下载

5 EXPOSE
如果容器中运行应用服务,则可以包服务端口暴露出去

6 、VOLUME
声明数据卷,通常指定应用数据挂载点

  • 一般VOLUME指定挂载点,没有此路径就会新建路径。
  • 在运行docker宿主机上,可以根据命令docker inspect 容器名的具体信息,可以查看封装容器,声明的数据卷,Source会存在此容器目录挂接到本地_data目录
  • 由于自动挂载的路径很长,不太方便记,也可以在运行的时候指定挂载路径

7 、WORKDIR
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在也会自动创建

8 、RUN
RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包:每个run 都会多一层

9 、ENV:
设置环境变量,变量可以被后续的指令使用

10 、CMD 与 ENTRYPOINT
设置容器启动后执行的命令,但是CMD会被docker run 后面的命令覆盖,但ENTRYPOINT不会

Dockerfile中只能指定一个ENTRYPOINT,如果指定过多则只有最后一个有效

docke run后面的参数可以传递给ENTRYPOINT指令当作参数;

举例:

创建空目录以及Dockerfile文件

[root@docker docker]# ls
dockerfile
[root@docker docker]# pwd
/root/docker
[root@docker docker]# vim dockerfileFROM busybox    # 以已经存在的busybox进行为base镜像
RUN echo 'hello world'   # 新加的操作,每一个RUN产生一个新的镜像层
RUN echo 'westos linux'

创建新的镜像:. 表示Dockerfile所在的路径

[root@docker docker]# docker build -t busybox:v2 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : RUN echo 'hello world'---> Running in aeb63ff2b255
hello world
Removing intermediate container aeb63ff2b255---> 2f50636190bd
Step 3/3 : RUN echo 'westos linux'---> Running in 80071f12fdbb
westos linux
Removing intermediate container 80071f12fdbb---> 4b51d8f9a94b
Successfully built 4b51d8f9a94b
Successfully tagged busybox:v2

成功之后再次查看镜像,已经成功生成镜像

[root@docker docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             v2                  4b51d8f9a94b        59 seconds ago      1.15MB
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB

查看新生成的镜像分层结构:

能清楚的看到每一层镜像进行的操作,使用者可以对镜像进行审计

[root@docker docker]# docker history busybox:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4b51d8f9a94b        2 minutes ago       /bin/sh -c echo 'westos linux'                  0B                  
2f50636190bd        2 minutes ago       /bin/sh -c echo 'hello world'                   0B                  
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB      

当不修改刚才的Dockerfile的基础上再次添加内容创建镜像的时候

FROM busybox
RUN echo 'hello world'
RUN echo 'westos linux'
RUN echo haha > hahafile    # 添加一条新的语句

再上一次的基础上构建新的镜像

[root@docker docker]# docker build  -t busybox:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM busybox---> 59788edf1f3e
Step 2/4 : RUN echo 'hello world'---> Using cache---> 2f50636190bd
Step 3/4 : RUN echo 'westos linux'---> Using cache---> 4b51d8f9a94b
Step 4/4 : RUN echo haha > hahafile---> Running in 3d4df4fde1c6
Removing intermediate container 3d4df4fde1c6---> 9e1099db5b57
Successfully built 9e1099db5b57
Successfully tagged busybox:v3

查看新生成的镜像分层结构:

在Dockerfile文件中,每一个RUN语句都会生成一个新的镜像层。

[root@docker docker]# docker history busybox:v3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
9e1099db5b57        49 seconds ago      /bin/sh -c echo haha > hahafile                 5B                  
4b51d8f9a94b        6 minutes ago       /bin/sh -c echo 'westos linux'                  0B                  
2f50636190bd        6 minutes ago       /bin/sh -c echo 'hello world'                   0B                  
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB              

docker镜像优化:

1.优化镜像应该主要有以下几个方面:

1 选择最精简的基础镜像
2 减少镜像的层数
3 清理镜像构建的中间产物
4 注意优化网络需求
5 尽量去用构建缓存

举例(以nginx为例):

1、未优化

[root@docker docker]# ls
Dockerfile  nginx-1.15.8.tar.gz  westos.repo
[root@docker docker]# cat Dockerfile 
FROM rhel7 
EXPOSE 80   
VOLUME ["/usr/local/nginx/html"] 
ADD  nginx-1.15.9.tar.gz /mnt   
COPY westos.repo /etc/yum.repos.d/westos.repo
RUN rpmdb --rebuilddb  
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.15.9 
RUN ./configure --prefix=/usr/local/nginx 
RUN make
RUN make install 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

创建镜像并查看镜像大小

docker build -t nginx:v1 .docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
nginx               v1                  c4712dcc2963        About a minute ago   295MB
rhel7               latest              0a3eb3fde7fd        5 years ago          140MB

2、 清理中间缓存并尽量减少镜像层数

 vim Dockerfile FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
ADD  nginx-1.15.9.tar.gz /mnt
COPY westos.repo /etc/yum.repos.d/westos.repo
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

创建镜像并查看镜像大小

docker build -t nginx:v2 .docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  2b20e470e31c        25 seconds ago      252MB
nginx               v1                  c4712dcc2963        11 minutes ago      295MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

3、使用多阶段构建方法

我们需要的只不过是编译之后的软件包,那么我们就可以在一容器编译安装以后,将编译安装之后的安装包拷贝到另一个容器中,这样就减小了不需要的开销。并且将压缩包删除。

vim Dockerfile FROM rhel7 as build    # 这一阶段只需需要完成nginx的编译
ADD nginx-1.15.9.tar.gz /mnt
COPY westos.repo /etc/yum.repos.d/westos.repo
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8FROM rhel7    # 创建镜像,将编译好的文件直接拿过来用
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

创建镜像并查看镜像大小

 docker build -t nginx:v3 .docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  e5b903942033        19 seconds ago      141MB
nginx               v2                  2b20e470e31c        11 minutes ago      252MB
nginx               v1                  c4712dcc2963        22 minutes ago      295MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

4、减少底层base的大小

使用一个最基础的系统环境镜像。然后从nginx进行中将运行nginx所需要的依赖库都导入到基础的系统镜像中,就可以满足运行nginx的要求。做到最小化。

docker load -i distroless.tar				##一个基础的系统环境镜像
docker load -i nginx.tar			        ##nginx的进行,vim Dockerfile
FROM nginx:1.16 as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtimeFROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
VOLUME ["/usr/share/nginx/html"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

创建镜像并查看镜像大小

docker images 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    v4                  cb475e8f4412        7 seconds ago       23.7MB
nginx                    v3                  e5b903942033        19 minutes ago      141MB
nginx                    1.16                ac44715da54a        4 weeks ago         109MB
rhel7                    latest              0a3eb3fde7fd        5 years ago         140MB
gcr.io/distroless/base   latest              9a255d5fe262        49 years ago        16.8MB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISP运营商实验室测试机架拓扑搭建经验分享

大家好&#xff0c;有些日子没更新干货了&#xff0c;近期难得有假期进行修整&#xff0c;思前顾后还是坐下来聊聊自己长期负责维护和搭建的实验室环境。废话不多说&#xff0c;直接上图。因为图较大&#xff0c;分上下部分进行上传。网络主框架&#xff08;上&#xff09;服务…

关于二手交易用户指南怎么写_让用户拍案叫绝文案怎么写?试试这3个方法

“共鸣”到底是什么&#xff1f; 为什么有些文章会引起共鸣&#xff0c;而有些则没有。现在假设为产品家用手持式美容仪写一份副本。 由于主要重点是“家庭使用”&#xff0c;因此您立即想到了“家庭美容”的口号。 尽管这句话很简单易懂&#xff0c;但谈论起来总是很简单……似…

结构化程序goto语句_C ++ goto语句| 查找输出程序| 套装1

结构化程序goto语句Program 1: 程序1&#xff1a; #include <iostream>#include <math.h>using namespace std;int main(){int num1 1;int num2 0;MY_LABEL:num2 num1 * num1;cout << num2 << " ";num1 num1 pow(2, 0);if (num1 < …

docker仓库搭建、加密、用户认证

1 . 含义及理解&#xff1a; 仓库分为公开仓库&#xff08;Public&#xff09;和私有仓库&#xff08;Private&#xff09;两种形式。最大的公开仓库是 Docker Hub&#xff0c;存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等&#xff0c;可以提供大陆用户…

Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡

Centos7NginxKeepalived实现Apache服务的高可用&负载均衡今天是2017年的第一天&#xff0c;昨天也就是2016年的最后一天&#xff0c;我尝试部署了Centos7NginxKeepalived实现WEB服务的高可用负载均衡服务&#xff0c;终于在2017年的第一天前完成了&#xff0c;所以在此分享…

客户端通过网口启动可过去的ip_西安交通大学16年3月课程考试《网络组网技术综合训练》作业考核试题...

西安交通大学16年3月课程考试《网络组网技术综合训练》作业考核试题一、单选题(共 20 道试题&#xff0c;共 40 分。)V 1. 下列不属于服务器内部结构的是()A. CPUB. 电源C. 5类双绞线D. 北桥芯片满分&#xff1a;2 分2. 网络中使用光缆的优点是()A. 便宜B. 容易安装C. 是一个工…

mcq 队列_MCQ | 软件工程基础知识/简介(1)

mcq 队列Q1. Which of the following is a part of the software? Q1。 以下哪个是软件的一部分&#xff1f; Programs 程式 Documentation 文献资料 Operating Procedures 运营流程 All of the above 上述所有的 Answer: d. All of the above 答案&#xff1a; d。 上述所有…

docker设置镜像加速器

设置镜像加速器 一般情况下&#xff0c;直接从官方仓库中直接拉取镜像会比较慢&#xff0c;可以设置镜像加速器&#xff0c;相当于一个反向代理。以阿里云为例 1 . 首先获取自己的加速器地址 www.aliyun.com 登陆自己的账号&#xff08;可以是支付宝账号&#xff09; 首页点…

keytool条目_java keytool 常用命令

最近在做ssl连接active directory&#xff0c; 遇到了不少的ssl的问题。连接ssl时会需要用将证书保存到keystore&#xff0c; 而这个步骤刚好就用到了keytool命令。直接敲keytool会有提示如何用这个命令&#xff0c; 但对于完全不懂的我&#xff0c;还是找了下基本命令&#xf…

用JavaScript中的示例进行fill()函数

fill() is a predefined function in JavaScript, which is used to fill all elements of an array with a static value. fill()是JavaScript中的预定义函数&#xff0c;用于用静态值填充数组的所有元素。 Example: 例&#xff1a; <html><head><title>J…

谈谈重载(overload)覆盖(override)与隐藏

这三个概念都是与OO中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的&#xff0c;但是隐藏这一概念却使问题变得有点复杂了&#xff0c;下面说说它们的区别吧。重载是指不同的函数使用相同的函数名&#xff0c;但是函数的参数个数或类型不同。调用的时候根据函…

搭建Harbor私有仓库

1 首先装好docker&#xff1a; 由于之前已安装过&#xff0c;所以直接开起就行 2 . 安装python2.7以上版本 之前编译安装过7.3的&#xff0c;直接用吧 3 . 安装docker-compose docker容器管理工具&#xff0c;是habor的依赖之一。 curl -L "https://github.com/docker…

mysql日志查询指令_MySQL查询日志总结

MySQL查询日志介绍MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。生产环境&#xff0c;如果开启MySQL查询日志&#xff0c;对性能还是有蛮大的影响的。另外很多时候&#x…

thinkphp5.0助手函数占用服务器资源

db(user) 默认情况下&#xff0c;每次请求都会重新连接数据库&#xff0c;这样会占用服务器资源 方法1.如果不想每次都重连可以这样 db("List",[],false) 方法2.还可以直接改function&#xff0c;及则需要把 function db($name , $config [], $force true){retu…

python 无符号整数_Python中的有符号和无符号整数数组

python 无符号整数An array can be declared by using "array" module in Python. 可以通过在Python中使用“数组”模块来声明数组 。 Syntax to import "array" module: 导入“数组”模块的语法&#xff1a; import array as array_alias_nameHere, imp…

mysql快速批量入库_MySQL-批量入库优化

MySQL批量入库的方式循环一条一条入库批量入库通过程序组合 insert into (字段) tbl vlaues(), vlaues(), vlaues(),...事务入库$autoCommit (isset($this->startTransaction) ? !$this->startTransaction : true);$ids array();if ($autoCommit) {$this->startTra…

docker集群搭建(k8s)

1 . 理解&#xff1a; Kubernetes是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kubernetes提供了应用部署&#xff0c;规划&#xff0c;更新&#xff0c…

Python模拟删除字符串两边的空白

目标&#xff1a;   1.使用string模块的whitespace   2.删除左边、右边以及两边的空白 代码如下&#xff1a; [rootlocalhost python]# cat rmspace.py #!/usr/bin/env python #coding:utf8 """ 使用字符串删除左右两端的空白。 """from str…

xml分析错误:注释未终止_错误:C中的未终止注释(无效的注释块) 常见的C程序错误...

xml分析错误:注释未终止Comments are used to write logic explain or anything that you do not want to compile. In C language there are two types of comments 1) Single line comment and 2) Multi-line comment. 注释用于编写逻辑解释或您不想编译的任何内容。 在C语言…

查看 mysql 状态_查看mysql状态的常用命令

在mysql客户端输入"show status"之后将会看到如下输出&#xff1a;如果想要查看某个具体的值&#xff0c;可以使用如下命令&#xff1a;show status LIKE "%具体变量%";Aborted_clients 由于客户没有正确关闭连接已经死掉&#xff0c;已经放弃的连接数量.A…