基础镜像制作
环境目录
[root@server1 docker]# ls
Dockerfile dvd.repo index.html nginx-1.19.1.tar.gz rhel7.tar
[root@server1 docker]# pwd
/root/docker
导入rhel7镜像
[root@server1 docker]# docker load -i rhel7.tar
[root@server1 docker]# docker images
rhel7 latest 0a3eb3fde7fd 7 years ago 140MB
创建交互式容器,用于测试命令
[root@server1 docker]# docker run -it --name demo4 rhel7 bash
bash-4.2# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
bash-4.2#
删除demo4
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d08c4f92a80 rhel7 "bash" About a minute ago Exited (0) 45 seconds ago demo4
58d3a3966918 busybox "sh" 3 hours ago Up 3 hours demo2
846785f0e9d3 busybox "sh" 46 hours ago Up 46 hours demo
[root@server1 docker]# docker rm -f demo4
demo4
创建dockerfile文件
[root@server1 docker]# cat dockerfile
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server1 docker]# pwd
/root/docker
生成镜像,如果遇到错误进行修改,不修改中断内容之上的部分,则再次built会在上次基础上运行
[root@server1 docker]# docker build -t rhel7:v1 .
##docker build 命令用于使用 Dockerfile 创建镜像。
创建容器demo_rhel7
[root@server1 docker]# docker run -d --name demo_rhel7 rhel7:v1
dfe850790ccabb8b78887309fc6119e7e259a979dbb2028c0c62fda1b030de0a
查看demo_rhel7 容器信息
[root@server1 docker]# docker inspect demo_rhel7
###docker inspect : 获取容器/镜像的元数据。
访问docker给nginx分配的ip
[root@server1 docker]# curl 172.17.0.4
是由于数据挂载在真实主机路径上,真实路径上没有数据,无法访问到内容
进入真实路径创建index.html
[root@server1 docker]# cd /var/lib/docker/volumes/7fb5d3088952e81dc7268a521e7b913875930ffd71b75bf3781decb3617c7aa5/_data
[root@server1 _data]# echo "hello server1" > index.html
由此获取到的镜像可以在任何一台主机上使用,因为已经具备封装好的环境及软件 但是rhel7:v1 比原镜像大了一倍多.不符合轻量化的原则,因此需要进行优化
[root@server1 _data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 v1 fa7157d77d25 20 minutes ago 303MB
rhel7 latest 0a3eb3fde7fd 7 years ago 140MB
层级结构优化及空间清理
在脚本中每一行都会是一层结构,最有效的方法是把 命令撮合到一起没有冗余 来减少结构层数
[root@server1 docker]# cat Dockerfile
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
优化脚本
清除系统缓存及nginx编译目录
rm -rf /mnt/nginx-1.20.1 /var/cache/*
生成rhel7:v2
镜像
查看 rhel7:v1 与 rhel7:v2 大小 缩小了50M左右
迁移源镜像
通过v2配置参数修改镜像,此时镜像内的环境除了nginx的运行环境还包括为了编译nginx而部署的环境,待nginx部署完毕,将该镜像上的nginx移植到只用运行环境的rhel7
源镜像,从而达到节省空间目的。
FROM rhel7 as build
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
制作 rhel7:v3镜像
[root@server1 docker]# docker build -t rhel7:v3 .
docker images 查看镜像大小变化
使用最精简的镜像
[root@server1 docker]# docker run -it --rm rhel7:v3 bash
准备base-debian10.tar
[root@server1 docker]# ls
base-debian10.tar Dockerfile dvd.repo index.html nginx-1.20.1.tar.gz rhel7.tar
编写脚本 Dockerfile
准备 文件 base-debian10.tar
指定文件生成镜像 脚本编写要用
[root@server1 ~]# ls
base-debian10.tar busybox.tar docker game2048.tar harbor-offline-installer-v1.10.1.tgz mario.tar
[root@server1 ~]# docker load -i base-debian10.tar
de1602ca36c9: Loading layer [==================================================>] 3.041MB/3.041MB
1d3b68b6972f: Loading layer [==================================================>] 17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.io/distroless/base-debian10 latest d48fcdd54946 51 years ago 19.2MB
[root@server1 docker]# cat Dockerfile
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
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 /usr/sbin/nginx-debug /opt && \
cp -a --parents /lib/x86_64-linux-gnu/ld-* /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* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /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-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]
倒数第四行FROM 修改为你刚刚创建的镜像的 REPOSITORY 名称
执行完成 docker images 查看rhel7 4类型的大小