1、镜像更新版本
1) 导入镜像
[root@server1 images]# docker load -i busybox.tar
[root@server1 ~]# cd /tmp/
[root@server1 tmp]# mkdir docker
[root@server1 tmp]# cd docker/
2)构建
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN echo hellworld > /testfile
[root@server1 docker]# docker build -t busybox:v1 .
[root@server1 docker]# docker history busybox:v1
3)再次构建
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN echo hellworld > /testfile
RUN echo redhat >> /testfile
[root@server1 docker]# docker build -t busybox:v2 .
[root@server1 docker]# docker history busybox:v2
2、封装apache镜像
1)导入基础镜像
[root@server1 images]# docker load -i rhel7.tar
2)测试yum源(此步只是测试yum源,与部署无关)
[root@server1 images]# docker run -it --rm rhel7 bash
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# vi dvd.repo
[dvd]
name=rhel7
baseurl=http://172.25.47.250/westos
gpgcheck=0
bash-4.2# yum repolist
3)在docker目录下写一个yum源的文件
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim dvd.repo
[dvd]
name=rhel7
baseurl=http://172.25.47.250/westos
gpgcheck=0
4)写Dockerfile
[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
5)封装
[root@server1 docker]# docker build -t rhel7:v1 .
6)开启
[root@server1 docker]# docker run --name vm1 -d rhel7:v1
923eaee75f87dc9caa3e1d2b96f046696790e43f091832e35a54a0edbfa619b0
[root@server1 docker]# docker ps
[root@server1 docker]# docker inspect vm1
7)写一个发布页面
[root@server1 docker]# vim index.html
www.wanghaha.com
[root@server1 docker]# docker container cp index.html vm1:/var/www/html/
8)测试
[root@server1 docker]# curl 172.17.0.2
www.wanghaha.com
3、封装nginx镜像
1)准备nginx包
[root@foundation47 5.14docker]# scp nginx-1.15.8.tar.gz root@172.25.47.1:/root
[root@server1 ~]# cp nginx-1.15.8.tar.gz /tmp/docker/ ##先准备一个nginx包,到/tmp/docker/
2)写Dockerfile
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt ##解压到/mnt目录下
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
3)封装
[root@server1 docker]# docker build -t mynginx:v1 .
4)运行
[root@server1 docker]# docker run --name vm2 -d mynginx:v1
[root@server1 docker]# docker ps ## 查看进程
5)测试
[root@server1 docker]# docker inspect vm2
[root@server1 docker]# curl 172.17.0.3
4、镜像优化
1)减少镜像层数,清理中间产物
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
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 -fr /mnt/nginx-1.15.8
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@server1 docker]# docker build -t mynginx:v2 .
[root@server1 docker]# docker images mynginx
可以看到优化后的v2版本镜像变小了
2)优化,使用多阶段构建镜像
[root@server1 docker]# vim Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
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 -fr /mnt/nginx-1.15.8
FROM rhel7
EXPOSE 80
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@server1 docker]# docker build -t mynginx:v3 .
[root@server1 docker]# docker images mynginx
3)优化镜像,选择最精简的基础镜像
1>导入基础镜像
[root@server1 images]# docker load -i distroless.tar
2>写Dockerfile
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
FROM nginx 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/localtime
FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
3>封装
[root@server1 docker]# docker build -t mynginx:v4 .
4>查看大小
[root@server1 docker]# docker images mynginx