什么叫做 Docker

本文写于 2020 年 11 月 5 日

没有人会喜欢环境配置

在去年的时候我开始学习 Python,并利用 Python 制作了一些小工具。但问题是我很难让别人去用我的软件,除非我让他们安装 Python 的运行环境。

环境配置是编程与软件使用的拦路虎之一,还是挺凶猛的一只。用户必须保证操作系统的设置、库的安装……各种事项必须全部安装正确,你的程序才可以正常的跑起来——即便你完全配置成功了,你也可能因为环境变量的设置问题而失败。

除开使用者,开发者对于环境配置也十分头疼。例如多版本,我们经常需要同时编写多个项目,每个项目依赖的库的版本是可能不同的。

总而言之,环境配置很讨厌,我们需要解决这个痛点,软件他到底可不可以带着环境安装呢?

Docker 就是为了解决这个问题而生的,Docker 使得软件可以带着环境一起安装——也就是说,安装的时候会将原始环境一模一样地复制过来。

Docker 是什么?

Docker 是一个虚拟环境容器,可以让我们把开发环境、代码、配置文件打包到一个容器中,并且发布到任意平台。

如果我们在本地使用 Django 开发网站后台,开发测试完成后,就可以将我们依赖包、数据库、Nginx 等等打包到一个容器中,在进行部署。

Docker 有三个基础概念:Image(镜像)、Container(容器)、Repository(仓库)。

镜像

Image 类似于虚拟机中的「镜像」,它是一个包含有文件系统的、面向 Docker 引擎的只读模板

程序的运行是需要环境的,而 Image 就是用来提供环境的。例如,一个 mysql 镜像就是一个包含 mysql 运行环境的模板,如果我们再在此镜像上装上 Apache,我们就可以叫它 Apache + mysql 镜像。

容器

Container 是 Image 的实例,是一个沙盒。可以认为他就是一个极简的 Linux 系统环境,包括:root 权限、进程空间、用户空间、网络空间、其中的应用程序等等。

Docker 引擎利用 Container 来运行程序,不同的 Container 之间不可以互相影响。

我们可以创建、启动、停止、删除 Container——注意,Image 依然是只读的。

仓库

Repository 类似于 GitHub 的代码仓库,在 Docker 中是镜像仓库,用来存放镜像文件。

我们要注意,Repository 与 Registry 的区别在于:

Registry 是「存放仓库」的地方,一般会有很多个仓库;Repository 是「存放镜像」的地方,一般仓库会存放一类镜像,利用 tag 进行区分,例如 nodejs 9.x / 11.x / 12.x / 15.x 等。

Docker 与虚拟机的区别

虚拟机也是处理环境的一种方案,它可以在一个操作系统里运行另一种操作系统——例如在 Windows 中运行 Linux。

但是虚拟机会占用较多的硬件资源,哪怕程序只需要 1MB,但是虚拟机依然需要上百 MB 来维持自己的运行。另外,虚拟机是一个系统,需要启动、登陆等等步骤,较为繁琐,并且较慢。

Docker 的安装与换源

Docker 可以安装在 Windows、Linux、Mac 等各个平台上,具体可以查看文档 Install Docker

安装完成之后,可以使用 docker --version 查看版本信息。

安装之后我们会发现从自带的 Registry 下载 Image 的时候会发现比较慢,所以需要换源至中国地区。

19.03 的换源方法和之前不太一样,需要在设置中的 Docker Engine 加入:

"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]

即可。

常用命令

新版本的 Docker 自带一个 Docker Hub,可以在 GUI 下操作,但我们还是会经常用到命令的。

  1. docker ps 查看有哪些容器正在运行,其状态如何;
  2. docker kill container-name 可以关闭指定的容器;
  3. docker container start container-name 可以开启刚刚关闭的容器;
  4. docker rm container-name 可以删除容器;
  5. docker run --name container-name 启动新的容器,这里还有很多额外参数,自行谷歌。

(完)

什么叫做 Docker的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. python面向对象--快速入门

    1面向对象基本用法 1.1基本格式 class 类名: def __init__(self,x): self.x = x def 方法名字 (self): #函数在类里称为方法,self就是固定参数, ...

  2. catkin编译系统

    引言 最近项目中遇到一个需求:将 C++ 程序 (不是 ROS node,只是普通的 C++ 程序)中的变量发布到 ROS topic 上,以便 ROS 中的其他 node 进行后续处理. 原 C++ ...

  3. Numpy对数组按索引查询

    Numpy对数组按索引查询 三种索引方法: 基础索引 神奇索引 布尔索引 基础索引 一维数组 和Python的List一样 二维数组 注意:切片的修改会修改原来的数组 原因:Numpy经常要处理大数组 ...

  4. H5使用Canvas绘图

    一.什么是Canvas Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的 ...

  5. Codepen 每日精选(2018-4-22)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 图片切换效果https://codepen.io/AlikinVV/f... 基于 dom 的可换肤的自行 ...

  6. 【uniapp 开发】如何给边框添加阴影效果

    css的box-shadow是用来添加边框阴影效果的. 属性值详解: 1.inset 可选值,默认阴影在盒子外 使用inset后,阴影在盒子内,即使指定边框或者透明边框,阴影依然存在. 2. 这是头两 ...

  7. java中为什么接口中的属性都默认为static和final?

    1)为什么接口中的属性都默认为static和final?Sun公司当初为什么要把java的接口设计发明成这样?[新手可忽略不影响继续学习]答:马克-to-win:接口中如果可能定义非final的变量的 ...

  8. Linux shell中2>&1的含义解释

    https://blog.csdn.net/zhaominpro/article/details/82630528

  9. 7.Arrays类

    1. Arrays类 数组的工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,使用的时候可以直接使用类名进行调用 (而不是使用对象)(是"不用&q ...

  10. Educational Codeforces Round 119 (Div. 2), (C) BA-String硬着头皮做, 能做出来的

    题目链接 Problem - C - Codeforces 题目 Example input 3 2 4 3 a* 4 1 3 a**a 6 3 20 **a*** output abb abba b ...