2.1 什么是容器?

Note

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。

容器与虚拟机有什么区别?

Note

容器由两部分组成:

  1. 应用程序
  2. 依赖

Note

传统的虚拟化技术,都需要创建完整的虚拟机,除了依赖以外,就需要安装整个操作系统。而对于容器技术而言,所有容器都共享同一个Host OS,使得体积大大减少,也不需要再去启动整个操作系统,部署和启动都更快,开销也更小。

2.2 为什么需要容器

简要

容器使得软件具备更强的可移植能力。

容器解决了什么问题?

面临的挑战 我们如何保证每种服务在所有的部署环境中都能顺利运行呢?

在今天,开发人员在进行开发的时候往往需要部署多种服务,在一个系统内,就可能需要完成数据库、缓存、消息队列等多种软件的构建与部署,并且部署的环境也可能复杂多变——虚拟服务器、私有云、公有云等等。 而对于这些应用,不同的服务有着不同的库与软件包,依赖各不相同,另外部署环境也可能需要动态的迁移。

Note

Docker将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统,并提供了以下的特性:

  • 打包任何软件机器依赖
  • 容器无需修改即可运行在几乎所有平台
  • 资源、网络、库都是隔离的
  • 提供标准化操作,适合自动化部署与维护
  • 轻量级,能快速启动与迁移
  • 解耦开发人员与运维人员的工作职责

优势

  • 开发:Build Once, Run AnyWhere!
  • 运维:Configure Once、Run Anything

2.3 容器如何工作?

Docker的架构是怎样的?

Docker核心组件

典型的CS架构

  • Docker客户端:Client
  • Docker服务器:Docker daemon
  • Docker镜像:Image
  • Registry
  • Docker容器:Container

Docker客户端

Docker服务器

systemctl status docker.service
 docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-09-11 07:30:44 CST; 4 days ago
TriggeredBy: docker.socket
       Docs: https://docs.docker.com
   Main PID: 2979585 (dockerd)
      Tasks: 26
     Memory: 84.4M
        CPU: 19.593s
     CGroup: /system.slice/docker.service

Note

Docker daemon是服务器组件,以Linux后台服务(守护进程)的方式运行,运行在Docker host上,负责创建、运行、监控容器,创建与存储镜像。

如何配置允许客户端远程请求

Tip

  1. 编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service,在环境变量 ExecStart 后添加 -H tcp://0.0.0.0
  2. 重启Docker daemon
systemctl daemon-reload
systemctl restart docker.service
  1. 客户端连接,info查看服务器信息
docker -H 192.168.x.x info

Docker镜像

Note

我们可以认为,Docker镜像就是一个只读的模板,我们可以通过它来创建Docker容器 而创建容器则可以通过以下几种方法:

  1. 从零创建镜像
  2. 下载并使用已有镜像
  3. 基于现有镜像创建新的镜像 而对应的镜像文件也被称为 Dockerfile,一般通过 docker build <dockerfile> 来使用

Docker容器

Note

其实就是 Docker 镜像的运行示例

Registry

Note

Registry是存放Docker镜像的仓库,Registry分私有和公有两种。

  • docker pull 从仓库拉取镜像
  • docker run 直接拉取镜像(如果本地没有),然后启动容器