1.dockerfile介绍
我们知道,docker容器启动的时候在最上层挂载了一个可写层,比如说我在容器里面创建一个文件,这个文件是存放在可写层的,这时候容器要是销毁了,那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了,我们要是想要保存我们对容器的一些写入操作的话,可以使用commit命令然后将容器制作成一个镜像,这样下次run起来该镜像的时候,我们之前的写入操作就还存在了。除了使用commit方式制作镜像,还有一种方式就是编写dockerfile 然后使用build命令来制作镜像了。
dockerfile是我们构建docker镜像的源码,可以理解成我们的脚本,然后docker可以使用dockerfile里面的指令来自动化构建镜像,其实dockerfile就像是一个组织镜像的清单,来告诉docker 引擎我这一步干啥,然后下一步干啥。
2.dockerfile的规则
2.1 格式
#是注释
指令建议要大写,内容小写。这样更能区分
2.2 执行顺序
docker是按照dockerfile指令顺序依次执行的,也就是说从上到下。
2.3 其他
每一个dockerfile的第一行都是非注释性的,也就是说第一行不能是注释,必须是from指令,来指定基础镜像,后面的指令都以基础镜像为运行环境。如果构建过程中本地没有指定镜像文件,就会去远端仓库拉。
3. 指令
3.1 from
这个from指令是dockerfile的第一个指令,然后指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的。
from image
from image:tag
from image@digest
3.2 maintainer
该指令是描述的维护者信息
maintainer username
3.3 user
user 指令指明docker里面主进程,也就是pid是1的那个进程是用什么用户跑的,可以在容器终端中whoami来测试
user linux用户
3.4 workdir
workdir 是指下面的指令都在workdir 指定目录下面工作,这个与linux 里面的cd 差不多
workdir 目录
演示:
1.dockerfile:
from nginx
workdir /usr/share/nginx
2.build:
docker build . -t docker.io/library/nginx:v1.19.0_workdir
这里. 指的是构建当前目录下的dockerfile ,然后-t 就是打tag
3.运行容器:
docker run -it --rm 27bd30f69d34 /bin/bash
就可以进入容器看到默认是在worddir目录下面了。
3.5 add
add指令是用来将宿主机某个文件或目录放到(复制)容器某个目录下面。
add 宿主句文件 容器文件
演示:
1.准备:
下载index.html
wget www.baidu.com -o index.html
2.dockerfile:
from nginx
add index.html /usr/share/nginx/html/index.html
expose 80
3.build:
docker build . -t docker.io/library/nginx:v1.19.0_add
4.启动容器验证:
docker run --rm -d --name nginx_add -p80:80 fe12a2f7ccef
这里使用了-p 指定宿主机端口映射容器端口,可以使用-p 来随机宿主机端口
浏览器验证:
3.6 copy
copy 指令类似add 指令,但是add指令范围更广些,add能够自动解压文件,能够访问网络资源,而copy指令做不到。
3.7 expose
expose 指令用于暴露容器里的端口,我们在3.5里面演示过了,nginx暴露的端口是80,但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。需要暴露多个端口的话可以使用多个expose,也可以一个expose指令后面跟多个端口,端口之间用空格隔开。
expose 端口
3.8 env
env指令是用于设置环境变量的
env key=value
env key value
演示:
1.dockerfile:
from nginx
env t_opt=nginx_c
2.build:
docker build . -t docker.io/library/nginx:v1.19.0_env
3.启动容器:
docker run --rm --name nginx_env 731c7b670c20 printenv
我们可以看到,我们设置环境的变量就打印出来了。
3.9 run
run指令用于在容器中执行命令。我们常用来安装基础软件。
run 需要执行命令
演示:
1.dockerfile:
from centos:centos7
run yum install net-tools.x86_64 -y
2.build
docker build . -t docker.io/library/centos:7_net-tool
3.启动容器
docker run -it 998e648663b1 /bin/bash
默认centos7镜像里面是没有net-tools这个工具的,我们使用run yum install 指令给安装上了。
3.10 cmd
cmd 指令是你在容器启动的时候帮你运行的命令,而run 这个指令是构建镜像的时候帮你运行的命令。
cmd ["命令","参数"]
演示:
1.dockerfile:
from centos:centos7
run yum install httpd -y
cmd ["httpd","-d","foreground"]
2.build
docker build . -t docker.io/library/centos:7_httpd
3.启动容器验证:
docker run --rm -d --name httpd -p80:80 3da609352ae5
浏览器验证:
3.11 entrypoint
我们每一个docker镜像其实都有一个默认的启动命令,我启动这个容器如果不指定命令,它会默认执行根路径下面的entrypoint.sh这个脚本
entrypoint 脚本
nginx镜像演示
1.dockerfile
from centos:centos7
add entrypoint.sh /entrypoint.sh
run yum install epel-release -q -y && yum install nginx -y
entrypoint /entrypoint.sh
2.编辑entrypoint.sh
#!/bin/bash
/sbin/nginx -g "daemon off;"
3.给entrypoint 脚本执行权限
chmod x entrypoint.sh
4.build
docker build . -t docker.io/library/centos:nginx_
5.运行容器
docker run -d --rm --name c_nginx -p80:80 d10dacbcb9f9
浏览器访问: