数字化 IT 从业者知识体系 | 应用部署与管理 —— Docker
本文作者:何文强 — CODING 高级解决方案架构师 具有一线互联网、物联网独角兽、全国股份制银行、新型智慧交通等跨行业从业经历,历任 Java 开发高级工程师、DevOps 技术专家、高级研发经理等职,对微服务、敏捷、DevOps、容器技术有深刻的理解和丰富的实践。
Docker 简介
容器是应用程序层的抽象,将代码和依赖项打包在一起,多个容器可以在同一台计算机上运行,并与其他容器共享 OS 内核,每个容器在用户空间中作为隔离的进程运行。虚拟机是将一台服务器转变为多台服务器的物理硬件的抽象,虚拟机管理程序允许多个 VM 在单台计算机上运行,每个 VM 包含操作系统、应用程序、必要的二进制文件和库的完整副本:
- 基于 GO 语言遵循 Apache 2.0 协议开源;
- 基于 Linux 内核的 Cgroup Namespace 等技术对进程进行隔离;
- Docker 让开发者可以打包应用以及依赖包到一个可移植的容器中,发布到任何流行的 Linux 机器上;
- 容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker vs VM
容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享 OS 内核,每个容器在用户空间中作为隔离的进程运行。
虚拟机(VM)是将一台服务器转变为多台服务器的物理硬件的抽象。虚拟机管理程序允许多个 VM 在单台计算机上运行。每个 VM 包含操作系统,应用程序,必要的二进制文件和库的完整副本。
Docker 优势(VS 虚拟机)
- 开销更小;
- 提高可移植性;
- 操作更加一致;
- 更高的效率;
- 更好的开发应用程序。
Docker 架构
主要是从三个部分来看,分别就是客户端、引擎、仓库;Docker 客户端通过一个物理或虚拟的机器用于执行命令或者其他工具使用 Docker API 与 Docker 的守护进程通信和容器;Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,运行在 Docker Host 上,负责创建、运行、监控容器、构建、存储镜像。而 Docker 镜像是用于创建 Docker 容器的模板,容器是独立运行的一个或一组应用,则 Docker 仓库是用来保护镜像,可以理解为代码控制中的代码仓库。
Client
Docker Client 是 Docker 架构中用户用来和 Docker Daemon 建立通信的客户端;Docker Client 发送容器管理请求后,由 Docker Daemon 接受并处理请求。
Docker Host
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Daemon
Docker Daemon 是 Docker 架构中一个常驻在后台的系统进程, 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。
Docker Daemon 启动所使用的可执行文件也为 Docker,与 Docker Client 启动时所使用的 Docker 可执行文件相同。在 Docker 命令执行时,通过传入的参数来辨别Docker Daemon 与 Ddocker Client。Docker Daemon 接受并处理 Docker Client 发送的请求。
Images
Docker 镜像是用于创建 Docker 容器的模板,Docker 镜像是一个只读模板。
Docker 容器镜像(Docker Image),一种新型的应用打包、分发和运行机制。容器镜像将应用运行环境,包括代码、依赖库、工具、资源文件和元信息等,打包成一种操作系统发行版无关的不可变更软件包。
Docker 镜像特点
容器镜像打包了整个容器运行依赖的环境,以避免依赖运行容器的服务器的操作系统,从而实现 “build once,run anywhere”。
容器镜像一旦构建完成,就变成 read only,成为不可变基础设施的一份子。
操作系统发行版无关,核心解决的是容器进程对操作系统包含的库、工具、配置的依赖。
Containers
Docker 利用容器来运行应用,容器是从镜像创建的运行实例;每个容器都是相互隔离的,保证安全的平台。可以把容器看作一个简易的 Linux 环境。
Registry
Docker Registry 是存储容器镜像的仓库。容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录。
Docker 的运行过程中,Docker Daemon 会与 Docker Registry 通信,实现镜像的搜索(search)、下载(pull)、上传(push)功能。
Dockerfile
Dockerfile 是用于构建 Docker 镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 结构及常用命令
指令 | 示例 | 说明 |
---|---|---|
FROM | FROM <IMAGE> FROM <IMAGE>:<TAG> | 通过 FROM 指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,必须位于第一条非注释指令 |
MAINTAINER | MAINTAINER <NAME> | 指定镜像的作者信息,包含镜像的所有者和联系人信息 |
RUN | RUN <command> (shell模式) | 在 shell 模式下,是使用 /bin/sh -c COMMAND 来运行命令的。RUN 在 build 镜像时执行 |
RUN [ "executable", "param1", "param2" ](exec模式) | 在 exec 模式下可以指定其他的 shell 来运行命令 例如:RUN [“/bin/bash”, “-c”, “echo hello”] | |
EXPOSE | EXPOSE <PORT> | 指定运行该镜像的容器使用的端口,可以是多个。 |
CMD | CMD <command> (shell 模式) | 用于提供容器运行的默认命令,如果 Dockerfile 存在多个 CMD 命令,只有最后一个生效。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 |
CMD [ "executable", "param1", "param2" ] (exec 模式) | ||
CMD [ 'param1', 'param2'](通常与 ENTRYPOINT 搭配) | ||
ENTRYPOINT | ENTRYPOINT <command> (shell 模式) | 与 CMD 类似,ENTRYPOINT 不会被 docker run 中指定的命令覆盖,如果想覆盖 ENTRYPOINT,则需要在 docker run 中指定--entrypoint 选项。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。 |
ENTRYPOINT [ "executable", "param1", "param2" ] (exec 模式) | ||
ADD | ADD <src> <dest> ADD ["<src>" "<dest>"] | 将文件或目录复制到 Dockerfile 构建的镜像中。<src>路径使用 Dockerfile 相对路径,<dest>路径使用镜像绝对路径。ADD 包含了类似 tar 的解压功能 |
COPY | COPY <src> <dest> COPY ["<src>" "<dest>"] | 将文件或目录复制到 Dockerfile 构建的镜像中。单纯复制文件,建议使用 COPY。<src>路径使用 Dockerfile 相对路径,<dest>路径使用镜像绝对路径。 |
VOLUME | VOLUME ['/data'] | 定义匿名数据卷。在启动容器时没有挂载数据卷,会自动挂载到匿名卷。VOLUME 数据会随着容器重启而丢失。 |
WORKDIR | WORKDIR <workdir> | 在容器内部设置工作目录,这样 ENTRYPOINT 和 CMD 指定的命令都会在容器中这个目录下进行。例如:WORKDIR /nginx,ENTRYPOINT 和 CMD 命令就会在容器的 /nginx 目录下执行 |
ENV | ENV <key> <value> ENV <key>=<value> | 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。在 docker build 和 docker run 中有效 |
ARG | ARG <key> <value> ARG <key>=<value> | 设置构建变量,在 docker build 中有效,在 docker run 中无效 |
USER | USER username | 用于指定镜像为什么用户去运行。例如 USER nginx,镜像就会以 nginx 身份运行。可以使用 uid,gid 等各种组合使用 |
LABEL | LABEL <key>=<value> | LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式 |
ONBUILD | ONBUILD RUN [ "npm", "install" ] | 为镜像创建触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像被构建时会插入触发器中的指令。ONBUILD 指令不在当前 Dockerfile 中执行,在当前 Dockerfile 构建的镜像作为基础镜像被引用时才会执行 ONBUILD |
Docker 常用命令
作用域 | 命令 | 命令说明 | 命令示例 |
---|---|---|---|
容器生命周期管理 | run | 运行一个新的容器 | docker run [image] |
start/stop/restart | 启动/停止/重启容器 | docker start [container] | |
kill | 杀掉一个运行中的容器 | docker kill [container] | |
rm | 删除一个或多个容器 | docer rm [container1] [container2] | |
pause/unpause | 暂停/恢复容器中所有的进程 | docker pause [container] | |
create | 创建一个新的容器但不启动它 | docker create [image] | |
exec | 在运行的容器中执行命令 | docker exec -it [container] /bin/sh /root/venture.sh | |
容器操作 | ps | 列出容器 | docker ps |
inspect | 获取容器/镜像的元数据 | docker inspect [container] [image] | |
top | 查看容器中的进程信息 | docker top [container] | |
logs | 获取容器中的日志 | docker logs [container] | |
port | 列出指定容器的端口映射 | docker port [container] |
作用域 | 命令 | 命令说明 | 命令示例 |
---|---|---|---|
镜像仓库 | login/logot | 登录/登出到docker镜像仓库,默认dockerhub | docker login/logout -u username -p password |
pull | 从镜像仓库中拉取或更新制定镜像 | docker pull [image]:[tag] | |
push | 将本地镜像上传到镜像仓库 | docker push [image]:[tag] | |
search | 从docerHub中查找镜像 | docker search [image] | |
本地镜像管理 | images | 列出本地镜像 | docker images |
rmi | 删除本地镜像 | docker rmi [image] | |
tag | 给指定镜像打标签 | docker tag [image]:[tag] [new-image]:[new-tag] | |
build | 使用Dockerfile创建镜像 | docker build -t [image] . | |
history | 查看指定镜像的创建历史 | docker history [image] | |
save | 将指定镜像保存成tar归档文件 | docker save -o [name.tar] [image] | |
load | 导入使用docker save 导出的镜像 | docker load -i [name.tar] | |
import | 从归档文件中创建镜像 | docker import [name.tar] [new-image] |
Docker 价值
通过 Docker 标准化的方式,有利于加强用户资产积累。例如集装箱,Docker 有个中文翻译过来是集装箱的意思,而集装箱既然可以节省了海运 90% 的成本,这是不可想象的。正是因为 Docker 标准化的能力,让成本得到了极大的降低、效率得到了极大的提高。除了标准化以外,还有一致性,大家都是使用一样的规格、一样的规范、出错的效率非常的低,那么世界范围内非常方便的去流通,可移植性非常的强,价值主要体现在以下几方面:
- 标准化应用的部署和交付;
- 加快部署效率;
- 提升软件可移植性和灵活性;
- 提升资源利用率;
- 加速企业软件资产积累。
Docker 发展趋势
- 增强容器安全能力;
- 提升镜像仓库的稳定性和传输效率;
- 增强资源隔离能力。
《数字化 IT 从业者知识体系》背景 数字化和可持续发展是中国企业未来发展的两大主题,掌握数字化知识,具备数字化能力,应用数字化技术是我们 IT 从业者未来核心竞争力所在。《数字化 IT 从业者知识体系》的初衷是为IT从业者提供的系统性的数字化知识体系,内容涵盖管理实践、工程实践、技术实践三个层次,涉及软件开发方法、应用技术架构、应用部署与管理、软件交付与协作四大方面。 在接下来的《数字化 IT 从业者知识体系》系列文章,何文强将从软件开发方法、应用技术架构、应用部署与管理、软件交付与协作四个方面,为大家进行逐一分享介绍:
- 软件开发方法主要包括瀑布、敏捷、精益等;
- 应用技术架构主要包括微服务架构、服务网格架构、无服务器架构、分布式多运行架构等;
- 应用部署与管理主要包括但不限于虚拟化技术、容器技术与容器编排等;
- 软件交付与协作主要包括但不限于CMMI、ITIL、DevOps等。
相信该知识体系有利于 IT 从业者构建丰富的技术体系、全面的技术视野和系统的能力建设。欢迎大家前往《数字化 IT 从业者知识体系》话题进行详细阅读。
相关文章
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 一辆特斯拉,长到一米八!硅谷IT男断腿增高,成医美狂魔?
- docker 离线安装_Docker安装
- Docker安装docker-compose插件
- docker 启动失败:Failed to start Docker Application Container Engine
- Docker服务的拉取镜像命令(docker pull 镜像名称)
- Docker启动容器命令(docker start 容器名称)
- 「 【Docker】linux安装docker compose(小白安装) 」
- 互联网和IT行业越来越严峻,前景几何?
- 【Docker 系列】docker 学习 三
- 【Docker 系列】docker 学习八,Docker 网络
- 【Docker 系列】docker 学习九,Compose 内容编排官网初步体验
- Windows系统安装Docker遇到error during connect: In the default daemon configuration on Windows, the docker
- 万字长文教你制作IT项目售前解决方案
- 在Linux系统中安装Docker容器(linux下安装docker)
- Linux下Docker安装指南(linux下docker安装)
- 提升IT技能,火热进行中——合肥Linux培训(合肥linux培训)
- 使用Docker安装Redis,一步到位!(docker安装redis)
- docker-Docker Registry私有仓库
- docker managed volume – 每天5分钟玩转 Docker 容器技术(40)
- IT部门需要谨慎回避的三种常见云陷阱
- 使用软件定义的架构 打好IT基础
- MySQL中的user字段重要的用户信息存储 NoteAs an AI language model I can generate articles but it might not be 100 accurate
- Cisco和Oracle共同推进IT领域发展(cisco和oracle)
- 探索Docker安装Oracle数据库的秘密(docker安装oracle)
- MySQL停止服务Note This sentence is grammatically incorrect in Chinese I have corrected it to make sense
- 使用Oracle RACIP架构加速IT服务可用性(oracle racip)
- Oracle 9i 硬件升级助力IT发展(oracle9i310)
- Oracle 8简易客户端轻松实现健康IT体系(oracle8精简客户端)
- Oracle 11g初次安装走向新的IT时代(oracle11g初始化)