Dockerfile使用介绍(入门教程)

简介: Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可。

概念

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

镜像的定制实际上就是定制每一层所添加的配置。若把每一层修改、安装、构建、操作的命令都写入一个脚本,用该脚本来构建镜像。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可。

构建步骤

  1. 编写Dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(dockerHub,阿里云镜像仓库)

基础知识

  1. 每个保留关键字(指令)都必须是大写的
  2. 命令执行从上到下顺序执行
  3. 表示注释

  4. 每个指令都会创建提交一个新的镜像层,并提交

完整镜像的结构图:
在这里插入图片描述
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的

常用指令说明
指令 解释
FROM 基础镜像
MAINTAINER 镜像作者,一般格式为:姓名+邮箱
RUN 镜像构建的时候需要运行的命令
AND 添加内容指令,从上下文目录中添加文件或者目录到容器里指定路径,在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
COPY 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。COPY <源文件> <目标路径>
WORKDIR 镜像的工作目录,进入容器时默认目录
VOLUME 挂载的目录
EXPOSE 暴露端口配置
CMD 指定这个容器启动的时候要运行的命令,可被docker run 的命令行参数指定的指令所覆盖
ENTRYPOINT 指定这个容器启动的时候要运行的命令,不被docker run 的命令行参数指定的指令所覆盖,可在其后追加命令
ONBUILD 用于延迟构建命令的执行,当构建一个被继承 dockerfile 这个时候就会运行ONBUILD的指令,触发指令
ENV 构建的时候环境变量

实战测试

编写Dockerfile制作自己的Ubuntu镜像
在此镜像中存在vim命令和net-tools
  1. 编写Dockerfile文件
FROM ubuntu 
MAINTAINER bbx
ENV MYPATH /usr/local
WORKDIR $MYPATH

#使用-i 在文件中替换
RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/#' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install -y net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

说明
替换源命令格式: sed -i 's/原字符串/替换字符串/' filename

  1. 构建镜像

最后的.不要忘记写

 docker build -f mydockerfile -t myubuntu:1.0 .
  1. 查看构建的镜像
root@VM-4-3-ubuntu:/home/dockerfile# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
myubuntu              1.0       3dc827ed14b8   10 minutes ago   176MB
  1. 运行镜像
docker run -it --name myubuntu01 myubuntu:1.0 /bin/bash
  1. 测试是否安装net-tools
#5. 测试net-tools
root@54d0634a778d:/usr/local# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 12  bytes 976 (976.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

扩展

查看本地镜像的变更历史
docker history 镜像id

#查看本地镜像
root@VM-4-3-ubuntu:~# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
myubuntu              1.0       3dc827ed14b8   20 minutes ago   176MB
#查看变更历史
root@VM-4-3-ubuntu:~# docker history 3dc827ed14b8
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
3dc827ed14b8   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
20a60530bcd5   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
92eff2556955   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
63f7ce3c1a27   20 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
b7f427f02e17   20 minutes ago   /bin/sh -c apt-get install -y net-tools         1.46MB    
527f218c9f27   20 minutes ago   /bin/sh -c apt-get install -y vim               59.3MB    
8ca15ec4fb21   22 minutes ago   /bin/sh -c apt-get update                       37.7MB    
dde78790ea52   24 minutes ago   /bin/sh -c sed -i 's#http://archive.ubuntu.c…   2.54kB    
cc77e008ed87   24 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
7a96d052bc39   24 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
05d8fb2ee2a5   24 minutes ago   /bin/sh -c #(nop)  MAINTAINER bbx<1101249732…   0B        
216c552ea5ba   2 weeks ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      2 weeks ago      /bin/sh -c #(nop) ADD file:6cd2e13356aa5339c…   77.8MB    
目录
相关文章
|
3月前
|
缓存 Shell Go
dockerfile笔记
dockerfile笔记
43 0
|
7月前
|
应用服务中间件 Shell nginx
Docker 实战教程之从入门到提高(二)
Docker 实战教程之从入门到提高(二)
75 0
|
9月前
|
Java Shell Linux
41-Dockerfile-Dockerfile简介
41-Dockerfile-Dockerfile简介
|
运维 Java Shell
Dockerfile学习
Dockerfile学习笔记
|
Docker 容器
Dockerfile笔记
照着写就行
89 0
Dockerfile笔记
|
Linux 应用服务中间件 开发工具
DockerFile 学习
DockerFile 学习
144 0
DockerFile 学习
|
Java Docker 容器
Docker 实战教程之从入门到提高 (七)(上)
Docker 实战教程之从入门到提高 (七)
75 0
Docker 实战教程之从入门到提高 (七)(上)
|
安全 Ubuntu 应用服务中间件
Docker 实战教程之从入门到提高(三)
本系列的前两篇文章,我们已经学习了 Docker 的安装步骤,通过实际的例子,学习了Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理
105 0
Docker 实战教程之从入门到提高(三)
|
存储 Kubernetes Ubuntu
Docker 实战教程之从入门到提高(一)(下)
从本文开始,笔者将开启一个新的系列写作,主题是 Kubernetes 运行的基石之一:Docker 技术。
102 0
Docker 实战教程之从入门到提高(一)(下)
|
Ubuntu 应用服务中间件 Shell
Docker 实战教程之从入门到提高 (四)(下)
本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改,达到自定义其首页显示的目的。
98 0
Docker 实战教程之从入门到提高 (四)(下)

热门文章

最新文章