Docker - 基础

Docker简介

什么是Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

为什么使用Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

对比传统虚拟机总结

虚拟机 VS 容器

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker基本概念

镜像

操作系统分为 内核用户空间 对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

相关命令

docker image ls                             # 列出镜像
docker image build # 根据Dockerfile文件创建镜像
docker image history <image> # 列出镜像历史
docker image import # 从文件/目录导入生成镜像
docker image inspect <image> # 显示镜像详情
docker image pull <image> # 从远程仓库拉取镜像
docker image push <image> # 推送镜像到远程仓库
docker image rm <image> # 删除镜像
docker image save <image> -o <path> # 保存镜像到文件
docker image tag <image> <image>:<tag> # 镜像打标签

Dockerfile 指令详解

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

指令 作用 说明
FROM 指定基础镜像 FROM 是必备的指令,并且必须是第一条指令
COPY 复制文件 两种格式,一种类似于命令行,一种类似于函数调用
ADD 更高级的复制文件 在COPY基础上增加自动解压缩的场合
RUN 执行命令 镜像构建步骤
CMD 容器启动命令 容器默认执行的命令
ENTRYPOINT 入口点 容器启动程序及参数
ENV 设置环境变量 定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
ARG 构建参数 ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的
VOLUME 定义匿名卷 对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)
EXPOSE 暴露端口 声明容器运行时提供服务的端口
WORKDIR 指定工作目录 指定当前目录,如该目录不存在,WORKDIR 会帮你建立目录
USER 指定当前用户 这个用户必须是事先建立好的,否则无法切换
HEALTHCHECK 健康检查 告诉 Docker 应该如何进行判断容器的状态是否正常
ONBUILD 为构建下一层镜像准备 构建下一级镜像的时候才会被执行
LABEL 镜像添加元数据 指令用来给镜像以键值对的形式添加一些元数据(metadata)
SHELL 指令 SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shell,Linux 中默认为

镜像构建上下文

当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件

容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

相关命令

docker run                                                # 构建并启动镜像
docker run -t -i ubuntu:18.04 /bin/bash # 启动一个 bash 终端,允许交互
docker run -d ubuntu:18.04 # 后台运行容器
docker container start <container> # 重启已经停止容器
docker container stop <container> # 终止容器
docker attach <container> # 附加到容器中,执行exit导致容器推出
docker exec -it <container> bash # 进入容器, 执行exit不会容器推出(推荐)
docker export <container> > ubuntu.tar # 导出镜像
cat ubuntu.tar | docker import - ubuntu:v1.0 # 导入容器快照
docker container rm <container> # 删除一个处于终止状态的容器
docker container prune # 清理所有处于终止状态的容器

仓库

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。

相关命令

docker search centos                                      # 搜索仓库
docker pull centos # 拉取镜像
docker push username/ubuntu:18.04 # 推送镜像

【Docker】基本介绍的更多相关文章

  1. Docker简单介绍

    Docker简单介绍 Docker是一个能够把开发的应用程序非常方便地部署到容器的开源引擎.由Docker公司团队编写,基于Apache 2.0开源授权协议发行.Docker的主要目的例如以下: 提供 ...

  2. Docker Swarm 介绍 or 工作原理

    Docker Swarm 介绍 Swarm 简介 Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swar ...

  3. 学习Mysql过程中拓展的其他技术栈:Docker入门介绍

    一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...

  4. docker的介绍以及常用命令

    一.docker的介绍 1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚 ...

  5. Docker 容器介绍

    Docker 容器介绍 Docker 是一个基于 Go 语言的开源应用容器引擎,它既能实现虚拟化,又可用于将应用服务打包成轻量.可移植的容器,从而可以发布到任何 Linux 平台.除了优秀了沙箱机制外 ...

  6. Docker的介绍与安装教程

    基于Windows系统下docker的介绍与安装教程以及更换docker镜像源教程 目录 基于Windows系统下docker的介绍与安装教程以及更换docker镜像源教程 Docker的核心概念 D ...

  7. Docker之介绍与安装

    Docker 说明 本章,我们主要从Docker简介.Docker中几个核心概念和Docker安装这几个方面对Docker进行介绍! 1. Docker 简介 1.1. 什么是 Docker Dock ...

  8. 一、docker的介绍

    一.虚拟化和容器 虚拟化介绍 操作系统层虚拟化是指通过划分一个宿主操作系统的特定部分,产生一个个隔离的操作执行环境.操作系统层的虚拟化是操作系统内核直接提供的虚拟化,虚拟出的操作系统之间共享底层宿主操 ...

  9. hi,docker,docker的介绍

    一.docker的介绍 1.什么是docker: docker是一种虚拟化技术,小型的系统环境(linux)2.虚拟化技术: 在计算机中用例管理虚拟资源的一种手段 内存管理.软件虚拟化.硬件虚拟化(磁 ...

  10. docker简单介绍----Dockerfile命令

    DockerFile的组成部署: 下面优先介绍下Dcokerfile的基础指令 一.CMD指令:容器启动时要莫热门运行的命令,如果有多个CMD指定,最后一个生效 使用方法: CMD ["ex ...

随机推荐

  1. 【8*】Slope Trick 学习笔记

    前言 从 一些快速笔记 中分离出来的,因为这一知识点写的内容太多了,可以拿出来专门开一篇学习笔记. Slope Trick 不是斜率优化!Slope Trick 不是斜率优化!Slope Trick ...

  2. vs 代码格式化

    解决方案 ctrl + A: ctrl + K + F; 参考链接 (博客园大牛)[https://www.cnblogs.com/chenmingjun/p/8119029.html]

  3. FRP 各种操作系统的接口

    简介 类似于TeamViewer之类,而更好的用内网穿透的东西. 参考链接 https://zhuanlan.zhihu.com/p/79793246

  4. ETL怎么实现多流自定义合并?

    随着信息技术的迅猛发展以及数据生成环境的多样化,互联网.物联网和社交媒体的广泛应用导致各种设备和平台不断产生大量数据,需要整合这些数据,从而进行数据融合.数据集成和管理平台ETLCloud,主要用于支 ...

  5. ETL没有自动化数据集成平台,你的BI报表只会让你错失先机

    随着现代企业的数据量和复杂性的不断增加,传统的商业智能(BI)报表系统虽然能够提供详尽的业务指标和洞察,但它们依赖于用户的主动查询和查看.这种被动式的数据分析模式存在几个显著的缺陷: 滞后性:用户需要 ...

  6. 2025百度之星第一轮T1:Bus Station题解

    2025 第一轮 A 百度之星题解 简要题目 有一棵 72 个节点的树.令\(w(u, v)\)表示树上两点之间的简单路径.称一个树上所有简单路径组成的集合的子集 S 是好的,当且仅当树上每条边\(( ...

  7. CAN总线基础知识

    目录 一.CAN总线简介 1.1 背景 1.2 节点构成 二.CAN总线基本工作原理 2.1 物理层 2.2 数据链路层 三.CAN总线的报文格式 3.1 数据帧 + 远程帧(标准帧--11位ID) ...

  8. S32K148-uart(裸机开发)

    上周分享了基于S32-SDK方法配置uart的方法,本次分享UART底层裸机配置,废话不多数,直接上代码: 1)初始化 void uart1_init(void) { /* * PTC6 uart1_ ...

  9. Vite 异步 Chunk 加载优化

    在实际项目中,Rollup 通常会生成 "共用" chunk -- 被两个或以上的其他 chunk 共享的 chunk.与动态导入相结合,会很容易出现下面这种场景: 在无优化的情境 ...

  10. MySQL 26 备库为什么会延迟好几个小时

    上一篇文章介绍的场景中,对备库延迟的影响一般是分钟级的.但如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就可能成了小时级别.这就涉及今天介绍的话题:备库并行复制能力. 主备流程图: 主备 ...