相关概念
- 镜像是容器的运行基础,容器是镜像运行后的形态。
- 镜像是一个包含程序运行必要依赖环境和代码的
只读文件
,镜像的本质是磁盘上一系列文件的集合。创建新的镜像其实也就是对已有镜像文件进行增、删、改操作。说白了就是一个分层的文件系统
- 容器就是一套程序运行的虚拟环境,镜像就是用来构建虚拟环境的模板。同一个镜像,可以构造出多个相互独立,但是运行环境一样的容器。
结构原理
- 镜像的最底层是一个称为启动文件系统(bootfs)的镜像,bootfs的上层镜像叫作根镜像(rootfs),通常情况下是一个操作系统,如Ubuntu、CentOS等。用户的镜像必须构建于根镜像之上。
- 镜像的原理与Git相似,由于Docker的这种文件层叠共享机制(本层镜像可以引用上一层镜像中的文件),才使得镜像占用磁盘空间小、扩展容易。
- 写时复制机制:通过docker run命令指定镜像创建一个容器时,实际上是在该镜像
之上
创建一个空的可读写文件系统
层级。可将这个文件系统当成一个新的临时镜像,而命令里所指定的镜像称为父镜像。父镜像的内容都是以只读方式挂载进来的,容器会读取共享父镜像的内容。不过一旦需要修改父镜像文件,Docker会从父镜像中复制这个文件到临时镜像中来(也就是最上层的容器),所有的修改均发生的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制。用户可以通过commit
命令保存该临时镜像所做的修改,从而形成一个真正的镜像。 - 存储位置
- 查看
/var/lib/docker/
常用命令
-
docker images
列出本机所有的镜像
名称 | 说明 |
REPOSITORY | 仓库名称,用来存放同类型的镜像 |
TAG | 用于区分同一仓库中的不同镜像 |
IMAGE ID | 每个镜像都有长为64位的HashID,用来全网标识一个镜像。该字段只展示前面一部分,因为这一部分已经足以在本机唯一标识一个镜像了 |
CREATED | 镜像的创建时间 |
VIRTUAL SIZE | 镜像所占用的虚拟大小,该大小包含了所有共享文件的大小 |
docker inspect ***
获取镜像的详细信息
构建镜像
commit
- 类似git的代码提交,需要将修改提交到本地仓库中,才会生成一个全新的镜像
docker commit -m="commit Message" --author="daq" 0ddf83b837fe daiaoqi/sqlite3:v1
DockerFile
- 使用Dockerfile来构建镜像。是把对镜像进行的所有操作全部写到一个名为DockerFile的文件中,然后使用
docker build
命令从这个文件中创建镜像。这种方法可以使镜像的创建变得透明和独立化,并且创建过程可以被重复执行。 - DockerFile示例
# Version: 1.0.1
FROM ubuntu:latest
MAINTAINER xxh "xxh@qq.com"
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN apt-get update
RUN apt-get install -y nginx
#使用&&拼接命令
RUN touch test.txt && echo "abc" >> abc.txt
#对外暴露端口
EXPOSE 80 8080 1038
#添加文件
ADD abc.txt /opt/
#添加文件夹
ADD /webapp /opt/webapp
#添加网络文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#设置环境变量
ENV WEBAPP_PORT=9090
#设置工作目录
WORKDIR /opt/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数
CMD ["-a", "-l" ]
#设置卷
VOLUME ["/data", "/var/www"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt
- 各参数的含义
名称 | 说明 |
FROM | 指定待扩展的父级镜像。文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerfile文件中创建多个镜像 |
MAINTAINER | 声明创建镜像的作者信息 |
RUN | 用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行 |
EXPOSE | 指明容器内进程对外开放的端口,多个端口之间使用空格隔开 |
ADD | 向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以是一个文件 |
VOLUME | 该命令会在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个路径可以来自主机或者其他容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问,只有当挂载点的容器引用全部消失时,挂载点才会自动删除 |
WORKDIR | 为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录 |
ENV | 设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量 |
CMD | 用来设置启动容器时默认运行的命令,启动容器,也跟着启动容器中的程序 |
USER | 为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。 |