正文:
进行软件的安装和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 ###进行镜像大小的查看
我们看到使用了多阶段的构建之后,会发现镜像的大小缩小了很多。
我们也可以在网上进行精简基础镜像的下载,进行进一步的优化,这里就不做演示。