Skip to content
DAILY QUOTE

“ ”

Docker入门

记录笔记仅为个人记忆使用。

1.Docker概述

1.1Docker为什么出现

1.2Docker发展历史

1.3Docker官方资源

2.虚拟化和容器化

2.1传统虚拟化

传统虚拟化:为了让不同的人(应用)住得互不干扰,你在地皮(物理服务器)上建了好几栋独栋别墅。每栋别墅都有自己独立的地基、承重墙、水电系统(完整的操作系统Guest OS)。

缺点:太占地方,建房成本高,浪费资源(很多别墅的客厅可能空着)。

2.2容器化技术

容器化技术:大家共享同一栋楼的地基、承重墙和主管道(宿主机的操作系统内核)。但是,每个人住进不同的房间(容器)。房间门一关,互相看不见。

优点:空间利用率极高,拎包入住(启动极快),成本极低。

2.3二者对比

对比维度传统虚拟化技术(Virtual Machine)容器化技术(Docker)
实现层级硬件级虚拟化(通过Hypervisor模拟硬件)操作系统级虚拟化(利用Linux内核的Namespace和Cgroups)
操作系统每个虚拟机都需要安装完整的独立操作系统(Guest OS)所有容器共享宿主机(Host OS)的内核,没有独立的操作系统
启动速度分钟级(需要经历完整的系统开机引导过程)秒级甚至毫秒级(只需启动一个进程)
资源占用极大(即使不跑应用,操作系统本身也要占几个G的内存和硬盘)极小(只占用应用本身和依赖库的体积,通常几十MB到几百MB)
隔离性与安全极强(完全隔离的物理模拟环境)较弱(本质上是宿主机上的进程隔离,如果内核有漏洞可能会互相影响)
可移植性较差(往往受限于底层的虚拟化平台,体积庞大不易迁移)极强(“一次构建,到处运行”,只要有Docker环境就能跑)

3.Docker和DevOps

4.Docker核心概念

4.1镜像(image)

Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务。

示例:tomcat镜像===>run===>tomcat01容器。

通过同一个镜像可以创建多个容器,最终服务运行或者项目运行就是在容器中的。

4.2容器(container)

Docker利用容器技术,独立运行一个或者一组应用。容器通过镜像创建。

容器支持启动、停止、删除等基本操作。

目前可以先把容器理解为一个简易的Linux系统。

4.3仓库(repository)

仓库是存放镜像的地方。

常见仓库:

  • Docker Hub,默认是国外的镜像仓库。
  • 阿里云等厂商也提供容器镜像服务,可以配置镜像加速。

5.Docker环境准备

5.1Linux内核要求

Docker要求Linux内核版本在3.0以上。

bash
ubuntu@Mystpet:~$ uname -r
5.15.0-163-generic

uname -r用于查看Linux内核发行号。当前内核版本是5.15,已经满足Docker运行要求。

Docker不是在模拟硬件,它依赖Linux内核底层的Namespace隔离和Cgroups资源限制来实现容器效果。这两个功能在较旧的2.x内核中没有或者不完善,所以Docker教程通常强调内核版本需要3.0以上。

5.2查看系统信息

bash
ubuntu@Mystpet:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
字段名称英文含义大白话解释
PRETTY_NAME漂亮的名称给人类看的全称。写文档时可以使用这个名字,例如“Ubuntu 22.04.3 LTS”。
NAME名称系统的家族大类,就是Ubuntu。
VERSION_ID版本号22.04,代表2022年4月发布的版本。
VERSION完整版本信息包含版本号和代号。LTS代表长期支持版,通常维护5年。
VERSION_CODENAME和UBUNTU_CODENAME版本开发代号jammy。Ubuntu每次发版都会使用一个开发代号。
ID系统标识符ubuntu。全小写,通常给代码脚本使用。
ID_LIKE类似什么系统debian。Ubuntu基于Debian二次开发,所以Ubuntu和Debian使用相似的包管理逻辑,例如都使用apt-get
HOME_URL及其他各种网址官网、技术支持、Bug报告和隐私政策的网址链接。

6.安装Docker

6.1卸载旧版本

较旧的Docker版本称为dockerdocker.iodocker-engine。如果已经安装这些程序,需要先卸载它们以及相关依赖项。

bash
#1.卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

6.2安装依赖包

在Ubuntu上,需要安装证书和工具,让apt可以通过HTTPS使用仓库。

bash
#1.更新apt索引
sudo apt-get update

#2.安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release

6.3配置Docker仓库

bash
#1.添加阿里云GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#2.设置阿里云仓库地址
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

6.4安装Docker Engine

bash
#1.更新apt软件包索引
sudo apt-get update

#2.安装Docker社区版
sudo apt-get install docker-ce docker-ce-cli containerd.io

6.5启动并验证Docker

bash
#1.设置Docker开机自启
sudo systemctl enable docker

#2.启动Docker
sudo systemctl start docker

#3.查看Docker版本
sudo docker version

#4.测试运行hello-world
sudo docker run hello-world

#5.查看已经下载的镜像
sudo docker images

#6.清理镜像为<none>的虚悬镜像
sudo docker image prune -f

7.卸载Docker

bash
#1.卸载Docker相关依赖
sudo apt-get purge docker-ce docker-ce-cli containerd.io

#2.删除Docker资源目录
sudo rm -rf /var/lib/docker

#3.删除containerd资源目录
sudo rm -rf /var/lib/containerd

说明:/var/lib/docker是Docker的默认工作路径。Ubuntu彻底卸载通常使用purge

8.Docker底层原理

8.1Docker Engine组成

Docker Engine是一个客户端-服务器应用程序,主要包含以下组件:

  • 服务器:长期运行的守护进程,也就是dockerd命令。
  • REST API:用于指定程序如何和守护进程通信,并告诉守护进程要做什么。

8.2Client Server工作方式

Docker是一个Client Server结构的系统。Docker守护进程运行在主机上,然后通过Socket连接从客户端访问。

守护进程从客户端接收命令,并管理运行在主机上的容器。容器就是一个运行时环境,也就是常说的集装箱。