基本知识

镜像容器仓库三大核心,镜像是基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。例如,镜像、容器、仓库是 Docker 的三大核心概念。其中,Docker 的镜像是创建容器的3.镜像个镜像可以是一个完整的 CentOS 操作系统环境,称为一个 CentOS 镜像:也可以是一个安装了 MySQL 的应用程序,称为一个 MySQL 镜像,等等。Doaker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经创建好的镜像直接使用。

容器Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。每一个容器都是相互隔离、互不可见的,以保证平台的安全性。可以将容器看作是一个简易版的Linux 环境,Docker 利用容器来运行和隔离应用。

仓库Docker 仓库是用来集中保存镜像的地方。当开发人员创建了自己的镜像之后,可以使用 push 命令将它上传到公有(Public)仓库或者私有(Private)仓库。下次要在另外一台机器上使用这个镜像时,只需从仓库获取即可。仓库注册服务器(Registry)是存放仓库的地方,其中包含多个仓库。每个仓库集中存放一类镜像,并且使用不同的标签(tag)加以区分。目前最大的公共仓库是 docker Hub,它存放了数量庞大的镜像供用户下载使用。

搜索镜像

docker search 关键字

获取镜像

docker pull 仓库名称[:标签]

不指定标签获取最新镜像

查看镜像

docker images 仓库名称:[标签]

查看详细信息

docker inspect 镜像ID号

删除镜像

docker rmi 仓库名称:标签 or docker rmi 镜像ID号

删除镜像前先删除依赖的所有容器

存出、载入镜像

docker save -o 存出文件名 存出的镜像

docker load < 存出文件 or docker load -i 存出文件

上传镜像

docker push 仓库名称:标签

需要注册hub账号

容器操作

容器是 Docker 的另一个核心概念。简单地说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所需的运行环境,包括文件系统、系统类库、shell 环境等。镜像是只读模板,而容器会给这个只读模板添加一个额外的可写层。

1.容器的创建与启动

容器的创建就是将镜像加载到容器的过程。Docker 的容器十分轻量级,可以随时被创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。这个进程是该容器的唯一进程,当该进程结束时,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。使用 docker create 命令可以新建一个容器。

命令格式:

docker create[选项]镜像运行的程序

常用选项:

-i ——让容器的输入保持打开状态;

-t ——让 Docker 分配一个伪终端。

如,使用 docker create 命令创建新容器:

[root@localhost -]# docker create -it nickistre/centos-lamp /bin/bash

使用 docker create 命令创建新容器后,会返回一个唯一的 ID。

使用 docker ps 命令可以查看所有容器的运行状态,添加-a 选项,可以列出系统最近一次启动的容器。

docker ps -a 命令的输出信息显示了容器的 ID 号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中,状态一栏为空,表示当前的容器处于停止状态。

启动处于停止状态的容器可以使用 docker start 命令。

docker start 容器的id/名称

创建并启动

docker run 命令

-d 后台继续运行

终止:docker stop 容器的id/名称

容器的进入

需要进入容器操作时,

docker exec -it 容器的id/名称 /bin/bash

-i ——让容器的输入保持打开状态;

-t ——让 Docker 分配一个伪终端。

exit 退出容器

容器的导入导出

docker export 容器的id/名称>文件名

cat 文件名|docker import - 生成的镜像名称:标签

删除 docker rm 容器的id/名称

-f 强制删除

数据卷操作

docker run -d -v /data1 -v /data2 –name web httpd:centos

将宿主机/var/www挂到容器/data1

docker run -d -v /var/www:/data1 –name web httpd:centos

一个容器的卷建立在另一个容器的上面

docker run -it –volumes-from web –name db1 httpd:centos /bin/bash

Docker 的镜像结构

Docker 镜像除了是 Docker 的核心技术之外,也是发布应用的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行。在 Docker 的整个使用过程中,进入个已经定型的容器之后,就可以在其中进行操作。最常见的操作就是在容器中安装应用服务。如果要把已经安装的服务迁移,就需要把环境以及搭建的服务生成新的镜像。

镜像不是一个单一的文件,而是由多层构成的。可以通过 docker history 命令查看镜像中各层的内容及大小,每层对应 Dockerfile 中的一条指令。Docker 镜像默认存储在/varlib/docker/目录中。容器其实是在镜像的最上面加了一个读写层,在运行容器里进行的任何文件改动都会写到这个读写层。如果删除了容器,也就删除了这个读写层,文件改动也就丢失了。Docker 使用存储驱动来管理镜像每层的内容及可读写的容器层。Docker 镜像是分层的。下面这些知识点非常重要。

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

(2)镜像层可以被缓存和复用。

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

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

(5)镜像层是不可变的,如果在某一层添加一个文件,然后在下一

层删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

Dockerfile 简介

Dockerfile 是一种被 Docker 程序解释的脚本。Dockerfile 由多条指令组成,每条指令对应 Linux 的一条命令。Docker 程序将这些 Dockerfile 指令翻译成真正的 Linux 命令。

Dockerfile 有自己的书写格式和支持的命令。Docker 程序负责解决这些命令间的依赖关系,类似于 Makefile。Docker 程序读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确地表明镜像是怎么产生的。有了 Dockerfile,当有额外的定制需求时,只需在 Dockerfile 上添加或者修改指令,重新生成镜像即可。

指令详解

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:

1
2
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

**[–chown=:]**:可选参数,用户改变复制到容器内文件的拥有者和属组。

**<源路径>**:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

1
2
COPY hom* /mydir/
COPY hom?.txt /mydir/

**<目标路径>**:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

1
2
3
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 –entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

1
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

1
2
3
4
FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

1、不传参运行

1
$ docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

1
nginx -c /etc/nginx/nginx.conf

2、传参运行

1
$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

1
nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

1
2
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

1
2
3
4
ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 –build-arg <参数名>=<值> 来覆盖。

格式:

1
ARG <参数名>[=<默认值>]

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:

1
2
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:

1
EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:

1
WORKDIR <工作目录路径>

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:

1
USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

1
2
3
4
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格式:

1
ONBUILD <其它指令>

docker compose

学习候补。

安装

docker for windows需要windows home版本升级到一定的版本。使用windows易升工具升级自己的电脑到2004版本。

安装docker for windows。需要安装WSL 2

顺便在商店安装Windows terminal

end;