@songying
2019-01-02T22:05:55.000000Z
字数 2407
阅读 1178
Docker
镜像(image) , 容器(container), 仓库(Repository)
Docker 镜像(Image),就相当于是一个
root
文件系统.Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,容器进程运行于属于自己的独立的 命名空间。
一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
一个 Docker Registry 中可以包含多个仓库(
Repository
);每个仓库可以包含多个标签(Tag
);每个标签对应一个镜像。一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过
<仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest
作为默认标签。
sudo systemctl enable docker
sudo systemctl start docker
sudo groupadd docker # 建立用户组
sudo usermod -aG docker $USER # 将当前用户加入用户组
镜像的定制实际上就是定制每一层所添加的配置、文件。
Dockerfile
中包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像表示一个空白的镜像。
FROM scratch
有两种格式。
- shell格式: RUN <命令>
- exec 格式: RUN ["可执行文件", "参数1", "参数2"]
注意:每一个命令会建立一层镜像,因此需要将一层的命令用
&&
连接起来。
RUN apt-get update \
&& apt-get install
Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。
镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。
很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的最后一定要清理掉无关文件。
docker build [选项] <上下文路径/URL/->
docker build -t nginx:v3 . # 此处的. 指定的是上下文路径
docker build
的工作原理:Docker在运行时分为 Docker引擎和客户端工具。
docker build
命令构建镜像,其实并非在本地构建,而是在服务端,也就是Docker 引擎中构建的
上下文: 用于让服务端来获取本地文件。
当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给
Docker
引擎。这样Docker
引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。注意: 在
Dockerfile
中写入:
COPY ./FILE /da
此处的
.
指代的是上下文目录。如果真的需要那些文件,应该将它们复制到上下文目录中去。
默认情况下,如果不额外指定Dockerfile
的话,会将上下文目录下的名为Dockerfile
的文件作为Dockerfile。
docker build
构建方式使用Git仓库构建
docker build git_repoaddress
用tar压缩包构建
dpcker build tarname.tar
从标准输入中读取Dockerfile
docker build - < Dockerfile
cat Dockerfile | docker build -
从标准输入中读取上下文压缩包进行构建
docker build - < context.tar.gz
将从构建上下文目录中
<源路径>
的文件/目录复制到新的一层的镜像内的<目标路径>
位置。
COPY <源路径>...<目标路径>
COPY ["<源路径1>",... "<目标路径>"]
源路径可以是多个,可以时通配符。
<目标路径>
可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR
指令来指定)
ADD
指令和COPY
的格式和性质基本一致。但是在COPY
基础上增加了一些功能。
尽量使用COPY而不是ADD.
有两种格式
- shell方式: CMD <命令>
- exec方式: CMD ["可执行文件", "参数1", "参数2"]
CMD指令就是用于指定默认的容器主进程的启动命令的。
在指令格式上,一般推荐使用exec
格式,这类格式在解析时会被解析为JSON数组,因此一定要使用双引号" ,而不要使用单引号。
Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,
用 upstart/systemd 去启动后台服务,容器内没有后台服务的概念。
ENTRYPOINT
的格式和RUN
指令格式一样,分为exec
格式和shell
格式。