镜像分层结构
1.共享宿主机的kernel
2.base镜像提供的是最小的linux发行版
3.同一docker主机支持运行多种linux发行版
4.采用分层结构的最大好处是:共享资源
比如当你已经拉取nginx 1.17版本的镜像之后,若再次拉取nginx 1.16 版本时,只需要下载不同的层即可,相同的层可以共享使用,这样就可以节省资源和网络带宽。
当你删除其中某个镜像版本时,也只会删除掉不一样的层,因为其中共享的层另一个版本需要使用。
镜像的构建
运行容器+修改容器+将容器保存为新的镜像
缺点:
- 效率低、可重复性弱、容易出错
- 使用者无法对镜像进行审计,存在安全隐患

交互式运行此镜像
-it交互式

删除
docker rm -f 删除正在运行的镜像

运行
新建三个文件

docker ps -a 显示已经停掉的镜像
封装镜像
把刚才创建的三个文件封装到v1,如果只退出docker,不会被删

多加了一层,目前所在的操作都在demo里,而不是busybox

–rm 退出时,自动删除,回收


之前的只封装在最上面一层,删除时也只删除了一层
rmi 是删除镜像

dockfile
和之前的commit是一一对应的



定制一个首页,放进目录路径里

后面的.代表,从各处寻找文件,建立
会找到之前创建的dockerfile


missing代表在官方构建的,而不是本机执行


相对路径,不能把文件放在根底下,最好创建一个空的文件夹比如/docker


换一个centos镜像




如果直接ctrl+d就会删除,ctrl+q+p之后,就会暂时保存。attach又会恢复


dockerfile常用命令
from
- 指定base镜像
- 如果本地不存在会从远程仓库下载
maintainer
- 设置镜像的作者
copy
- 把文件从build context复制到镜像
- 支持两种形式:copy src dest 和 copy [“src”, “dest”]
add
- 用法与copy类似,不同的是src可以是归档压缩文件,文件会被自动解压到
- dest,也可以自动下载url并拷贝到镜像:
add html.tar /var/www add http://ip/html.tar /var/www
env
- 设置环境变量,变量可以被后续的指令使用:
env hostname sevrer1.example.com
expose
- 如果容器中运行应用服务,可以把服务端口 暴露出去:
- expose 80
volume
- 申明数据卷,通常指定的是应用的数据挂在点:
volume [“/var/www/html”]
workdir
- 为run、cmd、entrypoint、add和copy指令设置镜像中的当
- 前工作目录,如果目录不存在会自动创建。
卷


在宿主机自动创建目录,挂载在容器内



删除之后还在,卷的目的就是持久化
在centos7中创建




shell和exec的区别



cmd可以被覆盖
做一个完整的nginx封装
from centos:7 add nginx-1.21.1.tar.gz /mnt run yum install -y gcc make pcre-devel openssl-devel workdir /mnt/nginx-1.21.1 run sed -i 's/cflags="$cflags -g"/#cflags="$cflags -g"/g' auto/cc/gcc run ./configure --with-http_ssl_module --with-http_stub_status_module run make run make install copy index.html /usr/local/nginx/html cmd ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]




镜像的优化

太大了,开始优化
减少镜像层
from centos:7 add nginx-1.21.1.tar.gz /mnt workdir /mnt/nginx-1.21.1 run yum install -y gcc make pcre-devel openssl-devel && sed -i 's/cflags="$cflags -g"/#cflags="$cflags -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && yum clean all && rm -rf /mnt/nginx-1.21.1 copy index.html /usr/local/nginx/html cmd ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]


报错
添加:net.ipv4.ip_forward=1



多阶段构建
from centos:7 as build add nginx-1.21.1.tar.gz /mnt workdir /mnt/nginx-1.21.1 run yum install -y gcc make pcre-devel openssl-devel && sed -i 's/cflags="$cflags -g"/#cflags="$cflags -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && yum clean all && rm -rf /mnt/nginx-1.21.1 from centos:7 copy --from=build /usr/local/nginx /usr/local/nginx copy index.html /usr/local/nginx/html cmd ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]



选择更加精简的基础镜像
from nginx:latest as base
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
cmd ["nginx", "-g", "daemon off;"]




总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论