docker之dockerfile指令学习

Docker之Dockerfile

docker安装启动成功,只是docker学习的第一步。
下面我们要学习一个新的功能,那就是dockerfile。



前言

随着docker的学习,我们发现,虽然已经有了很多成熟的基础镜像,但是在我们的工作和学习中,为了更方便,更便捷的使用docker镜像,我们需要定制化构建镜像,dockerfile就是来帮助我们构建镜像的。


一、Dockerfile是什么?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
简单来说,就是用来构建镜像的一系列操作指令和注释的组合。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

二、Dockerfile怎么使用?

1.初出茅庐第一试

创建一个简单的Dockerfile文件,构建镜像,并且启动。

1.1 检查docker运行状态

systemctl status docker

展示如下,则表示docker启动
在这里插入图片描述

1.2 准备工作

在目录下/opt/docker目录下新建test.txt文件,输入:Hello Dockerfile!
同时,创建文件Dockerfile。不需要改名字。

# 基础镜像
FROM nginx
# 作者信息
MAINTAINER 11949@qq.com
# 添加文件
ADD test.java /opt/
# 执行
CMD '------------end----------------'

1.3 构建镜像

执行构建镜像命令,如果为了验证可以删除本地所有镜像和容器

docker build -t nginx01:1.1 .

关于此处的.,后面会讲
在这里插入图片描述

1.4 启动镜像

执行启动镜像的命令

docker run -itd nginx01:1.1

在这里插入图片描述
进去镜像中查看是否将test.txt文件上传到指定目录

docker exec -it -d d5d961660990 

在这里插入图片描述

2. 学习Dockerfile中的指令

放张图慢慢学
在这里插入图片描述

2.1 Dockerfile文件编写规则

  • 指令忽略大小写,建议使用大写
  • 每一行只支持一条指令,每条指令可以携带多个参数

2.2 FROM (指定基础镜像)

FROM必须是第一条非注释指令,它指定基础镜像且指定的镜像是已存在的。

FROM image		# 指定镜像
FROM image:tag	# 指定镜像和版本

2.3 MAINTAINER(标注作者信息)

格式:

MAINTAINER author email

实例:

MAINTAINER king 111222333@qq.com

2.4 RUN (执行命令或脚本)

RUN可以运行任何被基础脚本支持的命令
RUN支持两种格式命令:
shell格式:

# shell格式
#  <命令行命令> 等同于,在终端操作的 shell 命令。
RUN <命令行命令>

exec格式:

# exec格式 
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
RUN ["可执行文件", "参数1", "参数2"]

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大

例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

2.5 ADD(复制文件)

复制文件到镜像指定目录
格式:

# 添加 源文件(本地相对路径或wget或curl获取) 目标位置(绝对路径)
ADD src dest
ADD tomcat.tar.xz /opt/tomcat/tomcat1.8

ADD和COPY的共同点是,都能复制文件到构建的镜像中,但是ADD包含tar文件的解压功能,但是COPY只能单纯的复制文件。

2.6 WORKDIR(切换目录)

等同于命令行的cd 目录,一定要使用绝对路径,如果使用相对路径,则路径会传递下去。
格式:

WORKDIR 目录

实例:

WORKDIR /home/docker

2.7 VOLUME(数据卷)

我们知道,处理docker容器中的数据是比较麻烦的,所以我们可以将容器内数据挂载到宿主机,VOLUME就是帮我们在构建镜像阶段即挂载目录的指令。
格式:

VOLUME <目录1> <目录2> ...

示例:

VOLUME /usr/local/nging/conf/nginx.conf

使用匿名挂载的方式将文件或目录挂载到宿主机,防止因为容器停止或删除而导致的数据丢失,同时避免容器变大。

容器在宿主机的默认挂载目录:/var/lib/docker/volumes

2.8 EXPOSE(暴露端口)

声明要与暴露的端口,或者说,声明要与宿主机做映射的端口,但仅仅是声明,在镜像构建完成,启动一个容器的时候,需要指定宿主机端口,如果是expose单个端口,可以不指定容器端口。
格式:

expose port1 [port2...]

示例:

# 映射单个端口
expose 80
# 映射多个端口
expose 8080 3306

为了更明白的解释清楚,什么叫做构建镜像时指定容器端口,启动容器时指定宿主机端口,请看下面代码

# 随机使用宿主机的某个端口与构建镜像时暴露的端口做映射,那么我们就不再关心容器内具体端口,我们可以通过宿主机进行访问
docker run -itd --name centos-tomcat -P 9625 centos 

# 写一个 多端口映射 假设dockerfile文件中暴露端口为8080 8090
docker run -itd --name centos-tomcat -p 8081:8080 -p 8090:8091 centos

2.9 ENV (环境配置)

环境变量配置,比如JAVA_HOME,会被后续的RUN指令使用。在容器启动时生效。
格式:

# 单个环境变量
ENV <key> <value>
# 多个环境变量
ENV <key1> <value1> <key2> <value2>

示例:

ENV JAVA_HOME /usr/local/java/jdk1.8

2.10 CMD(指定启动容器启动时执行的指令)

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

格式:

CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数

示例:

CMD ["/bin/echo", "this is a echo test"]

总结

主要写了一些关于Dockerfile指令的使用情况,具体的复杂的定制化镜像没有写,后续的话会补上来。其实吧,不是很难,但是需要一些linux基础、需要一些练习。好的,各位晚安。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值