Dockerfile创建镜像

本文介绍了Dockerfile的基础知识,包括其结构和常用指令,如FROM, MAINTAINER, RUN, CMD, ENTRYPOINT等,并详细讲解了ADD与COPY的区别以及ENTRYPOINT与CMD的优先级。通过示例演示了如何使用Dockerfile搭建nginx镜像,最后通过运行新镜像并验证来确保镜像构建成功。" 136363869,14586329,微信小程序数据加解密与安全防护实践,"['微信小程序', '安全', '加密算法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Dockerfile

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

Dockerfile结构大概分为四个部分

  • 基础镜像信息
  • 维护者纳西
  • 镜像操作指令
  • 容器启动时执行指令

扩展:

1,实现多条命令可以使用:封号“;”(封号不管前一条命令是否运行成功)或者使用&&(&&会在前一条命令运行成功之后才运行下一条命令)
2,容器删除重启之后,里面的数据也会消失;可以使用容器持久化,做数据卷,将容器挂载到宿主机上。

3,数据库一般单独运行,并不会放在容器中。

4,容器数据分层中,只要有一层镜像变了,上面的其他镜像都会改变。
5,镜像层是不可变的。
复制代码

Dockerfile常用指令

FROM + 镜像

指定新镜像所基于的基础镜像,第一条指令必须为from指令,没创建一个镜像就需要一条from指令
复制代码

MAINTAINER + 名字

说明新建镜像的维护人信息
复制代码

RUN + 命令

镜像构建的时候被需要运行的命令
复制代码

ENPRYPOINT ["运行的程序","参数1","参数2"]

设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
复制代码

CMD ["要运行的程序", "参数1", "参数2"]

用于指定默认的容器主进程的启动命令的(就是开启容器时候,就运行指定的命令)

exec形式:
CMD ["要运行的程序", "参数1", "参数2"] 
shell形式:
CMD 命令 参数1 参数2

启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
复制代码

EXPOSE + 端口号

指定新镜像加载到 Docker 时要开启的端口
复制代码

AGE

EVN + 环境变量 + 变量值

ENV的级别最高,以ENV的值为最终值

设置一个环境变量,让后面是RUN使用
例:
linxu PATH=$PATH:/opt
  ENV PATH $PATH:/opt
复制代码

ADD + 源文件/目录 + 目标文件/目录

与cp一样具有复制特性,但是不同于cp
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
注意事项:
1,源路径是个文件,并且目标路径以/结尾,目标路径才会被docker当成目录,将源文件拷贝到目标目录下;
2,如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件
3,如果源文件是个目录,目标路径不存在,docker会以目标路径自动创建一个目录,把源路径目录下的文件拷贝进来;
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下
4,如果源文件是个归档文件(压缩文件),则docker会自动帮解压。	
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。
复制代码

COPY + 源文件/目录 + 目标文件/目录

只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中
复制代码

**VOLUME + [“目录”] **

在容器中创建一个挂载点
复制代码

USER + 用户名/UID

指定运行容器时的用户
复制代码

WORKDIR + 路径

为后续的 RUN、CMD、ENTRYPOINT 指定工作目录
复制代码

ONBUILD + 命令

指定所生成的镜像作为一个基础镜像时所要运行的命令
(将生成的镜像作为一个基础镜像生成新的镜像时使用)
复制代码

HEALTHCHECK

健康检查
复制代码

ADD与copy的区别

两者都可以复制本地目录或文件到镜像中

注意:URL与解压特性不能一起使用(表示通过URL在线下载的安装包,在dockerfile中不会自动解压)

ADDcopy
支持URL在线下载ADD不支持URL
支持本地tar包解压不支持
copy还支持配合--from=选项实现多阶段构建

ENTRYPOINT与CMD的区别

安装容器启动时执行命令的优先级:

docker run --entrypoint > entrypoint [...] > docker run 镜像 ... > cmd [...]
#当默认没有其他指定启动命令时候,默认使用cmd
复制代码

当entrypoint与cmd一起出现在dockerfile里面时

1,entrypoint优先级大于cmd
2,cmd的所有命令都是在为entrypoint提供参数(服务)
复制代码

Dockerfile搭建镜像的步骤

  • 先用FROM指令指定基础镜像
  • 再用MAINTAINER指定维护人信息
  • 然后再用RUN,EXPOSE,ADD,USER,WORKDIR等指令编写构建镜像的过程
  • 最后使用CMD或ENTPYPOINT指令指定启动容器的命令

Dockerfile示例

构建nginx镜像

老样子关闭防火墙与增强功能

systemctl stop filewalld
setenforce 0
复制代码

建立工作目录

[root@localhost ~]# mkdir /opt/nginx
[root@localhost ~]# cd /opt/nginx/

下载需要的安装包到创建的目录下
复制代码

编辑Dockerfile

注意:Dockerfile的指令一定要大写(不然会报错),并且编辑的Dockerfile首字母也要大写

[root@localhost nginx]# vim Dockerfile
编写内容
FROM centos:7
#设置基于centos:7为基础镜像去创建nginx镜像
MAINTAINER Helloween <zly>
#设置维护人信息
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#添加环境依赖包
RUN useradd -M -s /sbin/nologin nginx
#创建用户,不允许登陆系统
ADD nginx-1.12.2.tar.gz /opt/
#上传nginx软件压缩包(这边会自动解压;目标目录最后一定要带上/)
WORKDIR /opt/nginx-1.12.2
#指定运行的工作目录
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
#运行检测环境
ENV PATH /usr/local/nginx/sbin:SPATH
#设置环境变量
EXPOSE 80
EXPOSE 443
#指定http和HTTPS的端口
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#将关闭守护进程重定向到nginx.conf配置文件的末尾处运行(镜像需要前台运行)
ADD run.sh /run.sh
#将宿主机里面的run.sh添加到容器run.sh里面
RUN chmod 755 /run.sh
#给容器里面的run.sh权限
CMD ["/run.sh"]
#指定容器开启时候就运行/run.sh

扩展:
最后一行也可以修改为
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"
#表示前台运行nginx,这样就不需要在编辑一个run.sh的运行脚本了

[root@localhost nginx]# vim Dockerfile
FROM centos:7
MAINTAINER helloween <zly>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /opt/
WORKDIR /opt/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
EXPOSE 80
EXPOSE 443
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
复制代码

编辑运行脚本run.sh

[root@localhost nginx]# vim run.sh
编写内容
#!/bin/bash
/usr/local/nginx/sbin/nginx
#表示运行脚本时候,开启nginx
复制代码

创建并运行新镜像

[root@localhost nginx]# docker build -t nginx:centos.
#末尾有个“.”不能忘记,表示在当前目录

[root@localhost nginx]# docker run -d -P nginx:centos
#运行并且随机分配端口映射
[root@localhost nginx]# docker ps -a
复制代码

验证

访问http://192.168.42.17:32769 验证是否成功,后面的端口号,是docker ps -a可以查看到的

作者:夏威夷果陆胖胖
链接:https://juejin.cn/post/7194628361501540412
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值