马哥作业第十周


1.通过dockerfile 制作centos系统镜像然后再制作 nginx编译镜像
vim Dockerfile
FROM centos:centos7.8.2003
ENV author="zhangzexu <1185673631@qq.com>"
LABEL maintainer=${author} version="v1.0"
RUN rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak &&
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &&
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &&
# 或者可也用COPY 把本地已经配置好的yum院cp到镜像里 也可也用ADD 去官网下载
yum -y install wget vim net-tools iproute psmisc lsof tcpdump tree &&
#下载一些基础包,可根据生产环境选择下载
rm -rf /var/cache/yum/* && useradd -u 88 -r -s /sbin/nologin www
#作为基础镜像创建www用户为后期web服务运行使用

docker build -t centos7.8:v1 .

wget http://nginx.org/download/nginx-1.18.0.tar.gz #先在本机下载好包

vim Dockerfile
FROM centos7.8:v1
LABEL maintainer="zhangzexu"
ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel &&
rm -rf /var/cache/yum/* && cd /usr/local/src/nginx-1.18.0 &&
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module
--with-http_realip_module --with-http_sub_module && make && make install && mkdir -p /data/web &&
echo "The is nginx in docker ,base centos7.8:v1" > /data/web/index.html &&
sed -ri 's@#(user )nobody@1www@' /usr/local/nginx/conf/nginx.conf &&
sed -ri 's@(worker_processes )1@1auto@' /usr/local/nginx/conf/nginx.conf &&
sed -ri 's@#(error_log logs/error.log )info@1warn@' /usr/local/nginx/conf/nginx.conf &&
sed -ri '21,25s@#@@' /usr/local/nginx/conf/nginx.conf &&
sed -ri '44s@html@/data/web@' /usr/local/nginx/conf/nginx.conf &&
sed -ri '3a daemon off;' /usr/local/nginx/conf/nginx.conf
EXPOSE 80
CMD /usr/local/nginx/sbin/nginx

docker build -t centos7.8:nginx1 .
docker run -itd --name nginx1 centos7.8:nginx1
docker inspect nginx1 查看一下容器IP
[root@ubuntu1804 /data/dockerfile]$ curl 172.17.0.2 获取一下页面 看看是否能够访问到
The is nginx in docker ,base centos7.8:v1

进到容器里 ps aux  ,显示www正在运行nginx

2.写出10个常用的dockerfile 脚本参数及使用说明
(1)FROM指令用于初始化一个新的镜像构建阶段,同时为之后的指令设置一个基础镜像。 因此,有效的Dockerfile必须以FROM指令开头。
FROM <image>:<tag>
具体示例如下:
FROM ubuntu:18.04
(2)MAINTAINER指令用于指定当前构建的镜像维护者信息,该指令没有具体的格式要求,通常建议使用用户名和邮箱进行标识。具体示例如下:
MAINTAINER "zhang"<zhang@163.com>
(3) RUN指令用于执行指定的脚本命令,有两种格式。语法格式如下:
RUN <common>
RUN ["executable", "param1", "param2"]
其中每条RUN指令将在当前镜像基础上执行指定命令并提交为新的镜像。如果要执行多条RUN指令,通常会将多条RUN指令合成一条,并使用斜杠“” 来换行,这样将减少所构建的镜像的体积。
(4)CMD指令用于指定启动容器时执行的命令,该指令有三种格式。语法格式如下:
CMD ["executable", "param1", "param2"] #使用exec执行,也是推荐方式;
CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用;
CMD ["param1", "param2"] #提供给ENTRYPOINT的默认参数;
注意:在使用CMD指令时,每个Dockerfile只能有一条CMD指令,如果有多条CMD指令,则只有最后一条生效。如果用户启动容器时指定了运行的指令,则会覆盖掉CMD指定的指令。
(5).EXPOSE
EXPOSE指令用于声明容器内部暴露的端口号,供容器访问连接使用。语法格式如下:
EXPOSE <port> [<port>...]
(6)ENV指令用于为下文设定一个环境变量,该变量值在后续指令或内联文件中都可以使用,ENV指令有两种语法格式。语法格式如下:
ENV <key> <value>
ENV ,key>=<value> <key>=<value>
(7)ADD指令用于复制指定的src资源文件到容器中的dest目录下,复制的资源可以是文件、目录及远程URLs资源。语法格式如下:
ADD <src>... <dest>
在使用ADD指令时,复制的src资源文件必须是当前上下文目录或其子目录,而复制的内容实际上是该目录下的所有内容,其中包括文件系统元数据,而目录本身不会被复制。当dest目录不存在时,会在复制文件时自动创建。需注意的是,当使用ADD指令复制的文件是一个压缩包时,ADD指令会在复制好该文件后,自动进行解压。
在使用ADD指令时,复制的src资源文件路径允许使用通配符,而dest目标目录可以使用绝对路径,也可以使用预先用WORKDIR指令定义的相对路径。
(8)COPY指令的作用与ADD指令类似,都是复制指定的src资源文件到容器中的dest目录下。区别在于,COPY指令不能复制远程URL路径文件,也不能解压文件,而ADD指令则可以。语法格式如下:
COPY <src>... <dest>
(9)ENTRYPOINT指令是配置容器启动后执行的命令,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT指令时,只有最后一个生效,该指令有两种语法格式。语法格式如下:
ENTRYPOINT ["executable", "param1", "param2"] #exec格式,推荐的
ENTRYPOINT command param1 param2 #shell格式
(10)WORKDIR指令用于为后续的指令(如RUN,CMD,ENTRYPOINT,COPY,ADD)指定工作目录,在同一个Dockerfile文件中可以多次使用WORKDIR指令。语法格式如下:
WORKDIR /path/to/workdir


3.请写出dockerfile的分层原理
Dockerfile通常会指定基础镜像,基础镜像可以认为是系统层,复制文件、执行命令、添加等操作时会生成新的镜像层,每层只记录本层(每一条指令操作就是一层)所做的更改,而这些层都是只读的,做好镜像,启动容器时,Docker 会在最顶部添加读写层,用户在容器内做的所有更改,如增加、修改、删除文件等,都是工作在读写层内,一般称该层为容器层。

原文地址:https://www.cnblogs.com/tz66/p/13433135.html