1、什么是 Dockerfile?
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile之后,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦。
2、Dockerfile文件格式
Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。
一开始必须要指明所基于的基础镜像名称,接下来一般会说明维护者信息,后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。
# 1、第一行必须指定 基础镜像信息# 定制的镜像都是基于 FROM 的镜像,这里的ubuntu 就是定制需要的基础镜像。# 后续的操作都是基于 nginx。# FROM <image>:<tag>FROM ubuntu# 2、维护者信息MAINTAINER docker_user docker_user@email.com# 3、镜像操作指令# RUN:用于执行后面跟着的命令行命令。 有以下俩种格式:# shell 格式:RUN <命令行命令># exec 格式:RUN ["可执行文件", "参数1", "参数2"]# 例如:RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offlineRUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.listRUN apt-get update && apt-get install -y nginxRUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf# 4、容器启动执行指令CMD /usr/sbin/nginx
注意: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
3、构建Docker镜像
docker build 命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,所以构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。
# 构建镜像,将当前目录做为构建上下文
docker build .
# Dockerfile 一般位于构建上下文的根目录下, 也可以通过-f指定该文件的位置
# 还可以通过-t参数指定构建成镜像的仓库、标签
docker build -f /path/to/Dockerfile -t nginx:v1 .
什么是上下文路径?
上下文路径是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
4、制作简单的docker file
1、准备一个nginx的基础镜像。
docker pull library/nginx
在镜像列表中会看到我们从远程仓库中获取的nginx镜像。
docker images | grep nginx
2、准备好了基础镜像,编写Dockerfile
以定制 nginx 镜像为例,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile
cd home // 进入home目录
mkdir mydocker // 新建mydocker文件夹
cd mydocker //进入mydocker文件夹
touch Dockerfile // 新建Dockerfile文件.自定义命名
使用vim编辑Dockerfile
vim Dockerfile //编辑dockerfile文件
将内容粘贴进去:
FROM nginx
RUN echo '<h1>hello, docker!</h1>' > /usr/share/nginx/html/index.html
:wq! // 最后强制保存
这个 Dockerfile 一共就两行涉及到了两条指令:FROM 和 RUN,FROM 表示获取指定基础镜像,RUN 执行命令,在执行的过程中重写了 nginx 的默认页面信息,将信息替换为:Hello, Docker!。
3、用Dockerfile 来构建镜像
在 Dockerfile 文件所在目录执行:
docker build -f Dockerfile -t nginx:v1 . // 构建nginx镜像,并且版本为v1
构建完成之后,使用 docker images 命令查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功。
docker images // 列出所有的镜像
docker images | grep nginx // 过滤,只展示nginx的镜像
4、接下来使用 docker run 命令来启动容器
docker run --name docker_nginx_v1 -itd -p 80:80 nginx:v1
// 生成一个叫做docker_nginx_v1的容器,宿主机、容器内映射80
这条命令会用 nginx 镜像启动一个容器,命名为docker_nginx_v1,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器
5、访问这个 nginx 服务器
curl 127.0.0.1
返回如下信息:
hello, docker!
,则表示成功。6、查看运行的容器docker_nginx_v1
docker ps | grep docker_nginx_v1
7、查看容器日志
docker ps -a // 查看所有的容器
docker logs -f -t cca70324cf62
// cca70324cf62可以替换为自己的容器id
8、进入容器内
docker exec -i -t docker_nginx_v1 /bin/bash
9、根据容器ID删除容器
docker ps -a //查看所有的容器,和历史运行过的容器
docker rm -f e3811b67f691 // 强制删除容器
10、根据镜像ID删除镜像
docker ps -a // 查看所有的容器,和历史运行过的容器
docker rmi 43757978f723 // 删除镜像id
5、课外读物
docker运维派:http://www.yunweipai.com/34859.html
