DockerFile
初识DockerFile
DockerFile就是用来构建docker镜像的构建文件,命令脚本。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本的每个命令都是一层。
小例子:
- dockerfile1
1 | FROM centos |
docker build -f dockerfile1 -t yio/centos:1.0 .(-t 后不能以 “/” 开头)根据fockerfile创建容器镜像

运行容器,查看容器的文件目录

查看挂载目录的数据卷信息
docker inspect [docker id]
查看同步信息:
cd /var/lib/docker/volumes/873e4aad2ecc323526142d2a491d9ed51a0d762f6094cae5643469369c545ae7/_data
倘若使用DockerFile构建镜像时没有挂载卷,要手动挂载卷
-v 卷名:容器内路径
数据卷容器
例如多个MySQL同步数据
容器中的数据在容器删除后就会消失,$\textcolor{yellow}{所以需要持久化到本地}$。此时,我们可以使用-v来实现数据挂载到本地目录:
-v :[容器内路径]来实现匿名挂载-v [name]:[容器内路径]来实现具名挂载

小例子:
启动一个docker01

启动docker02
docker run -it --name docker02 --volumes-from docker01 66b
在docker01中的volume01目录中创建数据,查看同步结果


删除docker01文件仍然存在,类似于备份机制。都挂载在宿主机的同一个目录下。
结论:
数据卷容器的生命周期一直持续到没有容器使用为止。一旦持久化到了本地,本地数据就是不会删除的了。
DockerFile
是用来构建docker镜像的文件,命令参数脚本。
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像 (DocekrHub、阿里云镜像仓库)
例如:

看一眼Centos的DockerFile

DockerFile小知识
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行顺序按照从上到下
#表示注释- 每一指令都会创建提交一个新的镜像层,并提交
DockerFile 是面向开发的,也就是说我们以后发布项目做镜像,就需要编写dockerfile文件,这个文件十分简单!
tips:
- DockerFile:构建文件,定义了一切步骤,源代码文件
- DockerImages:通过DockerFile构建生成的镜像,是最终发布和运行的产品
- Docker容器:容器就是镜像运行起来的服务器
DockerFile的指令
FROM |
基础镜像,一切从这里开始构建 |
|---|---|
MAINTAINER |
镜像的作者:姓名+邮箱 |
RUN |
镜像构建时需要运行的命令 |
CMD |
设置容器的启动命令 CMD /bin/bash 一个CMD执行多个只有最后一个会生效,可被替代。可以写多个CMD命令 |
COPY |
COPY <源路径>… <目标路径>,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等 |
ADD |
复制文件到镜像中,ADD 指令和 COPY 的格式和性质基本一致。但是ADD的<源路径>可以是一个 URL,下载到<目标路径>去。 |
WORKDIR |
WORKDIR /path/to/workdir镜像的工作目录 |
VOLUME |
挂载的目录 |
ENTRYPOINT |
指定这个容器在启动时要运行的命令 可以追加命令。用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序 |
ONBUILD |
ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src用于设置镜像触发器。当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发 |
EXPOSE |
暴露端口 |
ARG |
ARG <name>[=<default value>]用于指定传递给构建运行时的变量 |
STOPSIGNAL |
用于设置停止容器所要发送的系统调用信号,必须是内核系统调用表中的合法的值 |
SHELL |
用于设置执行命令(shell式)所使用的的默认 shell 类型,SHELL在Windows环境下比较有用,Windows 下通常会有 cmd 和 powershell 两种 shell,可能还会有 sh。这时就可以通过 SHELL 来指定所使用的 shell 类型 |
LABEL |
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"用于为镜像添加元数据,以键值对的形式指定。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。 |
USER |
USER user:group用于指定运行镜像所使用的用户。使用USER指定用户时,可以使用用户名、UID 或 GID,或是两者的组合(使用 : 间隔) |
ENV |
K V orK=V 形式。这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。 |
CMD和ENTRYPOINT的区别
CMD的命令会被docker run的命令覆盖而ENTRYPOINT不会,且ENTRYPOINT可以追加命令
CMD指令的目的是:为容器提供默认的执行命令。CMD指令有三种使用方式,其中的一种是为ENTRYPOINT提供默认的参数:
CMD ["param1","param2"]写在ENTRYPOINT下面,将作为参数添加到ENTRYPOINT []中
另外两种使用方式分别是exec模式和shell模式:CMD ["executable","param1","param2"]// 这是 exec 模式的写法,注意需要使用双引号。CMD command param1 param2// 这是 shell 模式的写法。
注意命令行参数可以覆盖CMD指令的设置,但是只能是重写,却不能给CMD中的命令通过命令行传递参数。
ENTRYPOINT指令的目的也是为容器指定默认执行的任务。ENTRYPOINT指令有两种使用方式,就是我们前面介绍的exec模式和shell模式:
ENTRYPOINT ["executable", "param1", "param2"]// 这是 exec 模式的写法,注意需要使用双引号。ENTRYPOINT command param1 param2// 这是 shell 模式的写法。会完全忽略命令行参数exec模式和shell模式的基本用法和CMD指令是一样的,下面我们介绍一些比较特殊的用法。指定
ENTRYPOINT指令为exec模式时,docker run命令行上指定的参数会作为参数添加到ENTRYPOINT指定命令的参数列表中。```dockerfile
#1.如果dockerfile如下
FROM centos
CMD [“ls”,”-a”]
#2.构建
docker build -f dockerfile -t cmdtest
#3.run运行 发现 CMD命令运行正常
docker run cmdtest
#4.想追加命令 运行失败 -l 替换了 dockerfile中的CMD命令
docker run cmdtest -l
#5.新dockerfile
FROM centos
ENTRYPOINT [ “ls”, “-a” ]
CMD [“-l”]
#构建后运行
docker run cmdtest
#运行成功 最后执行的是 ls -a -l 命令
docker run cmdtest -S
#运行成功 最后执行的是 ls -a -S 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
### 实战测试
Docker Hub中99%的镜像都是从这个基础镜像过来的: `FROM scratch`,然后再配置需要的软件和配置来进行构建。
创建一个自己的Centos
- DockerFile
```dockerfile
#mydockerfile
FROM centos:7
MAINTAINER yio<3226314806@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80,3310
CMD echo $MYPATH
CMD echo "===end==="
CMD /bin/bash
通过这个文件构建镜像
docker build -f mydockerfile -t mycentos:0.1 .
docker run -it mycentos:0.1

看一眼官方的mysql是怎么做的

Dockerfile制作tomcat镜像
1 | # Dockerfile |
发布自己的镜像
DockerHub
在服务器上登录docker
docker login -u 用户名 -p登录之后就可以提交了
先使用
docker tag 原镜像名:1.0 用户名/镜像名:1.0将镜像名修改成标准的名字然后使用
docker push 用户名/镜像名:1.0提交
Docker图

