前言
容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,容器技术可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性。由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此容器技术(Container)结合虚拟化技术的解决方案正在我们的业务使用中高频使用。
容器的集装箱概念是参照了航运中的集装箱概念,在航运中不关心你运输的是汽车还是棉花,它都通过集装箱将运输的流程规范成了标准化的操作,这里容器的使命也是一样,容器具备自包含的能力,将自身程序所依赖的程序全部包含在了容器中,通过Docker将底层环境打平,用户可以将一个容器镜像运行在任何操作系统的宿主机上,也就是Docker所说的"Build once, Run anywhere"。
容器它的优势有以下几点:🍉
-
不再依赖于独立的操作系统运行,相比较虚拟机它没有每个独立的操作系统,突破了宿主机的磁盘IO性能,减少了资源使用的浪费。
-
容器时应用程序层的抽象,对于运维和开发来说,容器只关心中间件之上的应用,中间件与宿主机的操作系统之间的问题都交给了Docker来处理。
-
它是自包含程序依赖,这也是它成为云原生应用基石的重要因素,有兴趣的同学可以查询云原生应用12要素进行学习。
由于容器的优势使得我们在底层资源使用上资源使用率近一步提高,通过过往资源使用率的统计,原有云主机部署服务底层资源使用率只有10~20%,在容器技术加入以后,这一数值也提高到了40~50%
Docker的核心概念
这里值得一提的是,Docker作为容器化软件的一种,是社区使用率最高的容器引擎,但Docker并不等于容器,容器引擎有很多种,例如rkt和近期社区火热的kata。
Docker的核心概念有以下3点🍉
-
镜像(image)
-
容器(Container)
-
仓库(Registry)
Docker的整个运行逻辑如这个图所示,通过Docker Client将需要执行的Docker命令发送给Docker运行的节点上的Docker daemon,Docker daemon将我们的请求进行分解执行,例如我们执行Docker build命令它会根据Dockerfile构建一个镜像存放于本地,执行Docker pull命令会从远端的容器镜像仓库拉取镜像到本地,执行Docker run命令会将容器镜像拉取并运行成为容器实例。
这里我们从容器镜像开始讲解。
了解容器镜像先要了解linux系统的基础知识,典型的linux启动到运行需要2个FS,一个是rootfs,一个是bootfs。
bootfs是linux启动时进行加载的,会安装系统所使用的kernel内核,创建完成后bootfs会进行解绑。
rootfs是我们真正去使用linux是操作的系统文件系统,包含/dev /bin等目录,对于我们构建容器镜像来说,我们利用rootfs作为我们的基础镜像来使用,一个精简的os来说,它的rootfs可以很小,只需要包括基本的命令和工具即可,例如alpine只有不到10MB。
镜像构建基于一个基础镜像将我们需要进行安装的依赖和程序根据Dockerfile编写逐层叠加到镜像中,这里涉及到了一个容器镜像的概念就是,镜像分层,镜像的每一层都会有一个独立的id,Docker使用Union FS对Docker镜像进行分层和合层记录,当我们使用同一个基础镜像时,利用Docker镜像分层的功能可以帮助我们使用到已有的镜像层,拉取没有的镜像层,达到镜像的资源共享,减少重复镜像层拉取,达到资源使用最大化。
容器运行时会在容器镜像最上层生成一个Container层,这个层是copy这个完整的镜像加载到内存中运行,在这个层级中对于容器来说是可以进行修改的,但是由于运行于内存中,我们对Container层的任何修改都不会对底层镜像生效,当容器消亡时我们修改的数据也一并消亡,这就是容器的copy on write特性。
安装Docker🍉
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS7安装Docker。官网: https://www.docker.com
java
# 1、yum包更新到最新
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定你下载docker软件的网址
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y---下载并安装docker-ce[社区版] docker-ee[企业版]
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
配置Docker镜像加速器🍉
默认情况下,将来从docker hub (https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
阿里云
网易云
腾讯云
在这里我使用的是阿里云
把上面选中的代码复制---在centos中直接执行就行了。
docker使用🍉
docker服务的命令🥝
java
停止docker服务: systemctl stop docker
启动docker服务: systemctl start docker
重启docker服务: systemctl restart docker
开机启动docker服务: systemctl enable docker
镜像的命令🥝
- 从仓库中搜索相关的镜像:
java
docker search 镜像名
例如: docker search mysql
- 拉取镜像到本地
docker pull 镜像名:版本号 ===如果没有跟版本号,那么它会拉取最新的latest
3.查看本地有哪些镜像:
docker images
4.删除本地指定的镜像
docker rmi 镜像名:版本号 或镜像编号
删除所有的镜像: docker rmi $(docker images -q) [慎用]
5.帮助命令
docker --help [找到所有的docker命令]
docker 命令 --help [命令的语法]
容器的命令🥝
运行centos容器:并进入到容器内
java
docker run -it --name=c1 centos:7 /bin/bash
--------------------------------------------------------
-i:进入容器内部
-t:交互平台 ===它几乎和-i一起使用。
--name: 为容器起个名称--如果没有使用--name那么docker为自动分配一个名字
centos:7===镜像名:版本号
/bin/bash===提供一个shell命令窗口
退出容器:
java
exit: ---会关闭容器
ctrl+q+p:--退出不会关闭容器:
查看当前的容器:
java
docker ps: 查看所有正在运行的容器
docker ps -a:查看所有的容器。
docker ps -aq: 查看所有容器的id
创建一个容器不进入到该容器内部
java
docker run -id --name=容器的名称 centos:7 /bin/bash
进入指定的容器内部:---使用exit不会关闭容器。
java
docker exec 容器的id或者容器的名称 /bin/bash
关闭|启动|删除容器:
java
docker stop 容器名|容器id
docker start 容器名|容器id
docker rm 容器名|容器id [只能删除停止的容器]
docker rm -f 容器名|容器id [强制删除容器]
docker rm -f $(docker ps -aq): 删除所有容器
数据卷🥝
window系统是否可以直接把文件复制到容器中:----不能--但是可以间接复制过去
为了保证容器数据的可靠性,----需要把容器内部的某个目录--挂载到宿主机中的某个目录中。==
宿主机中的这个目录就是数据卷
如何配置数据卷--volume
例子:
java
docker run -id --name=c2 -v /usr/app:/usr/ykq -v /usr/app2:/usr/ykq2 centos:7 /bin/bash