乐趣区

关于docker:系统学习DockerDockerFile解析

1.DockerFile 是什么

2.DockerFile 构建过程解析

3.DockerFile 罕用保留字指令

4.DockerFile 自定义 CentOS 镜像

5.DockerFile 自定义微服务镜像

1.DockerFile 是什么

假如咱们想 自定义 一个 Docker 镜像,基于 Centos7 镜像具备 vim+ifconfig+jdk8,依照咱们以前的学习的步骤,咱们须要 先下载镜像 ,而后 运行容器 ,再以 进入容器进行 vim+ifconfig+jdk8 的装置,再把这个容器打包成新的镜像,这样操作十分繁琐,咱们有没有更简略的形式来操作这一系列的步骤呢?此时就引出了咱们的DockerFile

DockerFile是用来 构建 Docker 镜像的文本文件 ,是 由一条条构建镜像所需的指令和参数形成的脚本。

应用 DockerFile 的 3 步骤:
1) 编写 DockerFile 文件。
2)docker build 命令形成镜像。
3)docker run 依镜像运行容器实例

2.DockerFile 构建过程解析
咱们先来看看一个简略的 DockerFile 文件:

# 基于 centos
FROM centos
#镜像维护者的姓名和邮箱地址
MAINTAINER slf<xxx@qq.com>
#设置名为 MYPATH 的变量
ENV MYPATH /usr/local
#指定在创立容器后,终端默认登陆的进来工作目录
WORKDIR $MYPATH

以上案例中,基于 centos 镜像,对镜像进行了一系列操作,咱们能够得出 Dockerfile 内容基础知识为:
1)每条保留指令必须都为大写字母 且前面必须要跟至多一个参数
2) 指令从上到下,程序执行
3)# 示意正文
4) 每条指令都会创立一个新的镜像并对容器进行提交

由此能够得出,Docker 执行 DockerFile 的大抵 流程为:
1)docker 从根底镜像中抉择一个当做容器
2) 执行一条条指令对容器进行批改
3) 执行相似 docker commit 的操作提交一个新的镜像层
4)docker 再基于刚提交的镜像运行一个新容器
5) 执行 dockerfile 中的下一条指令直到所有指令都执行实现

最初咱们得出如下 论断

咱们从软件的角度来看,DockerfileDocker 镜像 Docker 容器 别离代表一个软件的 三个不同的阶段

  • Dockerfile 是软件的一系列 原材料
  • Docker 镜像是软件的 交付品
  • Docker 容器则是软件镜像的 运行态

Dockerfile 面向开发,Docker 镜像成为交付规范,Docker 容器则波及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。

最初再总结一下这三个概念:

1)Dockerfile,Dockerfile 定义了应用程序所须要的所有货色,包含执行的代码,文件,环境,依赖,操作系统版本等等。

2)Docker 镜像,在用 Dockerfile 定义一个文件之后,docker build 时会产生一个 Docker 镜像,当运行 Docker 镜像时会真正开始提供服务;

3)Docker 容器,间接提供服务

3.DockerFile 罕用保留字指令

FROM根底镜像,以后新镜像是基于哪个镜像,指定那个镜像作为模板,第一条必须是 FROM

MAINTAINER镜像保护的作者

RUN容器构建时要运行的命令(在 docker build 时运行)

它有 两种格局

shell 格局

RUN yum -y install vim

exec 格局

EXPOSE:容器往外裸露的接口

WORKDIR:用来指定创立容器后,终端默认登录进来的工作目录。

USER:指定该镜像应用什么样的用户执行,默认 root

ENV:设置变量,如:

ENV MY_PATH /usr/mytest
这个 环境变量能够在后续的任何 RUN 指令中应用,这就如同在命令后面指定了环境变量前缀一样,也能够在其它指令中间接应用这些环境变量。

比方:WORKDIR $MY_PATH

ADD将宿主机目录下的文件拷贝到镜像外面,且会主动解决 URL 和解压 tar 压缩包。

COPY相似 ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 < 源门路 > 的文件 / 目录复制到新的一层的镜像内的 < 指标门路 > 地位。

COPY src dest

VOLUME:容器数据卷,用于数据保留和长久化工作。

VOLUME 指令只是起到了申明了容器中的目录作为匿名卷,然而并没有将匿名卷绑定到宿主机指定目录的性能。

CMD:指容器启动后干的事件。

Dockerfile 中能够有多个 CMD 指令,但只有最初一个失效,CMD 会被 docker run 之后的参数替换。

CMD 和 run 的区别:

CMD 是在 docker run 时运行。

RUN 是在 docker build 时运行。

ENTRYPOINT:也是用来 指定一个容器启动时要运行的命令,但有几点要留神:

这条明令 相似于 CMD 命令 ,然而 ENTRYPOINT 不会被 docker run 前面的命令笼罩,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

举例:
ENTRYPOINT [“java”,”-jar”,”DockerDemo.jar”] 运行 jar 包。

长处:在执行 docker run 的时候能够指定 ENTRYPOINT 运行所需参数。

留神:如果 Dockerfile 中存在多个 ENTRYPOINT 指令,仅最初一个失效。

4.DockerFile 自定义 CentOS 镜像

咱们搭建一个 Centos7 镜像,具备vim+ifconfig+jdk8

咱们先去下载一个 java8 的 Linux 安装包:

https://mirrors.yangxingzhen….

复制到和 Dockerfile 一个目录上面:

筹备编写 Dockerfile 文件:

FROM centos:7
MAINTAINER slf
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#装置 vim 编辑器
RUN yum -y install vim
#装置 ifconfig 命令查看网络 IP
RUN yum -y install net-tools
#装置 java8 及 lib 库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径 jar, 把 jdk-8u171-linux-x64.tar.gz 增加到容器中, 安装包必须要和 Dockerfile 文件在同一地位
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

执行命令:

docker build -t centosjava8:1.5 .

留神 : 下面 TAG 前面有个空格,有个点

执行命令:

进入这个容器,查看是否装置胜利:

5.DockerFile 自定义微服务镜像

咱们应用 idea 打包一个 springBoot 我的项目进去,而后把这个微服务丢到 Docker 外面运行:

yml:

server:
  port: 6001

controller:

@RestController
public class TestController {@Value("${server.port}")
    private String port;

    @RequestMapping("/docker")
    public String helloDocker()
    {return "hello docker"+"\t"+port+"\t"+ UUID.randomUUID().toString();}

    @RequestMapping(value ="/index",method = RequestMethod.GET)
    public String index()
    {return "服务端口号:"+"\t"+port+"\t"+UUID.randomUUID().toString();}

}

打包:

拷贝到和 DockerFile 一个目录下:

Dockerfile:

# 根底镜像应用 java
FROM williamyeh/java8
# 作者
MAINTAINER slf
# VOLUME 指定长期文件目录为 /tmp,在主机 /var/lib/docker 目录下创立了一个临时文件并链接到容器的 /tmp
VOLUME /tmp
# 将 jar 包增加到容器中并更名为 DockerDemo.jar
ADD DockerDemo-0.0.1-SNAPSHOT.jar DockerDemo.jar
# 运行 jar 包
RUN bash -c 'touch /DockerDemo.jar'
ENTRYPOINT ["java","-jar","DockerDemo.jar"]
#裸露 6001 端口作为微服务
EXPOSE 6001
 

启动构建命令:

docker build -t slf_docker:1.6 .

运行镜像:

docker run -d -p 6001:6001 slf_docker:1.6

拜访测试:

退出移动版