Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

文章目录

  • 1 Docker介绍
    • 1.1 Docker的优势
      • 1.1.1 应用部署的环境问题
      • 1.1.2 Docker解决依赖兼容问题
      • 1.1.3 Docker解决操作系统环境差异
      • 1.1.4 小结
    • 1.2 Docker和虚拟机的区别
    • 1.3 Docker架构
      • 1.3.1 镜像和容器
      • 1.3.2 DockerHub
      • 1.3.3 Docker架构
    • 1.4 安装Docker
      • 1.4.1 卸载旧版本Docker(可选)
      • 1.4.2 安装Docker
      • 1.4.3 启动Docker
      • 1.4.4 配置镜像加速
  • 2 Docker的基本操作
    • 2.1 镜像操作
      • 2.1.1 镜像名称
      • 2.1.2 镜像命令
        • 2.1.2.1 拉取、查看镜像
        • 2.1.2.2 导出、删除、导入镜像
    • 2.2 容器操作
      • 2.2.1 创建并运行一个容器
      • 2.2.2 进入容器,修改文件
      • 2.2.3 其他常用命令
    • 2.3 数据卷
      • 2.3.1 数据卷介绍
      • 2.2.2 数据卷命令
        • 2.2.2.1 创建和查看数据卷
        • 2.2.2.2 挂载数据卷

1 Docker介绍

1.1 Docker的优势

微服务虽然具备各种各样的优势,但服务的拆分通常会给部署带来了很大的麻烦:

  • 分布式系统中,依赖的组件非常多,不同组件之间部署时可能会产生一些冲突;
  • 在数百上千台服务器中重复部署,每台服务器的环境不一定一致,可能会遇到各种问题。

1.1.1 应用部署的环境问题

大型项目组件较多,运行环境也较为复杂,部署时可能会碰到一些问题:

  • 依赖关系复杂,容易出现兼容性问题;
  • 开发、测试、生产环境有差异。

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖库各不相同,甚至会有冲突,这就给部署带来了极大的困难。

1.1.2 Docker解决依赖兼容问题

Docker为了解决依赖的兼容问题的,采用了两个手段:

  • 将应用、Libs(函数库)、Deps(依赖)、配置一起打包,形成可移植镜像。
  • 将每个应用放到一个隔离容器去运行,避免互相干扰。

这样打好的包,既包含应用本身,也包含应用所需要的Libs、Deps,无需再在操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。

1.1.3 Docker解决操作系统环境差异

解决了不同应用的兼容问题,但是开发、测试等环境仍会存在差异,操作系统版本也会有差异。例如,将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,则会报错。

Docker为了解决不同系统环境差异问题,也采用了两个手段:

  • 将应用与所需要调用的系统函数库一起打包。
  • 基于打包的系统函数库,借助于操作系统的Linux内核来运行。

这样打好的包,即包含应用本身,也包含应用所需要的系统函数库,直接基于Linux内核运行,因此可以在任意Linux操作系统上运行。

1.1.4 小结

总的来说,Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
  • 启动、移除都可以通过一行命令完成,方便快捷。

1.2 Docker和虚拟机的区别

Docker可以让一个应用在任何操作系统中非常方便的运行。而虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

两者的区别在于:

  • 虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的 Ubuntu 应用了。
  • Docker仅仅是封装函数库,并没有模拟完整的操作系统。

  • 在性能上,Docker接近原生,虚拟机性能较差;
  • 在硬盘占用上,Docker一般为MB,虚拟机一般为GB;
  • 在启动上,Docker一般为秒级,虚拟机为分钟级。

总的来说,Docker只是一个系统进程,而虚拟机是在操作系统中的操作系统;Docker体积小、启动速度快、性能好,而虚拟机体积大、启动速度慢、性能一般。

1.3 Docker架构

1.3.1 镜像和容器

  • 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
  • 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。因此一个镜像可以启动多次,形成多个容器进程。

1.3.2 DockerHub

DockerHub是一个官方的Docker镜像的托管平台,称为Docker Registry。国内也有类似于DockerHub的公开服务平台,比如网易云镜像服务、阿里云镜像库等。

我们不仅可以从DockerHub拉取镜像,还可以将自己的镜像共享到DockerHub:

1.3.3 Docker架构

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务端发送指令。

1.4 安装Docker

Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期7个月),EE 即企业版,强调安全,付费使用,支持周期24个月。

Docker CE 分为 stable testnightly 三个更新频道。

官方网站上有各种环境下的安装指南,这里主要学习 Docker CE 在 CentOS7 上的安装步骤。

Docker CE 支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7满足最低内核的要求。

1.4.1 卸载旧版本Docker(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载;如果未安装过,可以直接跳过:

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-ce

1.4.2 安装Docker

  • 1)安装yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken

  • 2)更新本地镜像源
# 设置Docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast

  • 3)安装docker-ce
yum install -y docker-ce

1.4.3 启动Docker

Docker应用需要用到各种端口,逐一去修改防火墙设置非常麻烦,因此在使用虚拟机进行学习时可以直接关闭防火墙!但生产环境是绝对不可以的!

  • 1)关闭防火墙
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
  • 2)启动Docker
# 启动Docker服务
systemctl start docker  # 停止Docker服务
systemctl stop docker  # 重启Docker服务
systemctl restart docker  
  • 3)查看Docker版本
docker -v

1.4.4 配置镜像加速

Docker官方镜像仓库网速较差,我们可以设置为国内镜像服务。

参考阿里云镜像加速器文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

按照文档指引执行以下命令,即可完成镜像加速配置:

2 Docker的基本操作

2.1 镜像操作

2.1.1 镜像名称

镜像名称一般由两部分组成:[repository]:[tag]。在没有指定tag时,默认是latest,代表最新版本的镜像。如图:

2.1.2 镜像命令

2.1.2.1 拉取、查看镜像

需求:从DockerHub中拉取一个Nginx镜像并查看。

  • 1)去DockerHub镜像仓库搜索Nginx镜像

  • 2)根据查看到的镜像名称,拉取自己需要的镜像
docker pull nginx

  • 3)查看拉取到的镜像
docker images

2.1.2.2 导出、删除、导入镜像

需求:将Nginx镜像导出磁盘,然后再加载回来。

  • 1)导出Nginx镜像到磁盘

格式:docker save -o [保存的目标文件名称] [镜像名称]

docker save -o nginx.tar nginx:latest

  • 2)删除本地的Nginx镜像
docker rmi nginx:latest

  • 3)读取nginx.tar文件加载Nginx镜像
docker load -i nginx.tar

2.2 容器操作

Docker容器有三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,但并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等资源

2.2.1 创建并运行一个容器

创建并运行nginx容器的命令:

docker run --name nginx -p 80:80 -d nginx

命令解读:

  • docker run:创建并运行一个容器
  • --name nginx: 给容器起一个名字,这里叫做nginx
  • -p 80:80 :将容器端口映射到宿主机端口,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,这里是nginx

特别需要注意-p参数,是将容器端口映射到宿主机端口。默认情况下,容器是隔离环境,直接访问宿主机的80端口,肯定是访问不到容器中的Nginx服务的。

而通过该映射,将容器的80端口与宿主机的80端口关联起来,当访问宿主机的80端口时,就会被映射到容器的80端口,这样就能访问到容器中的Nginx了。如图:

2.2.2 进入容器,修改文件

需求:进入nginx容器,修改html文件内容,添加“我进来了…”

  • 1)进入nginx容器
docker exec -it nginx bash

命令解读:

  • docker exec:进入容器内部,执行一个命令
  • -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • nginx:要进入的容器的名称,执行docker run时指定
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令

  • 2)进入nginx容器的html所在目录/usr/share/nginx/html

容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样。Nginx的环境、配置、运行文件全部都在这个文件系统中,包括要修改的html文件。

cd /usr/share/nginx/html

  • 3)修改index.html的内容

容器内没有vi命令,无法直接修改,但可以使用sed命令来修改:

sed -i -e 's#Welcome to nginx#我进来了...#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
  • 4)访问index.html

在浏览器访问:http://192.168.146.129

2.2.3 其他常用命令

  • 查看nginx容器日志的命令:
docker logs nginx
# 持续查看日志
docker logs nginx -f

  • 查看容器状态:
# 查看正在运行的所有容器
docker ps
# 查看所有容器,包括已经停止的
docker ps -a 

2.3 数据卷

2.3.1 数据卷介绍

在上面的案例中,修改nginx的html页面时,需要进入nginx内部,并且因为没有编辑器,修改文件内容显示很麻烦。

这是因为容器与数据(容器内文件)耦合带来的后果:

  • 不便于修改:要修改容器内的文件,需要进入容器内部;
  • 数据不可复用:在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的;
  • 升级维护困难:升级时删除旧容器,则会把修改的数据一并删掉。

要解决这个问题,则必须将数据与容器解耦,这就要用到数据卷了。

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。例如:

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录上。而操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录

2.2.2 数据卷命令

2.2.2.1 创建和查看数据卷

创建一个数据卷,其名称为html:

docker volume create html

查看所有数据卷:

docker volume ls

查看数据卷详细信息:

docker volume inspect html

可以看到,上面创建的html数据卷关联的宿主机目录是/var/lib/docker/volumes/html/_data

另外,还有两个常用的命令:

# 删除指定数据卷
docker volume rm [name]
# 删除所有未使用的数据卷
docker volume prune
2.2.2.2 挂载数据卷

在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器内的目录,例如:

docker run --name nginx4 -v html:/usr/share/nginx/html -p 80:80 -d nginx

在上面的命令中,创建了一个容器nginx4,其中-v html:/usr/share/nginx/html就是把容器中的/usr/share/nginx/html这个目录挂载到html数据卷。

此时,如果要修改nginx4容器内/usr/share/nginx/html目录内的index.html的内容,只需要进入html数据卷所在位置/var/lib/docker/volumes/html/_data,修改其中的index.html即可:

# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html

修改完成后,在浏览器访问:http://192.168.146.129

通过数据卷,将容器与数据分离解耦合,方便操作容器内数据,保证数据安全。

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…

盛邦安全荣获北京市海淀区上地街道财源建设工作表彰

近日&#xff0c;盛邦安全受邀出席上地街道2024年第一季度财源建设工作联席会暨上地人工智能产业报告发布大会并收到上地街道颁发的感谢信&#xff0c;这是对公司技术创新、管理提升、营收增长&#xff0c;持续为上地地区财源建设做出突出贡献的鼓励。 盛邦安全副总裁、董事会秘…

ApiHug Official Website

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | MarketplaceApiHug-H…

TCP的延时应答和捎带应答详解

一、延时应答 延时应答是指TCP接收方在接收到数据包后&#xff0c;并不立即发送确认&#xff08;ACK&#xff09;消息&#xff0c;而是等待一段时间&#xff0c;以期望在该时间段内收到更多的数据包&#xff0c;从而实现合并多个ACK消息为一个&#xff0c;减少网络中的确认消息…

全民拼购:被低估的商机,惊人的业绩潜力

今日&#xff0c;我要与大家探讨的是一种似乎被遗忘&#xff0c;但实则蕴含巨大商机的模式与策略。尽管它在外界看来或许并不起眼&#xff0c;但我的一位客户却凭借这一策略&#xff0c;实现了令人瞩目的业绩——日销售额逼近五千万&#xff0c;日订单量更是高达惊人的300万单。…

[C++基础编程]----预处理指令简介、typedef关键字和#define预处理指令之间的区别

目录 引言 正文 01-预处理指令简介 02-typedef关键字简介 03-#define预处理指令简介 04-#define预处理指令和typedef关键字的区别 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xf…

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Our Method3.1. Motion Excitation (ME) Module3.1.1 Discussion with SENet 3.2. MultipleTemporal Aggregation(MTA) Module3.3. Integration with Re…

QT如何增删安装的组件

打开 uninstall QT 往下会看到让你选择 add or remove component。 接下去就可以修改组件了

Python快速入门-零基础也能掌握的编程技巧,基础方法和API整理

目录 前言 数据结构 数字 数学运算 随机数 字符串 列表 元组 字典 面向对象 JSON 文件操作 扩展 制作一个简易时钟 前言 环境什么就不在赘述&#xff0c;可以参考其他文章&#xff0c;也可以在线运行 CSDN在线运行地址&#xff1a;InsCode - 让你的灵感立刻落地…

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

有言在先 流体库、管路库在热管理中是必备模块&#xff0c;如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。 1 流体物性设置 AMEsim中内嵌了大部分液冷的热物性&#xff0c;直接在流体子模型上选择即可。常规使用的是50%乙二醇水溶液&#xff0c;如…

水表智能抄表系统是什么?

水表智能抄表系统是一种现代化水资源保护专用工具&#xff0c;它利用先进的物联网、云计算和大数据剖析&#xff0c;完成了智能抄表、实时监控系统、数据分析等作用&#xff0c;大大提高了水务管理的效率和精确性。 1.功能特点 1.1远程控制自动抄表 传统水表抄水表方法采用人…

sentinel-dashborard下发流控规则未生效排查解决

Sentinel简介 Sentinel是阿里巴巴开源的一个流量控制组件&#xff0c;它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel的核心思想是&#xff1a;通过动态设置的规则&#xff0c;对进入系统的流量进行控制&#xff0c;…

C#知识|将选中的账号信息展示到控制台(小示例)

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 上篇学习了控件事件的统一关联&#xff0c; 本篇通过实例练习继续学习事件统一处理中Tag数据获取、对象的封装及泛型集合List的综合运用。 01 实现功能 在上篇的基础上实现&#xff0c;点击选中喜欢的账号&#xff0…

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…

计数问题C++

题目&#xff1a; 思路&#xff1a; 1~n之间进行循环遍历&#xff0c;如果i不等于0继续循环&#xff0c;然后求出i的个位数与十位数&#xff0c;如果个位数为要查找的特定数字&#xff0c;计时器就1. 代码&#xff1a; #include<iostream> using namespace std; int n,x…

短视频收益分成一览表​​​​​​​​​​​​​​​​,视频号怎么做有收益的

今日为大家揭秘一个热门视频号的操作技巧。很多人都已经操作这类账号&#xff0c;并从中获益。视频号目前是市场上非常热门的平台之一&#xff0c;流量之大令人惊叹&#xff0c;先不提那些私域营销的巨大优势&#xff0c;仅从创作分成计划角度来看&#xff0c;已有许多人每天能…

react18【系列实用教程】useEffect —— 副作用操作 (2024最新版)

什么是副作用操作&#xff1f; useEffect 用于编写由渲染本身引起的对接组件外部的操作&#xff08;官方称呼为&#xff1a;副作用操作&#xff09; 以下情况会触发页面渲染 初次加载页面&#xff08;组的挂载&#xff09;响应式变量发生变化&#xff0c;触发页面根据新值重新…

死锁调试技巧:工作线程和用户界面线程

有人碰到了一个死锁问题&#xff0c;找到我们想请我们看看&#xff0c;这个是关于应用程序用户界面相关的死锁问题。 我也不清楚他为什么会找上我们&#xff0c;可能是因为我们经常会和窗口管理器打交道吧。 下面&#xff0c;我们来看看死锁的两个线程。 >> 请移步至 …