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
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(复制文件)
复制文件到镜像指定目录 格式:
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
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基础、需要一些练习。好的,各位晚安。
|