docker镜像的创建和镜像的优化

     正文:

 

    进行软件的安装和docker信息的查看

[root@server1 tmp]# ls
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
[root@server1 tmp]# yum install -y *          ###进行软件的安装

 

进行docker服务的开启和docker信息的查看

systemctl start docker     ###进行服务的开启
systemctl enable docker    ###设定自启动
docker info                ###即行docker信息的查看
yum install bash-*   -y    ###进行软件的安装,使用此软件可以进行命令的补齐

 

进行服务的开启和docker信息的查看

 

 

进行bash软件的安装

 

 

进行rhel7.tar镜像的的导入

docker load -i rhel7.tar        ###进行镜像的导入
docker images                   ###查看已经导入的镜像

 

 

在./tmp目录下建立docker文件夹,并建立Dockerfile文件的建立

[root@server1 ~]# cd /tmp/
[root@server1 tmp]# mkdir docker
[root@server1 tmp]# cd docker/
[root@server1 docker]# touch Dockerfile

 

进行rhel7.tar镜像的运行并进行yum源的配置

[root@server1 ~]# docker run -it --name vm1 rhel7  bash
bash-4.2# ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# ls  
rhel7.repo
bash-4.2# vi  rhel7.repo 
bash-4.2# vi dvd.repo
bash-4.2# yum clean all
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Cleaning repos: dvd
Cleaning up everything
bash-4.2# yum repolist
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
dvd                                              | 4.1 kB     00:00     
(1/2): dvd/primary_db                              | 3.9 MB   00:00     
(2/2): dvd/group_gz                                | 136 kB   00:00     
repo id                           repo name                       status
dvd                               rhel7                           4751
repolist: 4751
bash-4.2# 

 

 

在容器中进行httpd软件的安装(进行测试)

bash-4.2# yum install httpd -y     ###进行httpd软件的安装

 

 

进行容器的退出和容器的删除

Crtl+d                       ###进行容器的退出
docker ps -a                 ###查看所有的容器
docker rm vm1                ###进行容器的删除

 

 

进行之前Dockerfile文件的编辑

vim /tmp/docker/Dockerfile                ###进行文件的编辑

FROM rhel7  #源镜像是rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

vim dvd.repo       ###进行要复制文件的编辑
[dvd]
name=rhel7
baseurl=http://172.25.68.250/westos
gpgcheck=0

 

进行Dockerfile文件的编辑

 

进行dvd.repo文件的编辑

 

 

进行镜像的构建

[root@server1 docker]# docker build -t rhel7:v1 .     ###进行镜像的构建

 

进行当前镜像的查看

[root@server1 docker]# docker images                   ###进行当前镜像的查看
[root@server1 docker]# docker history rhel7:v1         ###进行镜像信息的查看

 

使用新建立的镜像进行容器的建立

[root@server1 docker]# docker run -d --name  apache -p 80:80 rhel7:v1   ###使用新建立的镜像进行容器的建立
[root@server1 docker]# docker ps -a     ###进行当前容器的查看

 

使用浏览器进行访问测试:

 

进行文件的创建,设定默认发布文件的编辑

vim index.html
<h1>welcom to Linux </h1>

vim Dockerfile          ###进行Dockerfile文件的再次编辑
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd
COPY index.html  /var/www/html/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

 

index,html文件的建立

 

Dockerfile文件的编辑

 

进行apache容器的删除(便于后面的测试)

[root@server1 docker]# docker ps -a          ###进行当前容器的查看
[root@server1 docker]# docker stop apache    ###进行容器的停止运行
[root@server1 docker]# docker rm apache      ###进行容器的删除
[root@server1 docker]# docker ps -a          

 

 

进行rhel7:v2镜像的建立

[root@server1 docker]# docker build  -t rhel7:v2 .    ###进行镜像的建立
[root@server1 docker]# docker images                  ###进行docker镜像的查看

 

使用新建的镜像进行容器的建立:

[root@server1 docker]# docker run -d --name  apache -p 80:80 rhel7:v2   ###进行容器的创建
[root@server1 docker]# docker ps             ###进行当前容器的查看

 

 

使用浏览器进行查看

 

进行该容器地删除(便于后面测试)

[root@server1 docker]# docker ps -a          ###进行当前容器的查看
[root@server1 docker]# docker stop apache    ###进行容器的停止运行
[root@server1 docker]# docker rm apache      ###进行容器的删除
[root@server1 docker]# docker ps -a          

 

使用rhel7:v2进行容器地建立,并使用参数指定挂载点(即本机地目录下地文件挂载容器地相应中指定

目录中地文件)

[root@server1 docker]# docker run -d --name  apache -p 80:80 -v /tmp/docker/website/:/var/www/html  rhel7:v2        ###进行容器地建立
[root@server1 docker]# docker inspect apache    ###进行容器信息地查看

 

进行本机挂载目录下文件地建立

[root@server1 website]# vim /tmp/docker/website/index.html 
<h1> hello kitty </h1>

 

 

在浏览器上进行验证:

 

Shell和exec格式地区别

 

进行测试镜像地导入:

[root@server1 mnt]# docker load -i busybox.tar   ###进行镜像地导入

 

进行Dockerfile文件地编辑

vim Dockerfile                 ###进行Dockerfile文件地编辑
FROM busybox
ENV name world
ENTRYPOINT echo "hello, $name"

 

进行镜像地创建

[root@server1 docker]# docker build -t busybox:v1 .    ###进行镜像地创建

 

 

进行容器地创建:

[root@server1 docker]# docker run --rm busybox:v1  ###rm表示该容器执行后,进行删除

 

Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面
的exec格式不会:

进行Dockerfile文件地编辑

vim Dockerfile

FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", "hello, $name"]

 

进行镜像地构建

[root@server1 docker]# docker build -t busybox:v2 

 

 

使用该镜像进行容器地建立

[root@server1 docker]# docker run --rm busybox:v2 n   ###进行容器地建立

 

 

当使用exec格式时,可以使用以下方法进行变量地解析

 

进行Dockerfile文件地编辑

[root@server1 docker]# vim Dockerfile 

FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"]

 

进行镜像地创建

[root@server1 docker]# docker build -t busybox:v3 .    ###进行镜像地创建

 

使用该镜像进行容器地创建

[root@server1 docker]# docker run --rm busybox:v3

 

 

Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外
参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略
任何CMD或docker run提供的参数。

 

进行Dockerfile文件地编辑

[root@server1 docker]# vim Dockerfile 

FROM busybox
ENTRYPOINT ["/bin/echo", "hello"]
CMD ["world"]

 

进行镜像地创建

[root@server1 docker]# docker build -t busybox:v4    ###进行镜像地创建

 

 

进行容器地创建

[root@server1 docker]# docker run --rm busybox:v4

 

 

镜像地优化:可以使用以下几种方法

    选择最精简的基础镜像

    减少镜像的层数

    清理镜像构建的中间产物

     注意优化网络请求

     尽量使用构建缓存

     使用多阶段构建镜像

 

这里我们使用nginx的安装作为演示:

 

这里我们需要使用nginx的压缩包(我们已经下载完毕)

 

 

进行Dockerfile文件的编辑

vim Dockerfile                 ###进行Dockerfile文件的编辑

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

 

进行镜像的建立

[root@server1 docker]# docker build -t nginx:v1 .    ###进行镜像的建立

 

进行镜像大小的查看

[root@server1 docker]# docker images     ###进行镜像大小的查看

可以看到该镜像的大小为276M,还是比较大的

 

使用该镜像进行容器的实现

[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v1  ###进行容器的创建

 

在浏览器上进行测试查看

 

进行Dokerfile文件的编辑,进行镜像的继续优化

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

 

进行镜像的生成

[root@server1 docker]# docker build -t nginx:v2 .    ###进行镜像的生成

 

进行镜像大小的查看

docker images   ###进行镜像的查看

发现两者差别不大。

 

进行镜像层数的查看

[root@server1 docker]# docker history nginx:v1
[root@server1 docker]# docker history nginx:v2

 

两者之间就是层数就是层数的变化

 

 

进行层级的减少和减少中间产物进行继续的优化

 

进行Dockerfile文件的编辑

vim Dockerfle                  ###进行Dockerfile文件的编辑
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && 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 -rf /mnt/nginx-1.16.0
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

 

进行新镜像的创建

[root@server1 docker]# docker build -t nginx:v3 .   ###进行镜像的创建

 

进行镜像大小的查看

docker images             ###进行镜像大小的查看

 

对比可以看到,经销大小已经变小了,但是不太明显,我们可以进行继续优化。

 

 

使用多阶段进行镜像的构建

 

进行Dockerfile文件的编辑

vim Dockerfile     ###进行Dockerfile文件的编辑

FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && 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 -rf /mnt/nginx-1.16.0

FROM 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;"]

 

 

进行镜像的构建

[root@server1 docker]# docker build -t nginx:v4 .    ###进行镜像大小的构建

 

进行镜像大小的查看

docker images     ###进行镜像大小的查看

 

我们看到使用了多阶段的构建之后,会发现镜像的大小缩小了很多。

我们也可以在网上进行精简基础镜像的下载,进行进一步的优化,这里就不做演示。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值