1、什么是镜像?
docker镜像是一个特殊的文件系统,能够提供容器运行时所需的资源。如果接触过dockerfile的同学应该知道,
我们构建镜像时都会选择一个基础镜像(没接触过别担心下面会讲),这说明docker镜像是一层层进行构建的,
一个镜像往往由多层文件系统组成。
2、镜像的生成
1)、commit提交容器生成镜像
1、先运行一个容器
docker run -d --name vm1 nginx
2、基于容器提交镜像
docker commit vm1 nginx:v1 生成nginx:v1镜像,基于nginx,运行时需要nginx里边的东西
3、查看新生成的镜像
docker images
4、docker history 镜像 查看镜像构建历史
5、保存镜像为.tar文件,方便迁移
docker save -o 镜像 镜像.tar 镜像打包
6、删除镜像
docker rmi nginx 删除镜像
2)、dockerfile生成镜像,RUN指令也是基于容器的提交,每执行一次RUN指令,commit一次

nginx封装
mkdir /tmp/docker
cd /tmp/docker
vim dockerfile
FROM rhel7 as build 依赖于rhel7镜像,其一个别名叫build
COPY rhel7.3.repo /etc/yum.repos.d/ 将当前目录下的yum源拷贝到容器的/etc/yum.repos.d
ADD nginx-1.16.0.tar.gz /mnt 将nginx压缩包解压到容器里边的/mnt
EXPOSE 80 开放80端口
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && sed -i
's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr
/local/nginx && make && make install 编译指令,生成一层镜像
二阶构建,可以丢掉前边的不用的东西,而且gcr.io/distroless/base小与rhel7,构建的镜像更小
FROM gcr.io/distroless/base
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:v1 . .代表当前目录,不可或缺
运行镜像
docker run -d --name vm1 -p 80:80 nginx:v1
镜像比之前小了很多

nginx封装优化,根据官方最新的nignx来优化
cd /tmp/docker
vim dockerfile
FROM nginx:1.16.0 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 /usr/sbin/nginx-debug /opt && \
#ldd /usr/sbin/httpd 查看二进制程序运行所需要的动态库
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 443 80,443都可以访问
ENTRYPOINT ["nginx", "-g", "daemon off;"]
构建镜像
docker build -t nginx:v2 .
运行镜像
docker run -d --name vm2 --p 443:443 nginx:v2
3、镜像的加速
docker pull nginx报错
Using default tag: latest
tee /etc/docker/daemon.json <<- 'EOF'
{
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
解决方法:
搭建加速器(阿里云加速)
vim /etc/docker/daemon.json
"registry-mirrors":["https://加速器地址"]
systemctl daemon-reload
systemctl systemctl restart docker
本文介绍了Docker镜像的基本概念,详细阐述了如何通过commit容器和使用Dockerfile来生成镜像,特别是探讨了Nginx镜像的封装及其优化,以实现更小的镜像体积。此外,还提到了镜像加速的方法。
249

被折叠的 条评论
为什么被折叠?



