马哥博客作业第十周

1.通过dockerfile 制作centos系统镜像然后再制作 nginx编译镜像
一、制作centos系统镜像
1.编写Dockerfile文件
#cd /data/dockerfile/system/centos/centos7
#vim Dockerfile
FROM centos:centos7.8.2003
LABEL maintainer="sky <root@magedu.com>"
RUN rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum -y install wget && rm -rf /etc/yum.repos.d/* \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion \
net-tools wget bzip2 lsof zip unzip nfs-utils gcc make gcc-c++ glibc \
glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel \
&& rm -rf /var/cache/yum/* \
&& useradd -u 88 www
2.生成centos系统镜像
#vim bulid.sh
#!/bin/bash
TAG=$1
docker build -t centos7:$TAG .
docker images
#./build.sh v2.0
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 v2.0 df80f2e1ddcf 12 minutes ago 399MB
#docker history centos7:v2.0
IMAGE CREATED CREATED BY SIZE COMMENT
df80f2e1ddcf 14 minutes ago /bin/sh -c rm -f /etc/localtime && ln -s ../… 196MB
4ca83db447d0 16 minutes ago /bin/sh -c #(nop) LABEL maintainer=sky <roo… 0B
afb6fca791e0 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:72b194edf3abedf51… 203MB
二、制作nginx镜像
1.在Dockerfile文件目录下准备编译安装的相关文件
#cd /data/dockerfile/web/nginx/nginx-1.18 && wget http://nginx.org/download/nginx-1.18.0.tar.gz && tar xf nginx-1.18.0.tar.gz
#vim nginx-1.18.0/conf/nginx.conf
user www;
root /data/html;
#echo "nginx website based on dockerfile" > index.html
2.编写Dockerfile文件
#vim Dockerfile
FROM centos7:v2.0
LABEL maintainer="sky <root@magedu.com>"
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* \
&& ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
COPY nginx.conf /apps/nginx/conf/
COPY index.html /data/html/
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
3.生成 nginx 镜像
#vim build.sh
#!/bin/bash
TAG=$1
docker build -t nginx-1.18-centos7:$TAG .
docker images
#./build.sh v1.0
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-1.18-centos7 v1.0 dee66ea00791 2 minutes ago 422MB
4.生成容器测试镜像
#docker run -P -d --name n1 nginx-1.18-centos7:v1.0
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
661d4ad89b19 nginx-1.18-centos7:v1.0 "nginx -g 'daemon of…" 4 seconds ago Up 2 seconds 0.0.0.0:32776->80/tcp, 0.0.0.0:32775->443/tcp n1
#docker port n1
443/tcp -> 0.0.0.0:32775
80/tcp -> 0.0.0.0:32776
#curl 10.0.0.204:32776
nginx website based on dockerfile
#docker exec -it n1 bash
[root@661d4ad89b19 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 20580 2448 ? Ss 00:05 0:00 nginx: master process nginx -g daemon off;
www 6 0.0 0.1 21016 2280 ? S 00:05 0:00 nginx: worker process
root 7 0.5 0.1 12336 3588 pts/0 Ss 00:14 0:00 bash
root 30 0.0 0.1 51768 3424 pts/0 R+ 00:15 0:00 ps aux

2.写出10个常用的dockerfile脚本参数及使用说明
1.FROM:指定基础镜像,此指令必需放在Dockerfile文件第一个非注释行。
FROM scratch #所有镜像的起源镜像
FROM centos:centos7.8.2003

2.LABEL:指定镜像元数据,如镜像作者等
LABEL maintainer="sky <root@magedu.com>" version="1.0"

3.RUN:用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令
1>. shell格式,支持环境变量
RUN <命令>
RUN rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2>. exec格式,不支持环境变量,注意:是双引号,不能是单引号
RUN ["可执行文件", "参数1", "参数2"]
RUN ["/bin/bash","-c","echo hello wang"]

4.ENV:设置环境变量。会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持
1>.ENV <key> <value> 此格式只能对一个key赋值
ENV Myname sky
2>.ENV <key1>=<value1> <key2>=<value2> ... 此格式可以支持多个key赋值,定义多个变量建议使用,减少镜像层
ENV VERSION="1.0" DATE="2020-08-03"
RUN mkdir /data && touch /data/test${DATE}_${VERSION}.log

5.COPY:复制文本。一般用于将在宿主机上事先准备的配置文件(建议和Dockerfile文件同目录下)复制到镜像中
COPY [--chown=<user>:<group>] <src>... <dest>
COPY Centos-7.repo /etc/yum.repos.d/

6.ADD:复制和解包文件。增强版的COPY,不仅支持COPY,还支持解压缩
ADD [--chown=<user>:<group>] <src>... <dest>
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /data (不会解压缩)
ADD nginx-1.18.0.tar.gz /usr/local/src

7.CMD:容器启动命令,一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运
行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.
1>.使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]
CMD ["nginx", "-g", "daemon off;"]
2>.在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2
CMD nginx -g daemon off;
3>.提供给 ENTRYPOINT 命令的默认参数;
CMD ["param1","param2"]

8.ENTRYPOINT:功能类似于CMD,配置容器启动后默认执行的命令及参数
使用 exec 执行
ENTRYPOINT ["executable", "param1", "param2"]
1.ENTRYPOINT ["nginx", "-g", "daemon off;"]

Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数
2.ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
3.利用脚本实现指定环境变量动态生成配置文件
ENTRYPOINT [ "/bin/entrypoint.sh"]
cat entrypoint.sh
#!/bin/sh
cat > /etc/nginx/conf.d/www.conf <<EOF
server {
  server name ${HOSTNAME};
  listen ${IP:-0.0.0.0}:${PORT:-80};
  root  ${DOC_ROOT:-/usr/share/nginx/html};
}
EOF
exec "$@"

9.EXPOSE:指定服务端的容器需要对外暴露的端口,EXPOSE 仅仅是声明容器打算使用什么端口,并不会真正暴露端口,可以通过docker run -P 进行真正暴露。
即使Dockerfile没有EXPOSE端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口。
EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ..]
EXPOSE 80 443
EXPOSE 11211/udp 11211/tcp

10.WORKDIR:指定工作目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录,当容器运行后,进入容器内的默认目录。
WORKDIR /apps/nginx
RUN cd /data/html
RUN touch test.html(最终会在/apps/nginx下创建)

3.请写出dockerfile的分层原理
第一层:官方下载的基础系统镜像(CentOS和Ubuntu等)
第二层:定制版的基础镜像(安装常用命令创建常用账号等)
第三层:程序镜像(安装常用软件Nginx、PHP、Tomcat等)
第四层:业务镜像(用户代码程序文件)

posted @ 2020-08-04 12:53  小小小小石头  阅读(219)  评论(0编辑  收藏  举报