【Docker】docker基础

文章目录


一、Docker是什么?

Docker本质

Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术, Docker 只是把这种技术在使用上简易普及了。 Docker 在早期的版本其核心就是 LXC 的二次封装发行版。

Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是 "Build, Ship and Run Any APP, Anywhere",即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到 "一次封装,到处运行"。

早期 Docker 利用 LXC 做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件, image 文件),镜像文件集中放在一个仓库中。当需要创建容器时, Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以, Docker 极大的简化了容器的使用难度。以后我们创建启动容器,只需要一个命令, docker-rundocker-stop 就可以启动停止一个容器了。

Docker 早期是基于 LXC 容器管理引擎实现,当后来成熟之后, Docker 自建了一个容器引擎叫 libcontainer,后来 CNCF 的介入, Docker 又研发了一个工业化标准的容器引擎 runC,目前所使用的新版 Docker,所使用的容器引擎就是 RunC。

一般部署应用程序的过程:

docker部署应用程序的过程:


Docker和虚拟机的区别

docker vs 虚拟机

Docker 为什么比虚拟机资源利用率高,启动快?

  • docker 有比虚拟机更少的抽象层。 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。 docker 利用的是宿主机的内核,而不需要Guest OS,节省了 Guest OS 占用的资源。

  • docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个docker 容器只需要几秒钟。


Docker 和 JVM 虚拟化的区别?


二、Docker版本

Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是 docker-ce

  • lxc: lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。

  • libcontainer: docker 从 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc。在 1.11 版本拆分出 runc 后,libcontainer 也随之成为了 runc 的核心功能模块, runc 后续变成了容器标准。

  • moby: moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby,事实上这个 moby 就是 dockerd 目前使用的开源项目名称, docker 项目中的 engine(dockerd)仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。 moby官网

  • docker-ce : docker 的开源版本, CE 指 Community Edition。docker-ce 中的组件来自于 moby、 containerd 等其他项目。docker-ce官网

  • docker-ee : docker 的收费版本, EE 指 Enterprise Edition。其基础组件来源和docker-ce 是一样的,但附加了一些其他的组件和功能。docker-ee官网


三、Docker官方网站

打开Docker官方网站,我们可以看到官网首页有docker的产品、面向开发者、docker的收费标准和一些相关博客等等,这里我们主要关注一下docker面向开发者的文档。



四、Docker架构

Docker 使用 客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器、Docker 容器通过 Docker 镜像来创建

  • Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub 提供了庞大的镜像集合供使用。
  • Docker daemon:Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护进程。
  • Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
  • Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
  • Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
  • Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。
  • Docker 容器(Container):容器是独立运行的一个或一组应用。

五、Docker生态

新时代软件述求

我们来考虑 2 个问题, Docker 为什么要设计镜像,然后又搭建个 Docker Hub,搞个镜像仓库呢?我们来看下现在的时代发生了什么?

数据量疯狂增长

随着物联网、边缘计算等智能终端设备不断普及,受到来自物联网设备信号、元数据、娱乐相关数据、云计算和边缘计算的数据增长的驱动,全球数据量呈现加速增长。根据 IDC 分布的《数据时代 2025》预测,全球数据量将从 2018 年的 33ZB 增至 2025年的 175ZB,增长超过 5 倍;中国平均增速快于全球 3%,预计到 2025 年将增至48.6ZB,占全球数据圈的比例由 23.4%提升至 27.8%。其中,中国企业级数据量将从2015 年占中国数据量的 49%增长到 2025 年的 69%。

处理能力快速增加

腾讯云全球服务器数量 100w+,数据量 EB+; 2020 年阿里云:在全国已建成 5 大超级数据中心,阿里云在全球 22 个地域部署了上百个数据中心,服务器的总规模数已经接近 200 万台。

某省疾控中心疫苗预约系统、全员核酸检测系统、健康码系统共 300 余台服务器,并为核酸检测系统快速扩容计算和存储资源。

软件需求爆发式增长

  • 软件发布频繁
    • 研发模式从瀑布开发演变为敏捷开发,原来 3 个月上一次新功能,现在两周一次,而开发过程中我们也经常遇到需要修改需求,然后变更再发布的情况。
    • 软件上线有问题需要快速回滚,对软件有着极强的版本管理和回滚诉求。
  • 软件需要共享
    软件的研发人员、研发公司在设计、研发好一款软件的时候,如何方便的共享给他人,而又能快速的使用起来。
  • 环境搭建复杂,技术种类繁多
    每个项目组使用的语言不一样,需要不同的环境,每个都得搞一套。每次都要从 yum开始一个个完成部署安装,每次都有各种奇怪的问题,运维成本很高。

Docker解决方案

云时代需要我们针对这些诉求有一套针对的解决方案。

  • 我们要处理海量的数据,如何处理呢?
    购买大量的服务器,并研发对应软件
  • 开发的需求需要频繁的变更上线,如何才能将修改的代码快速的分发到几百或者几千台服务器呢?如何共享软件呢?
    搞一个中心仓库,让各个服务器去下载软件包,安装,所以 CentOS 搞了 yum 仓库,docker 设计了镜像仓库, docker hub 是公共的托管仓库。
  • 软件设计好以后,怎么快速安装启动,有问题回滚呢?
    将 docker 需要的所有信息设计一套软件格式,把所有的依赖搞进去,并打上版本标签,这样不会换一个服务器各种问题,所以 Docker 设计了镜像。
  • 不同的开发环境怎么搭建呢,一会 java,一会 c++?
    docker 设计了镜像来应对,镜像里面存放了需要运行的环境,就像我们的 iPhone 内置 ios,我们的华为 mate 50 内置鸿蒙一样,一条命令就可以完成某个环境的搭建。

六、Docker安装

Ubuntu安装(以华为云Ubuntu 20.04为例)

安装依赖

  1. 操作系统版本Plain Text
    Ubuntu Kinetic 22.10
    Ubuntu Jammy 22.04 (LTS)
    Ubuntu Focal 20.04 (LTS)
    Ubuntu Bionic 18.04 (LTS)
  2. CPU 支持
    ARM 和 X86_64

如果使用Ubuntu版的Linux,这里建议安装在20.04版本以上的Ubuntu。

安装docker

💕 确定操作系统版本,本次我们使用的是 Ubuntu 20.04

bash 复制代码
cat /etc/*release*

💕 确定 CPU,可以看到我们的是 X86_64,是支持的,如果是 arm 一般会显示aarch64

bash 复制代码
uname -a

💕 卸载旧版本,如果是新购买的云服务器是没有的,比如输入 docker 并没有这个命令,就不需要卸载

bash 复制代码
sudo apt-get remove docker docker-engine docker.io containerd runc

💕 卸载历史版本

bash 复制代码
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y

这里我们可以看到之前安装docker的数据还没有被删除掉,下面我们需要手动删除一下:

bash 复制代码
#删除目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#如果我们之前修改过目录,那么需要根据具体情况进行删除。例如: sudo rm -rf /data/var/lib/docker sudo rm -rf /etc/docker/daemon.json

💕 配置docker下载源

bash 复制代码
#curl 命令安装
apt install curl -y
bash 复制代码
#创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
#下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
bash 复制代码
# 查看docker源目录
ll /etc/apt/sources.list.d/
# 配置docker源
echo \
"deb [arch=$(dpkg --print-architecture) signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

💕 安装

bash 复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

这里发生了报错,没关系,我们可以使用journalctl命令查看一下报错日志:

bash 复制代码
journalctl -eu docker

执行如下命令修复:

bash 复制代码
#配置加载
systemctl daemon-reload
#启动服务
systemctl start docker

💕 自动启动配置

bash 复制代码
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker

💕 检查安装结果查看版本

bash 复制代码
#检查安装结果查看版本
docker version
#更详细查看docker信息
docker info


红色圈起来的表示docker数据存放的位置。

💕 执行 hello-world 可以看到 Hello from Docker,表面 docker 服务正常

实战经验

见下面的Centos安装docker的实战经验。


CentOS安装(以CentOS 7.9为例)

安装依赖

  1. 支持的操作系统
    Plain Text
    CentOS 7
    CentOS 8 (stream)
    CentOS 9 (stream)
  2. 支持的CPU
    Plain Text
    ARM/X86_64

安装Docker

💕 确认操作系统,本次我们使用的是 Centos 7.9

bash 复制代码
cat /etc/*release*

💕 确定 CPU,可以看到我们的是 X86_64

bash 复制代码
uname -a

💕 卸载旧版本,如果是新购买的云服务器是没有的,比如输入 docker 并没有这个命令,就不需要卸载

bash 复制代码
#检查机器上是否安装有docker
docker
docker version
#卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

💕 卸载历史版本

bash 复制代码
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
#执行卸载--默认安装目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#这个是修改后的目录,根据实际情况设置
sudo rm -rf /data/var/lib/docker
sudo rm -rf /etc/docker/daemon.json

💕 配置仓库

bash 复制代码
# 查看系统仓库的地址
ll /etc/yum.repos.d/
# 安装yum-utils工具包
yum install -y yum-utils
bash 复制代码
#配置repo
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#查看repo
cat /etc/yum.repos.d/docker-ce.repo

💕 配置使用国内源

bash 复制代码
sed -i 's@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

💕 安装最新版本

bash 复制代码
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

💕 启动docker

bash 复制代码
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker

💕 检查安装结果查看版本

bash 复制代码
#查看docker版本
docker version
#更详细查看 docker 信息
docker info


💕 执行 hello-world 可以看到 Hello from Docker,表面 docker 服务正常

bash 复制代码
docker run hello-world

实战经验

💕 docker镜像源修改

创建docker引擎的配置文件daemon.json

bash 复制代码
#进入docker的配置目录
cd /etc/docker/
#创建配置文件
vim daemon.json

修改为国内镜像源

cpp 复制代码
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}

接下来重启配置和docker服务

bash 复制代码
systemctl daemon-reload
systemctl restart docker

最后输入docker info,看到配置修改成功

💕 Docker目录修改

Docker 默认的安装目录为/var/lib/docker, 这里面会存放很多很多镜像,所以我们在安装的时候需要考虑这个目录的空间,有三种解决方案。

  1. 将/var/lib/docker 挂载到一个大的磁盘,这种一般我们能控制挂载目录,像腾讯云这种云厂商在安装 K8s 的节点的时候提供了挂载选项,可以直接挂载这个目录过去
  2. 安装之前挂载一个大的磁盘,然后创建一个软链接到/var/lib/docker,这样就自动安装到我们空间比较大的磁盘了
  3. 安装了 docker,然后发现忘了配置这个目录,我们需要修改 docker 的配置文件。

这里我们采用第三种解决方案

bash 复制代码
#假定我们磁盘的大的目录为 /data
mkdir /data -p
mkdir /data/var/lib/docker -p
#进入源目录
cd /etc/docker/
#编辑配置文件
vim daemon.json
#输入下面的json
{
"data-root": "/data/var/lib/docker"
}
#加载配置
sudo systemctl daemon-reload
#重启docker
sudo systemctl restart docker

输入docker info,我们发现docker的根目录发生了改变:


GUI版本安装(以windows 10为例)

安装依赖

  1. 确认开启虚拟化
  2. 输入win+i,然后输入启用或关闭 Windows 功能
  3. 选择Windows子系统和虚拟机平台
  4. 重启电脑,完成虚拟化设置

安装WSL2

  1. 以管理员身份运行PowerShell
  2. 查看版本,如果不是2需要更新到2
  3. PowerShell 运行命令更新 wsl 到最新版本
bash 复制代码
# 更新wsl版本
wsl --update
#设置wsl默认版本
wsl --set-default-version 2
  1. 通过微软商店安装Ubuntu 22.04.3
  2. 启动安装好的Ubuntu 22.04.3,如图表示启动成功

安装docker

确认我们的Windows下没有安装docker

  • 点击链接下载 Docker Desktop for Windows
  • 右键以管理员身份运行

  • 进入之后需要我们注册登录一下
  • 确认 Docker 安装成功, 在 PowerShell 中输入 docker version 命令确认 Client 和 Server 是否启动


相关推荐
小O_好好学1 小时前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥1 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
john_hjy2 小时前
11. 异步编程
运维·服务器·javascript
x晕x2 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人2 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
tangdou3690986553 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
later_rql3 小时前
k8s-集群部署1
云原生·容器·kubernetes
北京智和信通3 小时前
云平台和虚拟化智慧运维监控,全面提升故障感知与处置能力
运维·虚拟化·云平台·虚拟机监控
fasewer3 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器
楚灵魈3 小时前
[Linux]从零开始的网站搭建教程
linux·运维·服务器