NingG +

Docker 系列:Docker 技术 & 生态的概述

1. 概要

组里 Q3 的技术氛围建设,确立了一个技术专题 《Docker 技术与原理》,做好动员和整体安排后,第一次我来开头,要质量高一些,做一个榜样,通过做出的事情,不断强化大家对团队理念的认可:高质量、不将就。

Note: 当前 blog ,有一份 keynote,Docker:概述.key

主要目标:

涵盖几个方面:

  1. Docker 有什么用?
    1. 业务场景中:细分场景,需要提供哪些功能?
  2. Docker 技术原理
    1. 技术架构
    2. 关键概念
    3. 底层原理
  3. Docker 单机 & 集群
    1. Docker Machine
    2. Docker swarm mode
    3. Kubernetes

整体分享的时候,基本过程:

2. Docker 有什么用

围绕 Docker 几个基本疑问:

  1. Docker 要解决什么问题?
  2. Docker 之前,是怎么解决的?
  3. Docker 提供的优势?
  4. Docker 还有其他优势吗?

2.1. 解决什么问题

本质上:开发 & 运维效率

更多细节,参考:官网:Why Docker

官网的核心观点:

2.2. 核心理念

核心理念:标准化、减少多样性,降低复杂度,提升效率

一张 Docker 整体生态的图片:仓库、容器等

2.3. 对比:之前方案

Docker :

Docker 之前,如何解决上面问题的:

Docker 容器,几个特点:

更多细节,参考:

3. Docker 技术原理

关于 Docker 技术原理,几个方面:

3.1. 技术架构

Docker Engine(Docker 核心引擎),是一个 C/S 结构,客户端/服务器 模式。

整体分为 2 部分:

Docker Engine Components Flow:

整理一个示意图:

Docker Architecture Diagram

如果需要修改本地 docker client,连接到远端 docker server,如何修改?

3.2. 关键概念

几个关键概念:

他们之间的关系,示意图:

3.2.1. 镜像:Dockerfile

构建 Image(镜像):

Dockerfile 文件样例:(https://docs.docker.com/get-started/part2/


# Use an official Python runtime as a parent image
FROM python:2.7-slim
 
# Set the working directory to /app
WORKDIR /app
 
# Copy the current directory contents into the container at /app
ADD . /app
 
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
 
# Make port 80 available to the world outside this container
EXPOSE 80
 
# Define environment variable
ENV NAME World
 
# Run app.py when the container launches
CMD ["python", "app.py"]

3.2.2. Stack & Service:docker-compose

构建 Stack(应用):涵盖 Service

docker-compose.yml 文件样例:(https://docs.docker.com/get-started/part5/

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.5"
          memory: 50M
        reservations:
          cpus: "0.25"
          memory: 20M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

3.3. 底层原理

3.3.1. 资源隔离 & 资源限额

Docker 直接调用「系统内核」,实现资源隔离、限额,如何实现的?

几个切入点:

细节:

具体:

资源类别 资源隔离:namespace 资源限额:cgroup
CPU:进程(涵盖 CPU + 内存) pid namespace:进程隔离 & ipc namespace:进程间通信隔离 内存 + CPU
存储:外部磁盘 mnt namespace:磁盘挂载点隔离
网络 net namespace:网络接口隔离
主机 uts namespace:主机名隔离
用户 user namespace:用户隔离 userId

疑问:

3.3.2. 联合文件系统(分层文件系统)

Union file systems, or UnionFS,通过分层方式,标识差量部分。提供几点便利:

现在有多种联合文件系统的实现:

使用命令: docker info 可以查看当前系统的文件格式

4. Docker 单机 & 集群

Docker 单机和集群,重点关注几个方面:

4.1. Docker Machine

Docker Machine,目标:

基本操作:

在本地物理机上,使用 virtualbox 驱动,创建 Docker 运行环境:

# 使用 virtualbox 驱动, 创建 Docker 主机,命名为 test
docker-machine create -d virtualbox test
 
# 查看列表
docker-machine ls
 
# 通过 ssh 登录机器
docker-machine ssh test

docker-machine 官方支持的驱动,-d 选项可以指定:

4.2. Docker Swarm

关于 swarm 的历史演进:

几个核心概念:

登录 Docker 机器后,需要执行命令,来开启 swarm mode 模式,然后,才能构造 swarm 集群。

具体命令:

# 登录到 Docker 机器(命名为 manager)
docker-machine ssh manager
 
# 完成下述 swarm 初始化,此时,当前节点成为 manager 节点
docker swarm init --advertise-addr 192.168.99.100
  
# 加入 Node
docker swarm join ...
  
# 部署应用(单个镜像)
docker service create ...
  
# 部署应用(依赖 docker-compose.yml 文件,部署一组镜像多个服务)
docker stack deploy ...

几个关键点:

routing mesh diagram:

Docker Engine Client & swarm manager & worker node:

Swarm 集群下,存在一个核心概念: Service 和 Task

4.3. Kubernetes

Kubernetes 是一种解决方案,聚焦容器的集群管理、服务编排。

TODO:

5. 附录

5.1. Docker 的版本

几个方面:

Docker 的版本编号:如何判断 Docker 版本

特别说明:

6. 参考资料

信息源头:

Top