发布时间:2024-11-21 人气:119次
为什么出现 Docker?传统的开发和部署存在着许多环境和配置的不兼容的问题,docker 就是将环境和代码统一打包的来解决这些兼容问题。Docker 是一个统一了运行环境和配置问题的虚拟容器技术,是一个内核级虚拟技术。使用镜像,保证了处处环境的一致性。
掌握 docker 等容器技术是已经成为了必备技能,尤其对于云原生环境应用的构建、部署,docker 又是最关键的基础。
简介
我们知道,如果将计算机的层次做一下简单的划分,最底层是硬件,最上层是软件,中间是操作系统
我们非常熟悉的虚拟机,就是一个物理硬件层抽象,运行在硬件之上:它向下面对一套硬件和硬件接口,对其进行虚拟,然后向上提供一套独立的操作系统,然后就可以在操作系统之上再运行各种软件应用等
这就使得虚拟机这个东西非常庞大沉重,启动时间长,且不容易移植,因为我们知道,在安装操作系统的时候,会根据硬件的不同编译出不同的内核,而每台电脑的硬件配置几乎不会完全一样,因而直接把一台电脑的操作系统文件拷到另一台一般是没法启动的
而容器是一个应用层抽象,运行在操作系统之上的,确切地说是操作系统内核之上(如下图左),面对的是操作系统提供的接口,属于进程级别;容器对我们的代码和依赖进行打包,比如一个 docker 中只有一个 python3,还有 TensorFlow 以及其他的 package(经常会在一个 docker 中发现连“sudo”命令都没有);这样体积就很小,启动快(几秒几毫秒),且容易移植(不同硬件上的同一操作系统向上提供相同的接口)。
可以将容器镜像看作是 mini 版的虚拟机,但两者并不相通,先来看看二者优缺点。
优缺点
传统的虚拟技术要在一个机器上安装虚拟机、各种软件,再部署应用,存在一系列的缺点:
需要虚拟出一套完整的硬件后,运行一个完整的操作系统,在系统上运行所需的应用程序
启动慢
资源占用多
冗余步骤多
迁移困难
而 Docker 使用容器化技术完美的解决了这些问题,其具备:
直接运行与宿主机的内核
容器内没有自己内核,没有进行硬件虚拟,更轻量
容器相互隔离,互不影响
更快交付、部署
便捷升级和扩容
统一标准、更简单的运维
节约成本
有了容器化技术对于应用的部署更加方便,也更好维护,这也促使云原生的发展。
docker 架构
Docker 架构分为客户端-服务器架构和主从架构,具体如下:
客户端-服务器架构:Docker 采用客户端-服务器架构,其中客户端是 Docker 命令行工具,用于与 Docker 服务端通信。Docker 服务端是 Docker 引擎,负责管理和运行 Docker 容器。客户端和服务端可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。
主从架构:Docker Swarm 是一个用于管理多个 Docker 容器的集群工具,采用主从架构。Docker Swarm 集群由一个管理节点和多个工作节点组成,管理节点负责整个集群的管理和调度,工作节点负责运行 Docker 容器。管理节点和工作节点可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。
docker 所安装的镜像在本地都是一个个文件,可以通过docker info查看存储位置
Docker 三大组件
镜像(Image):一个 root 文件系统的模板,相当于 一个类
容器(Container):docker run 镜像就是容器(最小的 linux 内核文件和运行的应用程序),镜像和容器的关系,就像是面向对象程序设计中的类 和实例一样,镜像是静态的定义,容器是镜像运行时的实体
仓库(Repositry):保存镜像的仓库,每个仓库可以包含多个 Tag,对应不同的镜像
安装
本文基于 ARM 架构 Centos7 虚拟机安装的,如果你的环境和我不一致,可以参考官方安装文档[1]或其他资料
卸载掉机器上可能存在的 docker 相关依赖,如果你没有安装过,可以忽略此步骤
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
配置 docker 仓库地址
sudo yum install -y yum-utils
# 设置ali仓库加速地址
sudo yum-config-manager \
--add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
下载 docker 这里你可以根据自己的需求安装指定版本的 docker,不指定版本默认 latest 最新版本
# 查看可安装的版本
yum list docker-ce --showduplicates | sort -r
# 这里安装最新版
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动 docker 并配置开机自启
systemctl enable docker --now
查看 docker 状态
# 查看运行状态
systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2023-03-23 22:22:10 CST; 7h left
Docs: https://docs.docker.com
Main PID: 1406 (dockerd)
Tasks: 9
Memory: 100.0M
CGroup: /system.slice/docker.service
└─1406 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 查看版本
docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:49:05 2023
OS/Arch: linux/arm64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:47:21 2023
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
运行hello-world镜像
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
以上运行hello-world镜像时需要先从远程仓库下载镜像到本地,然后才可以运行,由于 docker 的官方仓库在国外,对于国内用户访问比较慢,因此需要配置一些国内镜像加速地址,才会加快下载速度
配置
配置vim /etc/docker/daemon.json没有此文件的可以自行创建 json 文件
{
"registry-mirrors": [
// aliyun
"https://xxxxxx.mirror.aliyuncs.com",
// 网易
"https://hub-mirror.c.163.com",
// 腾讯
"https://mirror.ccs.tencentyun.com",
// 国内docker
"https://registry.docker-cn.com",
// 科大
"https://docker.mirrors.ustc.edu.cn"
]
}
更多配置参考 👉官方 daemon 配置文档[2]
修改了配置文件后需要重启服务:
systemctl daemon-reload
systemctl restart docker