马哥博客作业第十周
1.通过dockerfile 制作centos系统镜像然后再制作 nginx编译镜像
1)、先制作基于基础镜像的centos系统镜像
下载基础镜像:docker pull centos:centos7.8.2003
制作Dockerfile文件:vim Dockerfile
FROM centos:centos7.8.2003
LABEL maintainer="wujianfu <root@www.com>"
RUN yum -y install wget && rm -rf /etc/yum.repos.d/* && wget -O /etc/yum.repos.d/CentOS-Base.repo \
https://mirrors.aliyun.com/repo/Centos-7.repo && wget -O /etc/yum.repos.d/epel.repo \
http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum -y install vim-enhanced tcpdump lrzsz bash-completion tree telnet net-tools lsof iproute psmisc bzip2 nfs-utils \
&& rm -rf /var/cache/yum/* && rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
构建生成新的系统镜像:docker build -t centos7.8:v1.0 .
2)、制作nginx编译镜像
在Dockerfile目录下准备编译安装的相关文件:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
编辑nginx配置文件,修改下面内容:vim nginx.conf
user nginx;
daemon off;
修改nginx主页面内容:
echo "Nginx-1.18.0 In Docker" > index.html
制作Dockerfile文件:vim Dockerfile
FROM centos7.8:v1.0
LABEL maintainer="wujianfu <root@www.com>"
RUN yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel && useradd -r -s /sbin/nologin nginx \
&& yum clean all &&
ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx && make && make install \
&& rm -rf /usr/local/src/nginx*
ADD nginx.cfg /apps/nginx/conf/
COPY index.html /apps/nginx/html/
RUN ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
EXPOSE 80 443
CMD ["nginx"]
构建生成nginx镜像:docker build -t nginx1.18-centos7.8:v1.0 .
2.写出10个常用的dockerfile 脚本参数及使用说明
FROM:指定基础镜像,此指令必须放在Dockerfile文件第一个非注释行,后续的指令都是运行于此基础镜像提供的运行环境。
LABEL:指定镜像元数据,如维护者信息、镜像作者等。
RUN:指定在构建镜像阶段需要执行FROM指向基础镜像所支持的shell命令,有两种格式:shell格式和exec格式。
COPY:复制文本,一般用于在宿主机上将事先准备的配置文件复制到镜像中。
ADD:复制和解包文件,可以是Dockerfile所在目录的相对路径,或URL,或tar文件。通过URL下载的文件权限默认600,且获取的tar文件不会自动解压缩。
ENV:定义环境变量 ,可被后续指令(如ADD, COPY, RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持。
VOLUME:在容器中创建一个可以从宿主机或其他容器挂载的挂载点,一般用来存放数据,即使删除容器,宿主机的目录仍会保留,从而实现数据持久保存。
CMD:用来指定启动容器时默认执行的命令,每个Dockerfile只能有一条CMD命令,如果有多条,只有最后一条执行。
WORKDIR:指定工作目录,为后续的指令配置工作目录,当容器运行后,进入容器内的默认工作目录。
EXPOSE:指定容器需要对外监听的端口号,实现容器与外部通信。
USER:指定运行容器时的用户名,后续的RUN也会使用指定用户。当服务不需要管理员权限时,可以通过该指令指定运行用户。
3.请写出dockerfile的分层原理
1)、每一行以Dockerfile的指令开头,指令不区分大小写,惯例使用大写
2)、使用#作为注释
3)、每一行只支持一条指令,每条指令可以携带多个参数
4)、指令按文件的顺序从上至下执行
5)、每个指令的执行都会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条
6)、每次执行Dockerfile都按顺序从头开始执行,已经执行过的指令已经缓存,不需再执行,为加速镜像制作,将最常变化的指令放在Dockerfile的后面