Dockerfile 镜像创建

目录

一、创建镜像的三种方法:

二、基于已有镜像创建:

1.启动一个镜像:

​编辑

2.将修改后的容器提交为新的镜像:

三、基于本地模板创建:

1.下载模板:

2.导入为镜像:

[四、基于Dockerfile 创建:](#四、基于Dockerfile 创建:)

[1. 联合文件系统(UnionFS):](#1. 联合文件系统(UnionFS):)

[2. 镜像加载原理:](#2. 镜像加载原理:)

3.为什么Docker里的centos的大小才200M:

[4. Docker 镜像结构的分层:](#4. Docker 镜像结构的分层:)

[5. Dockerfile 操作常用的指令:](#5. Dockerfile 操作常用的指令:)

[5.1 CMD 和 ENTRYPOINT 的区别:](#5.1 CMD 和 ENTRYPOINT 的区别:)

[5.2 ADD 和 COPY 的区别:](#5.2 ADD 和 COPY 的区别:)

[6. 使用 Dockerfile 构建镜像步骤:](#6. 使用 Dockerfile 构建镜像步骤:)

[五、Dockerfile 案例:](#五、Dockerfile 案例:)

[1. 建立工作目录:](#1. 建立工作目录:)

2.创建Dockerfile:

[3. 准备网站页面:](#3. 准备网站页面:)

[4. 生成镜像:](#4. 生成镜像:)

​编辑

[5. 新镜像运行容器:](#5. 新镜像运行容器:)

6.测试:


一、创建镜像的三种方法:

  • 基于已有镜像创建
  • 基于本地模板创建以
  • 基于Dockerfile创建。

二、基于已有镜像创建:

1.启动一个镜像:

bash 复制代码
docker create -it centos:7 /bin/bash

docker ps -a

2.将修改后的容器提交为新的镜像:

注意:需要使用该容器的 ID 号创建新镜像

bash 复制代码
docker commit -m "new" -a "centos" bd35fd9d7ccb  centos:test

#常用选项:

-m 说明信息;

-a 作者信息;

-p 生成过程中停止容器的运行。

三、基于本地模板创建:

通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated

1.下载模板:

bash 复制代码
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

2.导入为镜像:

bash 复制代码
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

四、基于Dockerfile 创建:

1. 联合文件系统(UnionFS):

**UnionFS(联合文件系统):**Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。

**Union文件系统是Docker镜像的基础。**镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

**特性:**一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

我们下载的时候看到的一层层的就是联合文件系统。

2. 镜像加载原理:

  • Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
  • bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
  • 在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
  • 我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

3.为什么Docker里的centos的大小才200M:

因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

4. Docker 镜像结构的分层:

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

(1)Dockerfile 中的每个指令都会创建一个新的镜像层;

(2)镜像层将被缓存和复用;

(3)当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;

(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

5. Dockerfile 操作常用的指令:

指令 含义
FROM 指定新镜像所基于的镜像。 第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 说明新镜像的维护人信息(可写可不写)
RUN命令 每一条RUN后面跟一条命令 ,在所基于的镜像上执行命令,并提交到新的镜像中, RUN必须大写。
CMD ["要运行的程序","参数1","参数2"] 指定启动容器时需要运行的命令或脚本, Dockerfile只能有一条CMD命令, 如果指定多条则只能执行最后一条,"/bin/bash"也是一条CMD,并且会覆盖images镜像里面的cmd
ENTRYPOINT ["要运行的程序","参数1","参数2"] 设定容器启动时第一个运行的命令及其参数。可以通过使用命令:docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容
EXPOSE [端口号] 指定新镜像加载到Docker时要开启的端口 "暴露端口",就是这个容器暴露出去的端口号。
ENV [环境变量] [变量值] 设置一个 " 环境变量 "的值,会被后面的RUN使用,容器可以根据自己的需求创建时传入环境变量,镜像不可以
ADD [源文件/目录] [目标文件/目录] ①将源文件复制到目标文件, 源文件要与Dockerfile位于相同目录中。 ②或者时一个URL。 ③若源文件时压缩包的则会将其解压。
COPY [源文件/目录] [目标文件/目录] 将本地主机上的文件/目录复制达到目标地点,源文件/目录要与Dockerfile在相同的目录中, copy只能用于复制,add复制的同时,还可以将对象解压, copy比add节省资源
VOLUME ["目录"] 在容器中创建一个挂载点,简单来说就是 -v,指定镜像的目录挂载到宿主机上。
USER [用户名/UID] 指定运行容器的用户
WORKDIR [路径] 为后续的RUN、CMD、ENTRYPOINT指定工作目录, 相当于一个临时的"CD " ,否则需要使用绝对路径,例如 workdir /opt ,移动到opt目录下, 后续执行的指令都是在/opt下面操作
ONBUILD [命令] 指定所生成的镜像作为一个基础镜像时所要运行的命令 "(是一种优化)"
HEALTHCHECK 健康检查

5.1 CMD 和 ENTRYPOINT 的区别:

  • 共同点:都可以用来指定容器启动命令
  • 区别:ENTRYPOINT指定的容器启动命令优先级更高,如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用

5.2 ADD 和 COPY 的区别:

  • 共同点:都可以将本地的文件/目录复制到镜像里
  • 区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里(URL下载和压缩包解压特性不能同时使用)

6. 使用 Dockerfile 构建镜像步骤:

  1. 先在第一行用 FROM 指令指定基础镜像
  2. 还可以再用 MAINTAINER 指定镜像维护人信息(可跳过)
  3. 之后用 RUN EXPOSE ENV ADD COPY 等指令编写构建镜像的过程
  4. 结尾用 CMD/ENTRYPOINT 指定容器启动时执行的命令
  5. 最后用 docker build -t 新镜像名:标签 . [-f Dockerfile文件路径] 命令构建镜像

五、Dockerfile 案例:

1. 建立工作目录:

bash 复制代码
mkdir  /opt/apache
cd  /opt/apache

2.创建Dockerfile:

bash 复制代码
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

3. 准备网站页面:

bash 复制代码
echo "this is test web" > index.html

4. 生成镜像:

bash 复制代码
docker build -t httpd:centos .   

5. 新镜像运行容器:

bash 复制代码
docker run -d -p 1216:80 httpd:centos

6.测试:

相关推荐
梁诚斌3 分钟前
VSOMEIP代码阅读整理(1) - 网卡状态监听
运维·服务器·网络
深情废杨杨24 分钟前
服务器几核几G几M是什么意思?如何选择?
运维·服务器
康熙38bdc25 分钟前
Linux 进程优先级
linux·运维·服务器
Web极客码26 分钟前
常见的VPS或者独立服务器的控制面板推荐
运维·服务器·控制面板
只是有点小怂30 分钟前
parted是 Linux 系统中用于管理磁盘分区的命令行工具
linux·运维·服务器
三枪一个麻辣烫1 小时前
linux基础命令
linux·运维·服务器
cuisidong19972 小时前
如何在 Kali Linux 上安装 Google Chrome 浏览器
linux·运维·chrome
wusam2 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
运维·服务器·网络·docker·容器
南种北李2 小时前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
一直在进步的派大星2 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器