docker 是开发,运行和部署应用程序的开放管理平台。开发人员能利用 docker 开发和运行应用程序,运维人员能利用 docker 部署和管理应用程序。
docker 提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。由于容器的隔离性和安全性,因此可以在一个主机 (宿主机) 上同时运行多个相互隔离的容器,互不干预。docker 已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:
为什么要使用 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 底层技术了解
Docker-CE 和 Docker-EE
Docker-CE 指 docker 社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。Docker-EE 指 docker 企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和 IT 团队而设计。相比 Docker-CE,增加一些额外功能,更重要的是提供了更安全的保障。此外,docker 的发布版本分为 Stable 版和 Edge 版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。通常情况下,Docker-CE 足以满足我们的需求。后面学习主要针对 Docker-CE 进行学习。
安装环境:Centos 7
安装条件:docker 官方要求至少 3.8 以上,建议 3.10 以上
docker 版本:docker EE 企业版本、docker CE 社区版本
关闭防火墙:systemctl stop firewalld.service 和 设置 vi /etc/selinux/config
安装 Docker Ce 社区版本:
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo mkdir -p /etc/docker
vi /etc/docker/daemon.json ⇒ {
"registry-mirrors": ["自己的加速器地址"]}
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像是一个 docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。
什么是容器? 容器 (Container):容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在几乎任何地方以相同的方式运行。docker 将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。容器具备一定的生命周期。另外,可以借助 docker ps
命令查看运行的容器,如同在 linux 上利用 ps 命令查看运行着的进程那样。
容器与虚拟机相同点:
容器与虚拟机不同点:
(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 的等待过程中,如果终止 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 容器与镜像的关系:
(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
容器的视角:
容器与镜像的底层关系:
容器的运行:
总结: