DockerFile制作编译版Nginx 1.16.1镜像
- DockerFile 可以说是一种被 Docker 程序解释的脚本,DockerFile 是由一条条的命令组成的,每条命令对应 linux 下面的一条命令,Docker 程序将这写 DockerFile 指令再翻译成真的 linux 命令,其有自己的书写方式和支持的命令,Docker 程序读取 DockerFile 并根据指令生成 Docker 镜像,相比手动制作镜像的方式,DockerFile 更能直观的展示镜像是怎么产生的,有了写好的各种各样的 DockerFile 文件,当后期某个镜像有额外的需求时,只要在之前的 DockerFile 添加或修改相应的操作即可重新生成新的 DockerFile 镜像,避免了重复手动制作镜像的麻烦,具体如下:
- 官方参考文档:https://docs.docker.com/engine/reference/builder/
- 以下变量中的指令列表支持环境变量Dockerfile:
- ADD #将宿主机中的文件添加到镜像当中
- COPY
- ENV #设置容器变量,常用于向容器内传递用户密码等
- EXPOSE #开放端口
- FROM
- LABEL
- STOPSIGNAL
- USER #指定该容器运行时的用户名和 UID,后续的 RUN 命令也会使用这里指定的用户执行
- VOLUME #设置容器挂载主机目录
- WORKDIR #指定工作目录
- RUN #执行shell命令
下载镜像并初始化系统
//从DockerFile构建一个镜像
//确认工作目录
root@bj-magedu-v-study-14:/opt# pwd
/opt
//创建DockerFile目录环境
root@bj-magedu-v-study-14:/opt# mkdir dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv
mkdir: created directory 'dockerfile'
mkdir: created directory 'dockerfile/web'
mkdir: created directory 'dockerfile/web/nginx'
mkdir: created directory 'dockerfile/web/tomcat'
mkdir: created directory 'dockerfile/web/jdk'
mkdir: created directory 'dockerfile/web/apache'
mkdir: created directory 'dockerfile/system'
mkdir: created directory 'dockerfile/system/centos'
mkdir: created directory 'dockerfile/system/ubuntu'
mkdir: created directory 'dockerfile/system/redhat'
//验证目录信息(目录结构按照业务类型或系统类型等方式划分,方便后期镜像比较多的时候进行分类。)
root@bj-magedu-v-study-14:/opt# tree /opt/dockerfile/
/opt/dockerfile/
├── system
│ ├── centos
│ ├── redhat
│ └── ubuntu
└── web
├── apache
├── jdk
├── nginx
└── tomcat
9 directories, 0 files
//进入指定的DockerFile目录
root@bj-magedu-v-study-14:/opt# cd ./dockerfile/web/nginx/
//确认工作目录
root@bj-magedu-v-study-14:/opt/dockerfile/web/nginx# pwd
/opt/dockerfile/web/nginx
编写DockerFile
1 #Compile install nginx 1.16.1 image
2 # '#'为注释,等于shell脚本中的'#'
3 # 除了注释行以外的第一行,必须以 From xxx(xxx 是官方基础镜像)
4
5 #第一行先定义基础镜像,后面的本地有效的镜像名,如果本地没有会从远程仓库下载,第一行很重要#
6 From centos:7.5.1804
7
8 #镜像维护者的信息#
9 MAINTAINER boekbi 952098151@qq.com
10
11 ###其他可选参数###
12 #指定该容器运行时的用户名和 UID,后续的 RUN 命令也会使用这里指定的用户执行#
13 #USER
14
15 #指定工作目录#
16 #WORKDIR /a #先定义
17 #WORKDIR b #再定义,则最终工作目录为/a/b
18
19 #设置容器挂载主机目录#
20 #VOLUME["/dir_1","/dir_2"...]
21
22 #设置容器变量,常用于向容器内传递用户密码等#
23 #ENV password 123456
24 ##################
25
26
27 ###执行的命令,将编译安装nginx的步骤执行一遍###
28 #配置epel源#
29 RUN yum -y install epel-release
30
31 #安装常用命令#
32 RUN yum -y install vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
33
34 ##下载nginx 1.16.1源码包#
35 ##RUN wget http://nginx.org/download/nginx-1.16.1.tar.gz
36 37 #添加nginx源码包到镜像中,自动解压打包文件#
38 ADD nginx-1.16.1.tar.gz /usr/local/src/
39
40 #RUN mkdir /usr/local/nginx
41
42 #编译安装#
43 RUN cd /usr/local/src/nginx-1.16.1/ && ./configure --prefix=/usr/local/nginx/ --with-http_sub_module && make && make install
44
45 #进入工作目录#
46 RUN cd /usr/local/nginx/
47
48 #添加nginx配置文件到镜像中#
49 #ADD nginx.conf /usr/local/nginx/conf/nginx.conf
50
51 #创建nginx用户#
52 RUN useradd nginx -s /sbin/nologin
53
54 #创建nginx软连接#
55 RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
56
57 RUN ["/bin/sh","-c","/usr/bin/ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx"]
58
59 #创建测试页面#
60 RUN echo 'This is Compile install nginx-1.16.1 image' > /usr/local/nginx/html/index.html
61 #ADD index.html /usr/local/nginx/html/
62
63 ##向外开放的端口,多个端口用空格做间隔,启动容器时候-p需要使用此端口向外映射,如: -p 8081:80,则 80 就是这里的 80#
64 EXPOSE 80 443
65
66 ##运行的命令,每个 Dockerfile 只能有一条,如果有多条则只有最后一条被执行#
67 CMD ["nginx","-g","daemon off"]
准备源码包与配置文件
//#使用其它服务器编译安装相同版本的 nginx 配置文件,而且配置文件中关闭 nginx 进程后台运行
root@bj-magedu-v-study-14:/opt/dockerfile/web/nginx# cp /usr/local/nginx/conf/nginx.conf .
//准备 nginx-1.61.1 的源码包
root@bj-magedu-v-study-14:/opt/dockerfile/web/nginx# cp /usr/local/src/nginx-1.16.1.tar.gz .
执行镜像构建
- docker build -t nginx:v1 .
构建完成
查看是否生成本地镜像
- docker images
从镜像启动容器
- docker run -d -it -p 80:80 --name nginx-v1 nginx:v1 /bin/bash
访问web界面
- 浏览器访问http://192.168.26.207/