文章目录
一、docker 概览
docker 是开发,运行和部署应用程序的开放管理平台。开发人员能利用 docker 开发和运行应用程序,运维人员能利用 docker 部署和管理应用程序。
docker 提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。由于容器的隔离性和安全性,因此可以在一个主机 (宿主机) 上同时运行多个相互隔离的容器,互不干预。docker 已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:
- 使用容器来开发应用程序及其支持组件。
- 容器成为分发和测试你的应用程序的单元。
- 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。
为什么要使用 docker?
docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件。
- 借助 docker,您可以像管理应用程序一样管理基础架构。
- 通过利用 docker 的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间的延迟。如:
- 开发人员在本地编写代码,可以使用 docker 同事进行共享,实现协同工作。
- 使用 docker 开发完成程序,可以直接对应用程序执行自动和手动测试。
- 当开发人员发现错误或 BUG 时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验证。
- 利用 docker 开发完成后,交付时,直接交付 docker,也就意味着交付完成。后续如果有提供修补程序或更新,需要推送到生成环境运行起来,也是一样的简单。
- docker 主要解决的问题:
- 保证程序运行环境的一致性;
- 降低配置开发环境、生产环境的复杂度和成本;
- 实现程序的快速部署和分发。
docker 整体结构了解
Docker Engine 是一个包含以下组件的客户端 — 服务端(C/S)应用程序。服务端 — 一个长时间运行的守护进程(Docker Daemon)。REST API — 一套用于与 Docker Daemon 通信并指示其执行操作的接口。客户端 — 命令行接口 CLI( Command Line Interface)。
CLI 利用 docker 命令通过 REST API 直接操控 Docker Daemon 执行操作。Docker Daemon 负责创建并管理 Docker 的对象(镜像、容器、网络、数据卷)
Docker 客户端 (Docker Client) :是用户与 docker 进行交互的最主要方式。当在终端输入docker 命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client 除了连接本地服务端,通过更改或指定 DOCKER_HOST 连接远程服务端。
Docker 服务端 (Docker Server) :Docker Daemon 其实就是Docker 的服务端。它负责监听 Docker API 请求(如 Docker Client) 并管理 docker 对象(Docker Objects),如镜像、容器、网络、数据卷等。
Docker Registries:俗称 docker 仓库,专门用于存储镜像的云服务环境。Docker Hub 就是一个公有的存放镜像的地方,类似 Github 存储代码文件。同样的也可以类似 Github 那样搭建私有的仓库。
Docker 对象(Docker Objects)
- 镜像:一个 docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
- 容器:镜像被运行起来后的实例。
- 网络:外部或者容器间如何互相访问的网络方式,如 host 模式、bridge 模式。
- 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。
docker 底层技术了解
- docker 使用 Go 语言实现。
- docker 利用 linux 内核的几个特性来实现功能:
利用 linux 的命名空间(Namespaces)、利用 linux 控制组(Control Groups)、利用 linux 的联合文件系统(Union File Systems)。这也就意味着 docker 只能在 linux 上运行。在Windows、MacOS上运行 docker,其实本质上是借助了虚拟化技术,然后在 linux 虚拟机上运行的 docker 程序。 - 容器格式 (Container Format) Docker Engine 将namespace、cgroups、UnionFS 进行组合后的一个package,就是一个容器格式(Container Format)。docker 通过对这个 package 中的 namespace、cgroups、UnionFS 进行管理控制实现容器的创建和生命周期管理。容器格式(Container Format)有多种,其中 docker 目前使用的容器格式被称为 libcontainer。
- Namespaces(命名空间):为 docker 容器提供操作系统层面的隔离。进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始起算。网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络。进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互相不可见的,通信需要借助网络。文件系统挂载隔离:容器拥有自己单独的工作目录。内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的,而非宿主机的。
- Control Groups (控制组-cgroups):为 docker 容器提供硬件层面的隔离,控制组能控制应用程序所使用的硬件资源。基于该性质,控制组帮助 docker 引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。
- Union File Systems (联合文件系统—UnionFS):利用分层(layer)思想管理镜像和容器。
二、docker 版本与安装介绍
Docker-CE 和 Docker-EE
Docker-CE 指 docker 社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。Docker-EE 指 docker 企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和 IT 团队而设计。相比 Docker-CE,增加一些额外功能,更重要的是提供了更安全的保障。此外,docker 的发布版本分为 Stable 版和 Edge 版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。通常情况下,Docker-CE 足以满足我们的需求。后面学习主要针对 Docker-CE 进行学习。
Linux Centos7 环境下安装 docker
安装环境:Centos 7
安装条件:docker 官方要求至少 3.8 以上,建议 3.10 以上
docker 版本:docker EE 企业版本、docker CE 社区版本
关闭防火墙:systemctl stop firewalld.service 和 设置 vi /etc/selinux/config
安装 Docker Ce 社区版本:
- 安装 wget 命令: yum install -y wget
- 下载阿里云 docker 社区版 yum 源
cd /etc/yum.repos.d/ wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 查看 docker 安装包:yum list | grep docker
- 安装 Docker Ce 社区版本:yum install -y docker-ce.x86_64
- 设置开机启动:systemctl enable docker
- 更新 xfsprogs:yum -y update xfsprogs
- 启动 docker:systemctl start docker
- 查看版本:docker version
- 查看详细信息:docker info
docker 核心基础之配置阿里云镜像加速
- 点击 此处 登录阿里云,复制当前页面中的加速器地址。
- 选择操作文档中的 CentOS 配置镜像加速器,操作步骤如下:
sudo mkdir -p /etc/docker vi /etc/docker/daemon.json ⇒ { "registry-mirrors": ["自己的加速器地址"]} sudo systemctl daemon-reload sudo systemctl restart docker
三、docker 核心技术之镜像
镜像是一个 docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。
镜像管理
- 可以通过命令 docker command --help 更深入的了解指定的 docker 命令使用方法,例如:查看镜像搜索命令的具体用法:docker search --help
- 搜索镜像: docker search mysql
- 搜索镜像并过滤是官方的:docker search --filter “is-official=true” centos
- 搜索镜像并过滤大于多少颗星星的:docker search --filter stars=10 centos
- 搜索镜像结果只显示前 5 条: docker search --filter stars=10 centos --limit 5
- 查看本地镜像:docker images/docker image ls 例如:docker images ubuntu:latest
- 下载 centos7 镜像:docker pull centos:7
- 镜像删除:docker rmi/docker image rm,-f/--force 强制删除。删除本地的 centos7 镜像:docker rmi centos:7。多个镜像同时删除:docker rmi f643 8652
- 镜像保存备份 docker save,作用:将本地的一个或多个镜像打包保存成本地 tar 文件(输出到STDOUT)。-o, --output string 指定写入的文件名和路径,docker save -o linux_images.tar centos
- 镜像备份导入 docker load,作用: 将 save 命令打包的镜像导入本地镜像库中。 docker load -i linux_images.tar
- 镜像重命名 docker tag,作用:对本地镜像的 NAME、TAG 进行重命名,并新产生一个命名后镜像。docker tag centos:7 mycentos:1
- 镜像详细信息 docker image inspect/docker inspect。例如:docker image inspect centos:7、docker image inspect -f “{ {json .Id}}” centos:7、docker image inspect -f “{ {json .Created}}” centos:7。-f, --format string 利用特定 Go 语言的 format 格式输出结果
- 镜像历史信息 docker history,作用:查看本地一个镜像的历史(历史分层)信息。例如:docker history centos:7、 docker history centos:7 -H=False
四、docker 核心技术之容器
什么是容器? 容器 (Container):容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在几乎任何地方以相同的方式运行。docker 将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。容器具备一定的生命周期。另外,可以借助 docker ps
命令查看运行的容器,如同在 linux 上利用 ps 命令查看运行着的进程那样。
容器与虚拟机相同点:
- 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
- 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
- 容器中或虚拟机中都可以安装各种应用,如 redis、mysql、nginx 等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统) 中操作一样。
- 同虚拟机一样,容器创建后,会存储在宿主机上:linux 上位于 /var/lib/docker/containers 下
容器与虚拟机不同点:
- 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
- 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要 Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把 docker 运行在虚拟机上。
注意:容器并不是虚拟机,但它们有很多相似的地方
虚拟机的生命周期:
容器的生命周期:
容器的生命周期管理
(1) 查看本地所有的容器:docker ps -a
(2) 查看本地正在运行的容器:docker ps
(3) 容器创建 docker create:作用:利用镜像创建出一个 Created 状态的待启动容器,命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称
命令参数 (COMMAND\ARG):COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等。
命令演示:
(4) 容器删除 docker rm CONTAINER_ID/ CONTAINER_NAME,删除一个或多个容器
-f, --force 强行删除容器(会使用 SIGKILL信号)
-v, --volumes 同时删除绑定在容器上的数据卷
命令演示:
(5) 容器启动 docker start,作用:将一个或多个处于创建状态或关闭状态的容器启动起来。命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-a, --attach 将当前 shell 的 STDOUT/STDERR 连接到容器上
-i, --interactive 将当前 shell 的 STDIN 连接到容器上
命令演示1:
命令演示2:
(6) 容器创建并启动 docker run,作用:利用镜像创建并启动一个容器,命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令参数(OPTIONS):查看更多
-t, --tty:分配一个伪TTY,也就是分配虚拟终端
-i, --interactive:即使没有连接,也要保持 STDIN 打开
--name:为容器起名,如果没有指定将会随机产生一个名称
-d, --detach:在后台运行容器并打印出容器 ID
--rm:当容器退出运行后,自动删除容器
命令参数 (COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等
命令演示:
docker run 相当于 docker create + docker start -a 前台模式
docker run -d 相当于 docker create + docker start 后台模式
(7) 容器关闭 docker stop,作用:关闭一个或多个处于暂停状态或者运行状态的容器,命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认10s)
命令演示:
一次性停止所有容器:docker stop $(docker ps -a -q)
(8) 容器终止 docker kill,作用:强制并立即关闭一个或多个处于暂停状态或者运行状态的容器,命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-s, --signal string 指定发送给容器的关闭信号 (默认 KILL 信号)
命令演示:
前提知识点:Linux 其中两种终止进程的信号是:SIGTERM 和 SIGKILL。SIGKILL信号:无条件终止进程信号。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。SIGTERM信号:程序终结信号,可以由 kill 命令产生。与 SIGKILL 不同的是,SIGTERM 信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。docker stop 和 docker kill 的区别:
- docker stop 会先发出 SIGTERM 信号给进程,告诉进程即将会被关闭。在 -t 指定的等待时间过了之后,将会立即发出 SIGKILL 信号,直接关闭容器。
- docker kill 直接发出 SIGKILL 信号关闭容器。但也可以通过 -s 参数修改发出的信号。
因此会发现在 docker stop 的等待过程中,如果终止 docker stop 的执行,容器最终没有被关闭。而 docker kill 几乎是立刻发生,无法撤销。此外还有些异常原因也会导致容器被关闭,比如 docker daemon 重启、容器内部进程运行发生错误等等异常原因。
(9) 容器暂停 docker pause,作用:暂停一个或多个处于运行状态的容器;容器取消暂停 docker unpause,作用:取消一个或多个处于暂停状态的容器,恢复运行。命令演示如下:
(10) 容器重启 docker restart,作用:重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器,该命令相当于 stop 和 start 命令的结合。
(11) 查看容器详细信息:docker inspect CONTAINER_ID / CONTAINER_NAME
(12) 查看容器的日志信息:docker logs,容器日志中记录的是容器主进程的输出 STDOUT\STDERR
(13) 修改容器的名称:docker rename CONTAINER NEW_NAME
(14) 容器连接 docker attach,作用:将当前终端的 STDIN、STDOUT、STDERR 绑定到正在运行的容器的主进程上实现连接。
(15) 容器中执行新命令 docker exec 进入容器:docker exec -it 0ad5d7b2c3a4 /bin/bash
容器的文件复制与挂载
- 从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径 docker cp /root/123.txt kind_cerf:/home/
- 从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径 docker cp kind_cerf:/home/456.txt /root
- 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 镜像ID docker run -itd -v /root/xdclass/:/home centos:7
五、docker 核心技术之容器与镜像
docker 容器与镜像的关系:
(1) 容器提交 docker commit,作用:根据容器生成一个新的镜像,命令格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令参数(OPTIONS):
-a, --author string 作者
-c, --change list 为创建的镜像加入 Dockerfile 命令
-m, --message string 提交信息,类似 git commit -m
-p, --pause 提交时暂停容器 (default true)
命令演示如下:
docker ps -a
docker run -dti centos:7 bash
docker exec 629b yum install -y net-tools
docker exec 629b ifconfig
docker ps -a
docker commit -m "install net-tools" 629b centos-net:v1.0
docker images
docker run -dti 6ea0 bash
docker exec be8b ifconfig
(2) 容器导出 docker export,作用:将容器当前的文件系统导出成一个 tar 文件,docker export [OPTIONS] CONTAINER
-o, --output string 指定写入的文件,默认是 STDOUT
(3) 容器打包的导入 docker import,从一个 tar 文件中导入内容创建一个镜像,docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]],命令演示:
-c, --change list 为创建的镜像加入 Dockerfile 命令
-m, --message string 导入时,添加提交信息
(4) 镜像的 Layer
镜像的视角:
(5) 容器的 Layer
容器的视角:
容器与镜像的底层关系:
容器的运行:
总结: