1.通过dockerfile 制作centos系统镜像然后再制作 nginx编译镜像
一、制作CentOS系统镜像
1.编写Dockerfile文件
vim Dockerfile
FROM centos:centos7.8.2003
LABEL maintainer="dave <root@davidwang.com>"
RUN rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Australia/Sydney /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 18 minutes ago 399MB
docker history centos7:v2.0
IMAGE CREATED CREATED BY SIZE COMMENT
df80f2e1ddcf 20 minutes ago /bin/sh -c rm -f /etc/localtime && ln -s ../… 196MB
4ca83db447d0 24 minutes ago /bin/sh -c #(nop) LABEL maintainer=dave <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="dave <root@davidwang.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 3 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…" 5 seconds ago Up 3 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.91:32776
nginx website based on dockerfile
docker exec -it n1 bash
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 特殊镜像: 是所有镜像的起源镜像
2.LABEL:指定镜像元数据, 也就是镜像描述信息, 作者, 版本等...
维护者: LABEL maintainer="dave <root@davidwang.com>" version="1.0"
3.RUN:用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令
# shell格式,支持环境变量
RUN <命令>
RUN rm -f /etc/localtime && ln -s ../usr/share/zoneinfo/Australia/Sydney /etc/localtime
# exec格式,不支持环境变量,注意:是双引号,不能是单引号
RUN ["可执行文件", "参数1", "参数2"]
RUN ["/bin/bash","-c","echo hello david"]
4.ENV:设置环境变量。会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持
#ENV <key> <value> 此格式只能对一个key赋值
ENV author dave
#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:复制文本 一般用于将在宿主机上事先准备的配置文件复制到镜像中
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 指定的命令为持续运行且为前台命令.
#使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]
CMD ["nginx", "-g", "daemon off;"]
#在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2
CMD nginx -g daemon off;
#提供给 ENTRYPOINT 命令的默认参数;
CMD ["param1","param2"]
8.ENTRYPOINT:功能类似于CMD,配置容器启动后默认执行的命令及参数
9.EXPOSE:指定服务端的容器需要对外暴露的监听端口,EXPOSE 仅仅是声明容器打算使用什么端口,并不会真正暴露端口,可以通过docker run -P | -p 真正暴露。
即使Dockerfile没有EXPOSE端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口。
EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ..]
EXPOSE 80 443
10.WORKDIR:指定工作目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录,当容器运行后,进入容器内的默认目录。
WORKDIR /apps/nginx
RUN cd /data/html
RUN touch test.html
3.请写出dockerfile的分层原理
第一层: 构建的是官方下载的基础镜像, 比如CentOS或者Ubuntu, 在此基础上进行镜像定制
第二层: 按照需求在基础镜像上添加各种功能, 比如安装常用命令, 创建账号等
第三层: 用于构建应用镜像, 只有系统的镜像是没有生产力的, 需要安装相应程序才能提供服务
第四层: 构建适用的业务镜像, 也就是 添加业务代码等