1 什么是Linux容器
容器其实是一种沙盒技术。沙盒像一个集装箱一样把你的应用“装”起来的技术。这样应用与应用之间就因为有了边界而不至于相互干扰;而被装进了集装箱的应用,也可以被方便地搬来搬去。
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
1.2 容器简史
容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。
2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。
2001 Linux 也发布自己的容器技术 Linux VServer,2004 Solaris 也发布了 Solaris Containers,两者都将资源进行划分,形成一个个 zones,又叫做虚拟服务器。
2005 年推出 OpenVZ,它通过对 Linux 内核进行补丁来提供虚拟化的支持,每个 OpenVZ 容器完整支持了文件系统、用户及用户组、进程、网络、设备和 IPC 对象的隔离。
2007 年 Google 实现了 Control Groups( cgroups ),并加入到 Linux 内核中,这是划时代的,为后期容器的资源配额提供了技术保障。
2008 年基于 cgroups 和 linux namespace 推出了第一个最为完善的 Linux 容器 LXC。
2013 年推出到现在为止最为流行和使用最广泛的容器 Docker,相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。
2014 年 CoreOS 也推出了一个类似于 Docker 的容器 Rocket,CoreOS 一个更加轻量级的 Linux 操作系统,在安全性上比 Docker 更严格。
2016 年微软也在 Windows 上提供了容器的支持,Docker 可以以原生方式运行在 Windows 上,而不是需要使用 Linux 虚拟机。
基本上到这个时间节点,容器技术就已经很成熟了,再往后就是容器云的发展,由此也衍生出多种容器云的平台管理技术,其中以 kubernetes最为出众,有了这样一些细粒度的容器集群管理技术,也为微服务的发展奠定了基石。因此,对于未来来说,应用的微服务化是一个较大的趋势。
为什么需要容器
其一,这是技术演进的一种创新结果,其二,这是人们追求高效生产活动的一种工具。
随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务器、公有云、私有云等,由于多种服务之间存在一些依赖关系,所以可能存在应用在运行过程中的动态迁移问题,那这时如何保证不同服务在不同环境中都能平滑的适配,不需要根据环境的不同而去进行相应的定制,就显得尤为重要。
就像货物的运输问题一样,如何将不同的货物放在不同的运输机器上,减少因货物的不同而频繁进行货物的装载和卸载,浪费大量的人力物力。
为此人们发明了集装箱,将货物根据尺寸形状等的不同,用不同规格的集装箱装载,然后再放到运输机上运输,由于集装箱密封,只有货物到达目的地才需拆封,在运输过程能够在不同运输机上平滑过渡,所以避免了资源的浪费。
因此集装箱被誉为是运输业与世界贸易最重要的发明。
Docker 容器的思想就是采用集装箱思想,为应用提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。这样容器就可以跑在任何环境中,因此才有了那句话:
Build Once, Run Anywhere
这种集装箱的思想我们也能从 Docker 的 Logo 中看出来,这不就是一堆集装箱吗?
1.3 容器的基本概念
隔离性:容器在操作系统层面提供了进程、文件系统、网络等资源的隔离,确保每个容器内部的操作不会影响到其他容器或主机系统。
轻量级:与虚拟机不同,容器不需要包含整个操作系统,而是共享主机操作系统的内核。因此,容器的启动速度快,占用的资源少。一般容器以毫秒级启动,而虚拟机是分钟级启动。
可移植性:容器镜像包含应用程序及其依赖的所有软件和库,使得容器可以在任何支持容器运行的环境中运行(例如,开发者的本地机器、测试环境、生产环境等)。
Docker系统有两个程序:docker服务端和docker客户端
Docker服务端:是一个服务进程,管理着所有的容器。也叫docker engine
Docker客户端:扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程
docker服务端和客户端运行在一台机器上
Docker三大核心组件:
Docker 仓库 - Docker registery
Docker 镜像 - Docker images
Docker 容器 - Docker containers
1.4 容器的核心技术实现
Namespaces
- 提供进程、网络、文件系统等资源的隔离,确保每个容器内的进程只能看到并操作属于该容器的资源。比如:命名空间可以提供一个进程相互隔离的独立网络空间,不同的容器间进程pid可以相同,进程并不冲突影响,但可以共享底层的计算和存储资源。
Cgroups
- 管理和限制容器使用的资源(如 CPU、内存、磁盘 I/O 等),确保容器不会超出分配的资源。比如给容器A分配4颗CPU,8G 内存,那这个容器最多用这么多的资源。如果内存超过8G ,会启动swap,效率降低,也可能会被调度系统给kill掉。
白话:Namespace的作用是“隔离”,他让应用进程只能“看到”该Namespace内的“世界”;而Cgroups的作用是“限制”,它给这个“世界”围了一圈看不见的“墙”。如此一来,进程就真的被“装”在了一个于是隔绝的“房间”里。这就是所谓的沙盒!
1.5 容器和虚拟机的区别?
传统虚拟技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:1 资源占用多 2 冗余步骤多 3 启动慢
容器技术
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
为什么docker比VM快?
docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor(虚拟机监视器,管理资源的)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
docker利用的是宿主机的内核,而不需要Guest OS(访客系统|虚拟系统)。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免引寻、加载操作系统内核比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个过程,因此新建一个docker容器只需要几秒钟。
2. Docker简介
2.1 Docker是什么
官网:
开发人员通过Docker将他们的想法变为现实
将软件打包为标准化单元,用于开发、装运和部署
容器是一个标准的软件单元,它封装代码及其所有依赖项,以便应用程序从一个计算环境快速可靠地运行到另一个环境。Docker容器镜像是一个轻量级、独立的可执行软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
容器镜像在运行时会变成容器,在Docker容器的情况下,镜像在Docker引擎上运行时会成为容器。容器化软件可用于基于Linux和Windows的应用程序,无论基础结构如何,都将始终运行相同的软件。容器将软件与其环境隔离开来,并确保它统一工作,尽管存在差异,例如开发和阶段之间的差异。
2013年,Docker推出了集装箱行业标准。容器是一个标准化的软件单元,允许开发人员将应用程序与其环境隔离,解决“它在我的机器上工作”的难题。对于今天数以百万计的开发人员来说,Docker是构建和共享容器化应用程序的事实标准——从桌面到云。我们正在为开发人员和开发团队构建从代码到云的独特连接体验。
2.2 Docker的目标
docker的主要目标是"Build Once, Run Anywhere", 构建,运输,处处运行
- 构建:做一个docker镜像
- 运输:docker pull or push
- 运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs.
2.3 有容器&&没容器
没有容器的时候:
1.rd开发产品(需要配置开发环境)LAMP=Linux+Apache+Mysql+Php
2.测试(需要配置测试环境)LAMP=Linux+Apache+Mysql+Php
3.op上线(需要线上/生产环境)LAMP=Linux+Apache+Mysql+Php
有容器之后:
- rd开发产品(需要在docker容器里配置开发环境)LAMP=Linux+Apache+Mysql+Php
- 把容器打包成镜像交给运维,运维上线。
Docker跟原有的工具区别:
1、 传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;
2、Docker的部署模式是:复制->运行
Docker对服务器端开发/部署带来的变化:
方便快速部署
对于部署来说可以极大的减少部署的时间成本和人力成本
Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念是 Build once, Run anywhere(一次构建,多次部署)
1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
3)方便构建基于微服务架构的系统,通过服务编排,更好的松耦合(解耦);
4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
1、Docker Client(Docker 客户端)
Docker 客户端是用户与 Docker 系统交互的接口。用户通过 CLI 命令(如 docker run
、docker build
)与 Docker 守护进程通信,发出管理容器的各种指令。
2、Dockerd(Docker 守护进程)
Dockerd 是 Docker 的核心守护进程,负责处理来自 Docker 客户端的请求。它管理 Docker 容器、镜像、网络和数据卷,并将请求传递给下一级组件(如 Containerd)。通过 gRPC 与 Containerd 通信。
3、Containerd
Containerd 是一个高级容器运行时,负责管理容器的整个生命周期。它处理容器的创建、执行、挂载存储和网络管理。通过 gRPC 接收 Dockerd 的指令,并进一步传递给 Runc 和 Shim。
4、Runc
Runc 是一个 CLI 工具,用于根据 Open Container Initiative (OCI) 规范创建和运行容器。Runc 实际上负责执行容器的启动、停止等底层操作。它通过 fork
进程来创建容器。
5、Shim
Shim 是一个中介程序,在容器与 Containerd 之间提供隔离。当 Runc 启动容器后,Shim 保持容器运行并将 Runc 从系统进程中分离。这样,如果 Containerd 需要重启或崩溃,容器仍然可以继续运行。
3. Docker安装
CentOS 7 中 Docker 的安装:
Docker 软件包已经包括在默认的 CentOS-Extras 软件源(联网使用centos7u2自带网络Yum源)里。因此想要安装 docker,只需要运行下面的 yum 命令:
# yum install -y epel-release
# yum install docker -y #docker 1.13版本
启动 Docker 服务:
CentOS 6
# service docker start
# chkconfig docker on
CentOS 7
# systemctl start docker.service
# systemctl enable docker.service
确定docker服务在运行:
结果会显示服务端和客户端的版本,如果只显示客户端版本说明服务没有启动
# docker version
Client:
Version: 1.10.3
API version: 1.22
...docker -v
Docker版本与官方安装方式
moby、docker-ce与docker-ee
最早时docker是一个开源项目,主要由docker公司维护。
2017年3月1日起,docker公司将原先的docker项目改名为moby,并创建了docker-ce和docker-ee。
三者关系:
moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品
docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品
moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的docker公司维护。
CentOS--官方安装
Docker官网:https://www.docker.com/
如果是centos,上面的安装命令会在系统上添加yum源:/etc/yum.repos.d/docker-ce.repo
# wget https://download.docker.com/linux/centos/docker-ce.repo
# mv docker-ce.repo /etc/yum.repos.d
# yum install -y docker-ce
或者直接下载rpm安装:
# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
# rpm -ivh docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm --nodeps --force
3.1 国内源安装docker
使用aliyun docker yum源安装新版docker
删除已安装的Docker
[root@docker-server ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
配置阿里云Docker Yum源
阿里云镜像源地址:mirrors.aliyun.com
# yum install -y yum-utils
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装指定版本
查看Docker版本:
# yum list docker-ce --showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上--setopt=obsoletes=0 禁止自动更新参数:
# yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch例如:
# yum install -y --setopt=obsoletes=0 docker-ce-19.03.2 docker-ce-selinux-19.03.2
安装Docker最新版:加上rpm包名的版本号部分或不加都可以:
[root@docker-server ~]# yum install -y docker-ce #默认安装的是最新版本
启动Docker服务:
#systemctl enable docker
#systemctl start docker
查看docker版本状态:
[root@docker-server ~]# docker -v
Docker version 20.10.21, build baeda1f
[root@docker-server ~]# docker version
Client: Docker Engine - Community
Version: 20.10.21
API version: 1.41
Go version: go1.18.7
Git commit: baeda1f
Built: Tue Oct 25 18:04:24 2022
OS/Arch: linux/amd64
Context: default
Experimental: trueServer: Docker Engine - Community
Engine:
Version: 20.10.21
API version: 1.41 (minimum version 1.12)
Go version: go1.18.7
Git commit: 3056208
Built: Tue Oct 25 18:02:38 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.9
GitCommit: 1c90a442489720eec95342e1789ee8a5e1b9536f
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Version: 0.19.0
GitCommit: de40ad0
查看docker运行状态:
# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
...
简单测试
Docker官网镜像网站:https://hub.docker.com/
查看镜像
docker images
查看容器(正在运行的容器):
docker ps
查看所有容器
docker ps -a
运行一个容器
拉取镜像:docker pull +镜像地址
[root@192 ~]# docker run -it daocloud.io/library/ubuntu /bin/bash #运行容器
Unable to find image 'daocloud.io/library/ubuntu:latest' locally
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
Digest: sha256:bc025862c3e8ec4a8754ea4756e33da6c41cba38330d7e324abd25c8e0b93300
Status: Downloaded newer image for daocloud.io/library/ubuntu:latest如果自动进入下面的容器环境,说明ubuntu镜像运行成功,Docker的安装也没有问题:可以操作容器了
root@db8e84e2ea96:/#
**Docker 加速器 **
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度。
Docker 加速器对 Docker 的版本有要求吗?
需要 Docker 1.8 或更高版本才能使用。Docker 加速器支持什么系统?
Linux, MacOS 以及 Windows 平台。Docker 加速器是否收费?
提供永久免费的加速器服务,请放心使用。
打开/etc/docker/daemon.json添加如下内容后,重启docker生效
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"GitHub - DaoCloud/public-image-mirror: 很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
3.2 daocloud国内镜像市场
使用国内镜像:
进入网站:https://daocloud.io/
https://dashboard.daocloud.io/
OpenAtom Foundation - 开放原子开源基金会
[root@docker-server ~]# docker pull daocloud.io/library/nginx #下载镜像
Using default tag: latest
latest: Pulling from library/nginx
0a4690c5d889: Pull complete
9719afee3eb7: Pull complete
44446b456159: Pull complete
Digest: sha256:f83b2ffd963ac911f9e638184c8d580cc1f3139d5c8c33c87c3fb90aebdebf76
Status: Downloaded newer image for daocloud.io/library/nginx:latest
daocloud.io/library/nginx:latest
3.3 阿里云容器镜像服务
配置阿里云的镜像仓库
创建阿里云的公开仓库
公开:在拉取的时候,不需要输入用户名和密码。推送仍然需要输入用户名和密码;
私有:拉取,推送都需要输入用户名和密码;
[root@docker ~]# docker login --username=runfast520 registry.cn-hangzhou.aliyuncs.com
[root@docker ~]# docker tag mysql:8.0 registry.cn-hangzhou.aliyuncs.com/cloud2204/mysql:8.0
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/cloud2204/mysql:8.0
上传成功之后:
使用自己的私有仓库
[root@coding-start ~]# docker login --username=youngfit --password='***' registry.cn-hangzhou.aliyuncs.com
[root@coding-start ~]# docker tag daocloud.io/library/nginx:1.12.0-alpine registry.cn-hangzhou.aliyuncs.com/cloud2204/nginx:1.12
[root@coding-start ~]# docker push registry.cn-hangzhou.aliyuncs.com/cloud2204/nginx:1.12退出登录状态:
docker logout registry.cn-hangzhou.aliyuncs.com
查看上传的镜像
自己的nginx:1.12版本已经上传成功!
阿里云的镜像加速器
配置阿里加速器:
如果这个目录/etc/docker/不存在就创建
[root@docker-server ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://ukblsmil.mirror.aliyuncs.com"]
}
[root@docker-server ~]# systemctl daemon-reload
[root@docker-server ~]# systemctl restart docker