文章目录
- 1虚拟化技术
- 1.1 硬件级虚拟化
- 1.2 操作系统级虚拟化
- 2 Docker是什么
- 2.1 Docker介绍
- 2.2 容器和虚拟机的区别
- 2.3 为什么使用Docker
- 3 Docker运行环境部署
- 3.1 Docker安装
- 3.2 Docker服务启动
- 4 Docker核心组件
- 4.1 镜像
- 4.1.1 镜像的基本概念
- 4.1.2 镜像的组成结构
- 4.1.3 镜像的日常操作
- 4.2 容器
- 4.2.1 容器的基本概念
- 4.2.2 容器的日常操作
- 4.3 仓库
- 4.3.1 仓库的基本概念
- 4.3.2 仓库的日常操作
- 5 Docker的运行机制
- 5.1 第一个Docker容器
- 5.2 进入Docker容器
- 5.3 客户机访问容器
- 6 Docker Compose容器编排
- 6.1 docker-compose命令
- 6.2 docker-compose一键部署微服务
- 7 私有Docker仓库搭建
- 8 Docker常用命令总结
1虚拟化技术
在介绍Docker之前,先了解一下,虚拟化技术是什么?
虚拟化(Virtualization
) 是一种计算机资源管理技术,它将计算机的各种硬件资源,比如磁盘、网络、CPU、内存等硬件资源,予以抽象和转换,从而呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破了计算机硬件资源不可切割的问题,使我们可以更加充分更加合理地利用计算机硬件资源。
虚拟化一般分为:
- 硬件级虚拟化(hardware-level-virtualization)
- 操作系统级虚拟化(os-level-virtualization)
1.1 硬件级虚拟化
硬件级虚拟化
是运行在硬件之上的虚拟化技术,它的核心技术是Hypervisor,Hypervisor是一种运行在基础物理服务器硬件之上的软件层,可以虚拟化硬件资源,例如cpu、硬盘、内存、网络资源等,然后我们可以通过在虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机,像VMWare
,VirtualBox
等都是使用了该技术。
通过Hypervisor层,我们可以创建不同的虚拟机,并且每个虚拟机都是隔离独立的,这样一来,我们就可以在一台硬件服务器和操作系统之上虚拟化出多个虚拟服务器,用来部署我们的应用。
该种虚拟化优缺点:
- 优点:
一台物理服务器可以虚拟化出多个虚拟的服务器,让计算机资源得以充分利用
- 缺点:每创建一个虚拟机的时候,都会创建一个操作系统,这个操作系统会占用很多资源,这样无疑大大的增加了资源的消耗,当安装的虚拟机越多,资源消耗就越多;另外,环境兼容性问题,开发时的环境运行正常,部署到虚拟机环境测试则有可能发生异常。
基于硬件级虚拟化技术的缺点和不足,随着技术的发展,后续又发展出来了另一种虚拟化技术,即操作系统级虚拟化技术
。
1.2 操作系统级虚拟化
操作系统级虚拟化
是运行在操作系统之上的虚拟化技术,它模拟的是运行在一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,该技术也称为容器化技术
,在容器化技术领域,Docker
是目前最流行的一种实现;
2 Docker是什么
2.1 Docker介绍
Docker发布于2013 年,基于LXC技术,LXC
是Linux 平台上的容器化技术实现。LXC是Linux Container的简写,它是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,它与宿主机使用同一个内核,性能损耗小,这种技术是Linux提供的,但是直到Docker出世,该技术才被发挥出来。
-
Docker 是一个开源的应用容器引擎,它基于 Google 公司推出的
Go
语言实现,项目代码托管在 GitHub 上进行维护
https://github.com/docker/docker-ce -
Docker技术让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,打包好的容器可以发布到任何流行的 Linux 服务器上运行,这样就可以解决开发环境与运维环境不一致的问题了,所以
容器技术解决了开发和运维之间的矛盾,让开发专注于开发,运维专注于运维,不要被环境问题所打扰
; -
Docker彻底释放了虚拟化的威力,极大降低了计算机资源供应的成本,Docker 重新定义了程序开发测试、交付和部署过程,
Docker
提出了“构建一次,到处运行
”的理念,让应用的开发、测试、部署和分发都变得前所未有的高效和轻松。 -
Docker是一种轻量级的操作系统虚拟化解决方案,Docker 的基础是 Linux 容器(LXC)技术,在LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。Docker 自开源后受到广泛的关注,Docker最早是基于Ubuntu开发的,但后续CentOS、Debian、Fedora等主流的Linux操作系统都支持Docker。
简单地说,Docker是对软件和其依赖环境的标准化打包(集装箱),应用之间相互隔离,共享一个OS Kernel(解决了资源浪费的问题),可以运行在很多主流操作系统上。但是也需要澄清一下,Docker本身不是容器,Docker只是管理容器的引擎。
2.2 容器和虚拟机的区别
容器
是将代码和环境的关系打包在一起的一个集合,而虚拟机
是在物理层面上,分出来的一个操作系统。
多个容器可以运行在同一台物理服务器上,并共享一个操作系统的内核资源。多个虚拟机也可以运行在同一台机器上,但每个虚拟机都需要一个完整的操作系统。
容器是在本地操作系统层面上实现虚拟化,直接复用本地主机的操作系统,不需要单独安装操作系统,而传统的虚拟化技术方式则需要单独安装每个虚拟机的操作系统。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
磁盘空间 | 一般为几十MB | 一般为10GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
操作系统 | 与宿主机共享OS | 宿主机系统上运行虚拟机OS |
2.3 为什么使用Docker
作为一种新兴的虚拟化技术,Docker 跟传统的虚拟化方式相比具有众多的优势。
- Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
- Docker对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
- 容器除了运行其中的应用外,基本不消耗额外的系统资源,使得应用的性能很高。传统虚拟机方式运行 10 个完全不同的应用可能我们会起10个虚拟机来部署,而Docker 只需要启动 10 个隔离的应用即可。
- Docker可以更快速的交付和部署,大量地节约开发、测试、部署的时间,对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
- 更高效的虚拟化,Docker 容器的运行不需要额外的 Hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
- 更轻松的迁移和扩展,Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性可以让用户轻松地把一个应用程序从一个平台直接迁移到另一个平台。
3 Docker运行环境部署
3.1 Docker安装
Docker官方网站:https://www.docker.com/
Docker从2013年 3月 20 日发布 Docker 0.1,到现在已经发布了多个版本,从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本:Docker CE
和 Docker EE
。
- Docker CE 即社区免费版,可永久免费使用
- Docker EE 即企业版,功能更全,更强调安全,但需付费使用
限于篇幅,Docker运行环境,可以参考我另一篇内容介绍:https://blog.csdn.net/smilehappiness/article/details/138447627
3.2 Docker服务启动
-
按照3.1步骤 安装Docker之后,通过下面的命令启动或者停止
Docker
服务
启动Docker:systemctl start docker
或者service docker start
停止Docker:systemctl stop docker
或者service docker stop
重启Docker:systemctl restart docker
或者service docker restart
-
检查docker进程的运行状态
systemctl status docker
或者service docker status
-
查看docker进程:
ps -ef | grep docker
-
查看docker系统信息
docker info
-
查看所有的帮助信息
docker --help
-
查看某个commond命令的帮助信息
docker commond --help
比如:docker ps --help
4 Docker核心组件
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,Docker 容器
通过 Docker 镜像
来创建。
Docker 包括三个核心要素:镜像(Image)
、容器(Container)
、仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。Docker 的运行离不开以上核心几个组件的支持,Docker的成功也是拜这几个组件所赐。注意,不能错误地理解为Docker就是容器,实际上Docker不是容器,而是管理容器的引擎
。(守护进程)
4.1 镜像
4.1.1 镜像的基本概念
Docker镜像就是一个只读的模板,可以用来创建Docker容器。
例如:一个镜像可以包含一个完整的 centos 操作系统环境,里面仅安装了 mysql 或用户需要的其它应用程序。Docker提供了一个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
4.1.2 镜像的组成结构
镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个root文件系统rootfs,root文件系统通常是某种操作系统的运行环境,比如centos、Ubuntu,在root文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成docker中的镜像。
4.1.3 镜像的日常操作
-
下载镜像
从docker hub
官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如docker search redis
进行搜索,然后下载所需要的镜像。
比如下载redis镜像:docker pull redis:latest
其中,reids
是查询到的镜像名称,latest
是镜像的标签tag
获取一个
镜像
有两种方式,一种是从官方镜像仓库下载
,一种是自己通过Dockerfile文件构建
。如果有官方镜像,我们就不必自己用Dockerfile文件构建了,除非官方没有才会自己去Dockerfile文件构建。 -
列出已经下载的镜像
docker images
,或者docker images redis
,或者docker image ls
-
运行镜像
docker run -d redis
其中-d表示在后台运行
然后通过ps -ef | grep redis
可以查到redis进程 -
查看容器镜像的状态
docker ps
,使用docker ps -a
可以查看所有的容器 -
进入容器
docker exec -it 容器ID bash
其中,bash也可以写成/bin/bash
-
删除镜像
docker rmi redis:latest(或者镜像id)
注意是rmi
,不是rm
,rm是删除容器,如果必要,可以加上-f
强制删除
4.2 容器
4.2.1 容器的基本概念
容器是从镜像创建的运行实例,它可以被启动、停止、删除,每个容器都是相互隔离的、保证安全平台,可以把看做一个简易版的 Linux环境,包括root用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序。Docker利用容器来运行应用,镜像是只读的,容器在启动的时候创建一层可写层作为最上层;
4.2.2 容器的日常操作
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将处于终止状态的容器重新启动
-
启动命令
docker start 容器id或容器名称
已经停止的容器,我们可以使用命令 docker start 来重新启动 -
通过镜像启动容器
docker run -d redis
-
查看运行中的容器
docker ps
-
查看所有的容器
docker ps -a
-
停止容器
docker stop 容器id或容器名称
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器 -
删除容器
docker rm 容器id或容器名称
删除容器时,容器必须是停止状态,否则会报错,如果强制删除,可以指定-f
参数 -
进入容器
docker exec -it 容器id或容器名称 bash
还可以使用docker inspect + 容器id或容器名称
查看容器的更多信息(元信息) -
停用全部运行中的容器
docker stop $(docker ps -q)
-
删除全部容器
docker rm $(docker ps -aq)
-
一条命令实现停用并删除容器
docker stop $(docker ps -q) & docker rm -f $(docker ps -aq)
4.3 仓库
4.3.1 仓库的基本概念
仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务器(Registry)看做同一事物,并不严格区分,实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)
和私有仓库(Private)
两种形式,最大的公开仓库是 Docker Hub (https://hub.docker.com/),存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来即可。Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
4.3.2 仓库的日常操作
用户可通过 docker search
命令来查找官方仓库中的镜像:
docker search rabbitmq
可以看到返回了很多包含关键字的镜像,其中包括镜像名字
、描述
、星级(表示该镜像的受欢迎程度)
、是否官方创建
、是否自动创建。
官方的镜像说明是官方项目组创建和维护的,automated 资源允许用户验证镜像的来源和内容。根据是否是官方提供,可将镜像资源分为两类;
-
一种是类似 rabbitmq 这样的基础镜像,被称为基础或根镜像,这些基础镜像是由 Docker 公司创建、验证、支持、提供,这样的镜像往往使用单个单词作为名字。
-
还有一种类型,比如 bitnami/rabbitmq 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀,可以通过前缀 user_name/ 来指定使用某个用户提供的镜像,比如 bitnami用户。
将镜像拉取到本地:
docker pull rabbitmq
5 Docker的运行机制
我们知道Docker并不是容器,而只是一个管理容器的引擎。
Docker的底层运行原理,按照如下1~4步骤:
- 1 Docker服务启动
- 2 下载镜像
- 3 启动该镜像得到一个容器
- 4 容器里运行着我们想要的程序
5.1 第一个Docker容器
根据Docker的运行机制,我们将按照如下步骤运行第一个Docker容器。
1、将Docker服务启动
2、下载一个镜像,Docker 运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub公共注册服务器中的仓库:https://hub.docker.com)
从docker hub官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如 docker search redis
进行搜索,然后下载所需要的镜像
-
下载镜像
docker pull redis
-
运行镜像
docker run redis
前台运行, 如果需要后台运行,加参数-d
显示本地已有的镜像:docker images
在列出的信息中,可以看到几个字段信息:
REPOSITORY
:来自于哪个仓库,比如 redis
TAG
:镜像的标记,比如 latest最新的
IMAGE ID
:镜像的 ID 号(唯一)
CREATED
:创建时间
SIZE
:镜像大小 -
启动下载下来的镜像得到一个容器:
docker run -d redis
或者docker run -d 7614ae9453d1(镜像ID)
默认是前台启动,如果需要后台启动,指定-d参数;
通过ps -ef | grep redis
查看,检查redis镜像是否启动容器成功
5.2 进入Docker容器
-
查看运行了哪些容器
docker ps
,使用docker ps -a
可以查看所有的容器 -
停止某个容器
docker stop 容器ID/名称
docker stop 7614ae9453d1(容器ID)
或者docker stop redis
-
进入容器
docker exec -it 7614ae9453d1(容器ID) bash
其中i
表示交互式的,也就是保持标准输入流打开,t
表示虚拟控制台,分配到一个虚拟控制台 -
退出容器
exit
5.3 客户机访问容器
从客户机上访问容器,需要有端口映射,docker容器默认采用桥接模式与宿主机通信,需要将宿主机的ip端口映射到容器的ip端口
停止容器:docker stop 容器ID/名称
启动容器:docker run -d -p 6379:6379 redis
6 Docker Compose容器编排
基于微服务架构的应用系统一般都包含若干个微服务,每个微服务一般都会集群部署多个实例,如果每个微服务都要手动启动与停止,那么效率非常低、工作量也非常大,那么使用 Docker Compose可以轻松、高效地管理多个容器。
Docker Compose 是一个用于定义和运行多容器的Docker应用的工具,使用Docker Compose,你可以在一个配置文件(yaml格式)中配置应用的所有服务,然后使用一个命令即可创建并启动配置文件中所配置的所有服务
。
代码示例:
# 定义compose语义版本
version: '3.8'
# 定义服务
services:#第一个服务名称xxl-job:image: xuxueli/xxl-job-admin:2.3.0container_name: xxl-jobrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: en_US.UTF-8PARAMS: '--spring.config.location=/application.properties'volumes:- "/opt/docker-server/xxl-job/logs:/data/applogs"- "/opt/docker-server/xxl-job/conf/application.properties:/application.properties"ports:- "9999:9999"networks:- conf_mynetnetworks:conf_mynet:external: true
6.1 docker-compose命令
docker-compose的命令与docker命令极为相似,用法上没有区别,下面列出它特有的几种命令:
-
up
创建并启动容器
docker-compose up -d --scale 服务名=数字
-d
表示后台运行,scale
是表示对应的服务同时启动几个容器 -
down 停止并删除容器
docker-compose down
会停掉容器,并删除掉容器,如果不希望删除容器,需要使用stop
6.2 docker-compose一键部署微服务
- 编写docker-compose.yml文件
- 启动服务,执行:
docker-compose up -d
- 关闭服务,执行:
docker-compose down
- 启动两个xxl-job服务,执行:
docker-compose up -d --scale xxl-job=2
7 私有Docker仓库搭建
限于篇幅,这部分内容,在下一篇Docker进阶篇实现
8 Docker常用命令总结
-
查看docker下的所有本地镜像
docker images
或者docker image ls
-
查看正在运行的容器
docker ps
-
查看所有容器(包括未运行的)
docker ps -a
-
查看容器详细信息
docker inspect <container_id>
-
查看容器的实时日志
docker logs -f <container_id>
-
查看容器的CPU和内存使用情况(需要安装
docker stats)
docker stats
-
删除docker 容器
docker rm -f <container_id_or_name>
-
使用命令docker rmi -f IMAGE_NAME_OR_ID来强制删除正在被一个或多个容器使用的镜像,即使有容器正在使用它。例如,要强制删除名为my_image的镜像,可以运行docker rmi -f my_image
docker rmi -f IMAGE_NAME_OR_ID
-
进入容器内部
docker exec -it redis bash
-
Docker Compose 允许你通过命令行一次指定多个 docker-compose.yml 配置文件。这样可以让你在不同的文件中组织和管理服务定义,便于复用和分模块管理。要指定多个文件,你可以使用 -f 或 --file 选项多次,每次后面跟一个文件路径。
docker-compose -f file1.yml -f file2.yml up -d
-
启动docker
systemctl start docker
-
配置docker开机自启
systemctl enable docker
-
查看docker运行状态
systemctl status docker
-
创建桥接网络
docker network create my-network
-
可以通过docker network ls命令列出所有网络
docker network ls
-
docker中 8080:8080两个端口含义
在Docker中,8080:8080 是端口映射的表示方式,用于连接Docker容器内的服务端口到主机系统的端口。这种映射使用的是 -p 参数,允许外部访问容器内的服务。具体来说,8080:8080 意味着: 左边的数字(8080)是 主机端口(Host Port),即你的机器上的端口号。在这个例子中,你将你的主机系统的8080端口对外开放。 右边的数字(8080)是 容器端口(Container Port),即Docker容器内部应用监听的端口号。这意味着容器内的应用(比如一个Web服务器)监听8080端口,外部可以通过主机的8080端口与之通信。 当您运行一个Docker容器,并使用 -p 8080:8080,你实际上是告诉Docker将主机的8080端口的所有网络流量转发到容器的8080端口。这样,外界可以通过访问 http://localhost:8080 来与容器内的应用交互,即使应用实际运行在容器的隔离环境中。 例如,如果你正在运行一个基于Nginx的Docker镜像,通常Nginx配置为监听80端口,你可以使用 -p 8080:80 来映射,这样就可以在本地浏览器中通过 http://localhost:8080 访问Nginx服务,而无需改变Nginx的配置。 请注意,如果你有多个容器都试图映射到同一个主机端口,Docker会抛出错误,因为端口冲突。如果你希望多个容器共享同一主机端口,可以使用端口映射的随机分配 (-P),或者使用端口映射范围 (-p 8080-8081:80)。
-
查看docker命令使用说明
格式:docker 命令 --help,如:
docker build --help
,可以查看docker的build命令使用说明 -
容器里面可以通过 ls -l查询目录信息,ll不支持,只支持ls
ls -l
写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!
如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!
给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!