一 dockerfile
1.dockerfile介绍
Dockerfile是一种能够被Docker程序解释的脚本,
Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令
当需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,
然后通过docker build生成我们自定义的容器镜像。
为什么使用dockefile
简单来说就是从网上下载下来的镜像可能不满足我们实际生产的需要,这时我们就可以利用dockerfile来自己构建一个新的镜像,并且在自动化部署的时候也需要用到dockerfile来创建新的镜像来满足需求。
详细解释
1.声明式语法:Dockerfile使用声明式语法描述镜像的构建过程,而不是编写脚本或命令。
2.层次化结构:Dockerfile的指令按照顺序逐步执行,每个指令都会在前一个指令的基础上创建一个新的镜像层,这种分层结构使得镜像的构建和重用更为高效。
3.可读性:Dockerfile采用人类可读的文本格式,易于理解和维护,使得团队协作和版本控制更加便捷。
4.自动构建:通过Dockerfile,可以实现自动化构建过程,从而简化了软件开发、测试和部署的流程。
5.缓存机制:Docker在构建镜像时会利用缓存,如果某个指令的内容未发生改变,则可以直接使用之前构建好的镜像层,从而提高构建速度。
6.可重用性:Dockerfile定义了镜像的构建步骤,可以被多个项目和团队共享和重复使用,提高了开发效率。
7.轻量级:Dockerfile定义的镜像通常是轻量级的,只包含了应用程序及其运行时所需的依赖,因此具有较小的镜像体积,有助于加速镜像的传输和部署。
dockerfile指令
(1) 构建类指令:
用于构建image
其指定的操作不会运行在image的容器上执行
如:FROM、MAINTAINER、RUN、ENV、ADD、COPY
(2) 设置类指令:
用于设置image的属性
其指定的操作将运行image的容器中执行
如:CMD、ENTRYPOINT、USER、EXPOSE、WORKDIR、VOLUME
对应的指令说明如下:
FROM 构建新镜像基于的基础镜像
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ADD 拷贝文件或目录到镜像中,可以解压压缩包并拷贝
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户(程序用户)
EXPOSE 声明容器运行的服务端口(容器内打开的端口)
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录(同cd)
CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效
ENTRYPOINT 与CMD类似,容器运行时强制执行
指令详细解释
当编写Dockerfile时,常用的命令有以下几种:
FROM:
用途:指定基础镜像,当前镜像是基于哪个镜像构建的。
语法:FROM [:] [AS ]
示例:FROM ubuntu:20.04
RUN:
用途:在镜像中执行命令,通常用于安装软件包、更新系统、设置环境等。
语法:RUN
示例:RUN apt-get update && apt-get install -y curl
COPY:
用途:将文件从主机复制到镜像中。
语法:COPY
示例:COPY ./app /app
ADD:
用途:类似于COPY,但功能更强大,支持从URL下载文件、解压缩等功能。
语法:ADD
示例:ADD https://example.com/file.tar.gz /
ENV:
用途:设置环境变量,可以在后续的命令中使用。
语法:ENV
示例:ENV NODE_ENV production
USER:
用途:设置运行时的用户身份。
语法:USER [:]
示例:USER appuser
EXPOSE:
用途:声明容器运行时监听的端口,但并不会实际打开或映射该端口。
语法:EXPOSE
示例:EXPOSE 8080
WORKDIR:
用途:设置工作目录,后续的命令都将在这个目录下执行。
语法:WORKDIR
示例:WORKDIR /app
CMD:
用途:设置容器启动时要执行的默认命令,可以被docker run命令中的参数覆盖。
语法:CMD ["executable","param1","param2"] 或 CMD command param1 param2
示例:CMD ["npm", "start"]
ENTRYPOINT:
用途:设置容器启动时要执行的默认命令,与CMD不同的是,ENTRYPOINT指定的命令不会被docker run命令中的参数覆盖,而是作为参数传递给ENTRYPOINT。
语法:ENTRYPOINT ["executable","param1","param2"] 或 ENTRYPOINT command param1 param2
示例:ENTRYPOINT ["echo", "Hello, World!"]
应用(利用centos7镜像通过dockerfile创建一个nginx镜像)
实验环境
centos7.9
已安装docker-ce-20.10.20
防火墙,沙盒关闭,开启路由转发
主机名 vm1
ip 192.168.10.11
实验步骤
第一步:下载基础镜像
第二步:创建一个文件夹(目录)
第三步:在文件夹(目录)中创建Dockerfile文件及其它文件
第四步:使用docker build命令构建镜像
第五步:使用构建的镜像启动容器
1.下载基础镜像
由于dockerfile需要利用基础镜像来构建,所以我们需要先下载基础镜像
docker pull centos:7
2.创建一个目录
mkdir /nginxdir
cd /nginxdir/
3.在目录种创建Dockerfile文件及其他文件
先创建nginx测试文件
echo "nginx is running" >> /nginxdir/index.html
再创建dockerfile文件
vim Dockerfile
FROM centos:7
MAINTAINER "123" #维护者信息
RUN yum -y install wget #下载wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下载阿里云仓库文件
RUN yum -y install nginx #下载nginx
ADD index.html /usr/share/nginx/html/ #将indexhtml传到容器内
RUN echo "daemon off;" >> /etc/nginx/nginx.conf #关闭nginx守护进程模式
EXPOSE 80
CMD /usr/sbin/nginx #运行容器时,保持前台运行nginx
4.生成镜像:
格式:docker build -t 新镜像名:标签 .
docker build -t nginx:v1 .
报错解决
原因
没有开启路由转发
开启路由转发就好了
echo "net.ipv4.ip_forward=1 " >> /etc/sysctl.conf
sysctl -p
查看镜像
docker images
可以看到创建好的镜像
5.使用构建的镜像启动容器
docker run -d -p 80:80 nginx:v1
curl查看
curl 192.168.10.11
实验完成