Docker 入门教程 (二) dockerfile
# Dockerfile 简介
dockerfile 可以理解为一个制作镜像的脚本,但远没有脚本复杂。他根据某种格式自定义内容, 就可以快速创建出需求的镜像。
# Dockerfile 文件格式
Dockerfile文件格式如下:
## Dockerfile文件格式
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# 1、第一行必须指定 基础镜像信息
FROM ubuntu
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com
# 3、镜像操作指令
RUN echo "deb https://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 4、容器启动执行指令
CMD /usr/sbin/nginx
# 指令
- FROM:底层镜像(如系统)
这个 FROM 指令是 dockerfile 的第一个指令,指定了基础镜像,后面的所有指令都是运行在该 基础镜像环境上的 MAINTAINER,该指令是描述的维护者信息。 底层的系统镜像用的是什么,使用 from 指定,绝大部分情况都用的底层有个系统或者基础的环 境用的是什么,对 docker 不熟练使用 centos 镜像即可。
- RUN:构建时容器内运行的命令
RUN 指令用于在容器中执行命令。我们常用来安装基础软件。 镜像安装软件依赖包都可以放在 RUN 中
- COPY:复制 docker 目录中的文件到镜像中
COPY 指令类似 ADD 指令,但是 ADD 指令范围更广些,ADD 能够自动解压文件,能够访问网 络资源,而 COPY 指令做不到。 非目录需要重新指定,放在目录中非常便利,属于好的一种习惯,值得推荐使用目录。
- ADD:复制 docker 目录中的文件到镜像中。(过程可以解压)
ADD 指令是用来将宿主机某个文件或目录放到(复制)容器某个目录下面。 官方不推荐 ADD,高级复制功能,需求不精准,推荐使用 COPY。
- EXPOSE:声明开放端口
EXPOSE 指令用于暴露容器里的端口,我们在 3.5 里面演示过了,nginx 暴露的端口是 80,但 是启动容器的时候需要指定宿主机端口来映射暴露的端口。需要暴露多个端口的话可以使用多 个 EXPOSE,也可以一个 EXPOSE 指令后面跟多个端口,端口之间用空格隔开。 声明不是变更,变更使用-p 构建容器时候使用。
- ENV:设置环境变量
ENV 指令是用于设置环境变量的。 底层环境变量需要需提前设置。
- CMD:容器启动时执行的命令,最多只能执行一条
CMD 指令是你在容器启动的时候帮你运行的命令,而 RUN 这个指令是构建镜像的时候帮你运 行的命令。 容器启动时执行命令,最多执行一条。
- WORKDIR:声明工作目录。类似 cd
WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作,这个与 linux 里面的 cd 差不 多。 切换目录使用 WORKDIR。 做容器轻量级最好,比较小就很好,使用一条命令就不要使用两条命令。
# 构建镜像
docker build 命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,所以构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。
将当前目录做为构建上下文时,可以像下面这样使用docker build命令构建镜像:
docker build .
Sending build context to Docker daemon 6.51 MB
...
Dockerfile 一般位于构建上下文的根目录下,也可以通过-f指定该文件的位置
docker build -f /path/to/a/Dockerfile .
构建时,还可以通过-t参数指定构建成镜像的仓库、标签。
# 镜像标签
docker build -t nginx/v3 .
如果存在多个仓库下,或使用多个镜像标签,就可以使用多个-t参数:
docker build -t nginx/v3:1.0.2 -t nginx/v3:latest .
# 简单示例
# 1.创建Dockerfile文件
mkdir mynginx
cd mynginx
vi Dockerfile
# 2.添加Dockerfile文件内容,这个 Dockerfile 很简单,一共就两行涉及到了两条指令:FROM 和 RUN,FROM 表示获取指定基础镜像,RUN 执行命令,在执行的过程中重写了 nginx 的默认页面信息,将信息替换为:Hello, Docker!
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
# 3.执行Dockerfile文件, 命令最后有一个. 表示当前目录
docker build -t nginx:v1 .
# 4.构建完成后,查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功
docker images
# 5.启动容器, 用 nginx 镜像启动一个容器,命名为docker_nginx_v1,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器
docker run --name docker_nginx_v1 -d -p 80:80 nginx:v1
# 6.修改容器内容, 容器启动后,需要对容器内的文件进行进一步的完善,可以使用docker exec -it xx bash命令再次进行修改
docker exec -it docker_nginx_v1 bash
root@3729b97e8226:/# echo '<h1>Hello, Docker neo!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
# 7.修改了容器的文件,也就是改动了容器的存储层,可以通过 docker diff 命令看到具体的改动
docker diff docker_nginx_v1