Docker Dockerfile

Posted pzk7788

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Dockerfile相关的知识,希望对你有一定的参考价值。

一、什么是 Dockerfile

比如我想制作一个镜像,这个镜像安装了 lnmp 、redis 、elk 等各种软件,制作流程会是这样:

① 先下载一个基础镜像,如 centos
② 使用这个镜像启动成一个容器
③ 在容器中安装 lnmp 、redis 、elk 等各种软件
④ 最后再把容器制作成一个镜像

什么是 Dockerfile:Dockerfile 相当于一个命令集 ( 命令的集合 ) 文件,我们可以把上面的步骤都写到这个文件,然后执行这个文件就能生成一个镜像


二、Dockerfile 常用指令

FROM          # 指定基于哪个镜像,语法:FROM <image> 或 FROM <image>:<tag>,如 FROM centos:latest
MAINTAINER    # 指定Dockerfile文件的作者信息,语法:MAINTAINER <name> <mail>,如 MAINTAINER xiaoming [email protected]
RUN           # 指定要操作的命令,语法:RUN <command>,如 RUN yum install redis,如果命令有选项必须写成 RUN ["yum", "install", "-y", "redis"]
CMD           # 指定容器启动时要执行的命令,语法:CMD <command>,如 CMD yum install redis,如果命令有选项必须写成 CMD ["yum", "install", "-y", "redis"]
EXPOSE        # 指定容器要开放的端口,以便外部能访问,如 EXPOSE 22 80 443 表示开放 22 80 443 这三个端口,但必须结合 docker -p 80:80 这种形式来使用
ENV           # 用于定义环境变量,如 ENV PATH /usr/local/bin:$PATH,也可以自定义用户变量,如 EVN mysql_Version 5.6,定义的变量可以让 RUN 或 CMD 使用
ADD           # 用于拷贝宿主机的文件到容器的某个目录里,语法:ADD <src> <dest>,如 ADD 1.txt /data 表示拷贝宿主机的1.txt到容器的/data目录,<src>也可以是一个url
COPY          # 用法与ADD一致,不同的是,ADD可以使用url,COPY不能使用url
ENTRYPOINT    # 指定容器启动时要执行的命令,用法与CMD一致,不同的是,CMD的命令会被覆盖,比如 docker run -itd centos bash 去启动容器时,bash就是启动容器时执行的命令
              # 而如果我们写了 CMD echo 123 是不会执行的,因为被bash命令覆盖了,而我们使用ENTRYPOINT就不会被覆盖,而且会优先执行ENTRYPOINT指定的命令再执行bash命令
              # 另外一点,如果我们再Dockerfile文件中写了多条CMD指令,那么只有最后一条会执行,使用ENTRYPOINT则每一条都会执行
VOLUME        # 指定挂载目录,如 VOLUME ["/data"] 表示把宿主机的/data目录挂载到容器里,但不会指定挂载到容器里的哪个目录,需要使用 docker inspect 来查看,参考链接
USER          # 指定启动容器的用户,如 USER root 表示使用 root 用户来启动容器
WORKDIR       # 指定工作目录,对 RUN,CMD,ENTRYPOINT,COPY,ADD 生效,比如 WORKDIR /data,那么我执行 RUN echo 123 相当于执行 cd /data; echo 123


三、Dockerfile 实例:安装 nginx

 

 

 

 

    

以上是关于Docker Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

Docker 中Dockerfile的语法梳理

docker构建镜像

构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

如何从 dockerfile 启动 Docker Compose 并一起运行 curl

Docker火遍全球!dockerfile构建你必须得会

由于绑定挂载,Dockerfile 和 docker-compose 找不到节点模块