docker容器之镜像生成与封装

本文介绍了Docker镜像的基本概念,详细阐述了如何通过commit容器和使用Dockerfile来生成镜像,特别是探讨了Nginx镜像的封装及其优化,以实现更小的镜像体积。此外,还提到了镜像加速的方法。

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

 

 

 

 

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值