DockerFile
文章目录
概述
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
示例
shell
# FROM:定制的镜像都是基于 FROM 的镜像
FROM ubuntu
# 镜像作者itcast 邮箱itcast@itcast.cn
MAINTAINER itcast itcast@itcast.cn
#切换目录到根目录下的test目录;如果目录存在就切换,如果不存在就创建
workdir /test
# RUN:用于执行后面跟着的命令行命令。
RUN apt-get update
RUN apt-get install -y gcc
ENTRYPOINT ["gcc"]
执行
shell
#my_gcc 是自己构建的镜像名称
docker build -t my_gcc .
workdir
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录 才会一直存在。
shell
WORKDIR <工作目录路径>
dockerfile
shell
from ubuntu:latest
maintainer deng deng@itcast.cn
workdir /a
run touch a.txt
workdir b
run touch 2.txt
构建生成镜像
shell
#mytest:v1.0 是自己构建的镜像名称 最后面的 . 是构建的意思
docker build -t mytest:v1.0 .
查看构建的镜像
shell
docker images
执行并进入构建的镜像
shell
docker run -it mytest:v1.0 /bin/bash
run
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell
# RUN命令的格式
shell格式
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec格式
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
copy
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
shell
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
#参数描述
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的
filepath.Match 规则。
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
示例:
COPY hom* /mydir/
COPY hom?.txt /mydir/
Dockerfile
shell
from ubuntu:latest
maintainer deng deng@itcast.cn
#拷贝当前文件hello.txt 到镜像的/data/ 目录下
copy hello.txt /data/
add
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如 下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下, 会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会 令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
Dockerfile
shell
from ubuntu:latest
maintainer deng deng@itcast.cn
add test.tar.gz /data/
cmd命令
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可 被 docker run 命令行参数中指定要运行的程序所覆盖
**注意:**如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
shell
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格 式运行,并且默认可执行文件是 sh。
entrypoint
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会 被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序
**优点:**在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数
**注意:**如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
shell
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参, 以下示例会提到。
shell
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
不传参运行
shell
$ docker run nginx:test
#容器内会默认运行以下命令,启动主进程。
#nginx -c /etc/nginx/nginx.conf
传参运行
shell
$ docker run nginx:test -c /etc/nginx/new.conf
#容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
#nginx -c /etc/nginx/new.conf
expose
声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
shell
EXPOSE <端口1> [<端口2>...]
容器中运行程序
第一种方式:
Dockerfile
shell
from ubuntu:latest
maintainer deng deng@itcast.cn
copy myecho /
expose 55555 #这里的断开必须指定myecho程序中的端口
#启动容器的时候执行myecho 必须使用相对路径
cmd ./myecho
shell
#构建
docker build -t mytest:v1.4 .
#执行
docker run mytest:v1.4
查看IP和测试
shell
docker inspect crazy_chatelet
第二种方式:
Dockerfile
shell
from ubuntu:latest
maintainer deng deng@itcast.cn
copy myecho /
expose 55555
#启动容器的时候执行myecho
entrypoint ./myecho
shell
#构建
docker build -t mytest:v1.5 .
#执行 -P 随机端口
docker run -P mytest:v1.5
附录
docker官网:http://www.docker.com
Docker windows入门:https://docs.docker.com/windows/
Docker Linux 入门:https://docs.docker.com/linux/
Docker mac 入门:https://docs.docker.com/mac/
Docker 用户指引:https://docs.docker.com/engine/userguide/
Docker 官方博客:http://blog.docker.com/
Docker Hub: https://hub.docker.com/
Docker开源:https://www.docker.com/open-source
Docker中文资源
Docker中文网站: http://www.docker.org.cn
Docker入门教程: http://www.docker.org.cn/book/docker.html
Docker安装手册:http://www.docker.org.cn/book/install.html
一小时Docker教程 :https://blog.csphere.cn/archives/22
Docker纸质书:http://www.docker.org.cn/dockershuji.html
DockerPPT:http://www.docker.org.cn/dockerppt.html