马哥博客作业第十周
1.通过dockerfile 制作centos系统镜像,然后再制作 nginx编译镜像
FROM centos:centos8.2.2004
LABEL maintainer="NGINX Docker Maintainers <jinlei@163.com>"
ENV NGINX_VERSION=1.19.1.tar.gz
RUN yum -y install wget epel-release-latest-8.noarch.rpm
rm -rf /etc/yum.repos.d/* && \
wget -P /etc/yum.repos.d/https://mirrors.aliyun.com/repo/Centos-8.repo && \
useradd -r -s /sbin/nologin nginx && \
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel && \
cd /usr/local/src && \
wget http://nginx.org/download/${NGINX_VERSION} && \
tar xf ${NGINX_VERSION} && \
cd nginx-1.19.1
./configure --prefix=//apps/nginx && \
make && make install && rm -rf nginx* && rm -rf /var/cache/yum/*
USER nginx
CMD [ "nginx","-g","daemon off" ]
2.写出10个常用的dockerfile 脚本参数及使用说明
1.FROM 指定基础镜像
语法:FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
该指令必须放在Dockerfile文件的第一个非注释行,后续的指令都是运行于此基准镜像所提供的运行环境
默认docker build会先在docker主机上查找指定的镜像,如果不存在则通过Docker Hub Registry拉取镜像
2.LABEL 指定镜像元数据(如镜像作者等)
语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
一个镜像可以有多个label,可以写在一行中,减少镜像的大小
3.COPY 复制宿主机的内容到容器中
语法:COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
可以是多个,可以使用通配符,通配符规则满足Go的filepath.Match规则
必须是build上下文中的路径,不能是其父目录中的文件
如果src是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
如果src指定了多个,或在src中使用了通配符,则dest必须是一个目录,且必须以/结尾
COPY的src会保留元数据
dest如果事先不存在,将会被自动创建,包括其父目录
4.ADD 增强版COPY,不仅支持COPY还支持解压缩
语法:ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
比COPY增强的地方:
src可以是一个URL,但URL如果指定的是一个压缩文件,则不会解压
URL下载后的文件权限自动设置为600
5.ENV 设置环境变量
语法:ENV <key> <value>
ENV <key>=<value> ...
ENV可以定义环境变量和值,会被后续指令进行引用,并在容器运行时保持
6.EXPOSE 暴露端口
语法:EXPOSE <port> [<port>/<protocol>...]
指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信
EXPOSE不会直接暴露端口,在容器启动时要通过P或者p才会真正的暴露端口
7.USER 指定当前用户
语法:USER <user>[:<group>]
指定运行容器时的用户名或UID,后续的RUN也会使用指定的用户
这个用户必须时视线先建立好的,否则无法切换
8.VOLUME 数据卷
语法:VOLUME ["/data"]
VOLUME指令指定的容器目录。即使容器后期删除,此宿主机的目录仍会被保留,从而实现容器数据的持久保存。
9.WORKDIR 指定工作目录
语法:WORKDIR /path/to/workdir
为后续的RUN、CMD、ENTRYPOINT指定配置工作目录
当容器运行后,进入容器内的默认目录
10.STOPSIGNAL 退出容器的信号
语法:STOPSIGNAL signal
该STOPSIGNAL指令设置将被发送到容器退出的系统调用信号。
该信号可以与内核syscall表中的位置匹配的有效无符号数字,也可以时SIGNAME格式的信号名称
11.CMD 容器启动命令
语法:CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
CMD用来指定启动容器时默认执行的一个命令
如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么启动容器就会执行CMD
每个Dockfile仅最后一条CMD生效
如果启动容器用docker run xxx指定运行的命令,则会覆盖CMD指令
12.ENTRYPOINT 入口点 功能类似于CMD,配置容器启动后默认执行的命令及参数
语法:ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ENTRYPOINT不能被docker run提供的参数覆盖,而是追加,即如果docker run命令有参数,那么
参数全部都会作为ENTRYPOINT的参数
如果docker run后面没有参数,但是Dockerfile中的CMD里有,则CMD的全部内容会作为ENTRYPOINT的参数
如果docker run后面有参数,Dockerfile中的CMD里也有,则CMD的参数会被docker run后面的参数覆盖
每个Dockerfile中仅有最后一个ENTRYPOINT会生效
13.RUN 执行shell命令
语法:RUN <command>
RUN ["executable", "param1", "param2"]
RUN指令用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令
RUN可以写多个,但是每个RUN都会建立一个镜像层,所以尽可能合并到一条指令,减少镜像层
3.请写出dockerfile的分层原理
按业务类型层次化管理镜像
上层可以共享同一下层的资源

浙公网安备 33010602011771号