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. phong模型和blinnphong模型简述

    简介 phong 和 blinnphong 都是比较常用的光照模型 参考链接 https://github.com/Richbabe/Phong-BlinnPhong_Unity 非常好讲的 http ...

  2. 我把“咒语”喂给AI,给自己做了张“传说级”名片

    你有没有过这种瞬间: 在一些场合,当别人问"你是做什么的?" 你张了张嘴,发现自己那复杂的.多线程的.充满创造力的工作,被一句"我是做设计的/做市场的/做咨询的" ...

  3. 深入理解 JavaScript 时间分片:原理、应用与代码示例解析

    JavaScript 时间分片(Time Slicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能.本文将详细解释 JavaScript 时间分 ...

  4. 技术:windows_bat_打开多个网页

    问题:对于经常打开多个网页的,点击一下打开多个网页 @echo start www.bing.com 默认的浏览器打开网址 start 语法 有关 Bat 中 start 命令的使用方法的详细说明.参 ...

  5. kicad 开源项目的编译

    1.安装MSYS2 MSYS2 项目为编译 KiCad 所需的所有依赖项提供了包,点击该按钮下载安装程序 安装完成后,运行 MSYS2 安装路径中的 msys2_shell.cmd 文件,并运行命令  ...

  6. 我最喜欢的 C# 14 新特性

    C# 14 无疑是一个令人翘首以盼的版本,它带来了许多新特性和改进,旨在让我们的编程工作更加高效和便捷.官方公布的新特性列表相当丰富,包括: 扩展成员 (Extension members) 空条件赋 ...

  7. Sdcb Chats 1.6.6 发布,彻底移除 Azure.AI.OpenAI 专用包

    最近,我对我的开源项目 Sdcb Chats 进行了一次更新,发布了 1.6.6 版本.这次更新的核心,是解决了一个我个人一直很在意的技术债:彻底移除了对 Azure.AI.OpenAI 这个专用包的 ...

  8. DELPHI + uniGUI 开发CentOS环境下的Apache模块遇到的问题

    一直以来,用uniGUI做开发都比较顺手,但是缺点是这样做的只能在Windows环境下使用.而我们现在租用的虚拟服务器,往往都是CentOS的环境. 而DELPHI + uniGUI能不能做LINUX ...

  9. 还在手写 RAG?用 Sealos 一键部署 Dify,轻松打造 AI 知识库问答机器人

    兄弟们,AI 浪潮都刮了这么久了,你是不是也心痒痒,想自己动手做一个专属的 AI 应用? 比如,一个能用你自己的知识库来回答问题的"AI客服",或者一个能帮你自动写代码.写文案的& ...

  10. 记一次 .NET 某自动化智能制造软件 卡死分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他们工厂里面的程序不知道怎么就突然卡死了,让我帮忙看下怎么回事?dump也拿到了,对于这类程序,其实我还是非常有信心的,接下来就来分析吧. 二:卡死分析 ...