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

news2024/11/18 6:33:52

文章目录

  • 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.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum 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.coloradmin.cn/o/1664317.html

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

相关文章

【微信开发】微信支付前期准备工作(申请及配置)

1、申请并配置公众号或微信小程序 1.1 账户申请 通过微信公众平台&#xff0c;根据指引申请微信小程序或公众号&#xff0c;申请时需要微信认证&#xff0c;申请流程不在赘述 1.2 信息配置 申请通过后&#xff0c;需进入小程序和公众号内进行信息配置 1.2.1 小程序信息配置…

小程序地理位置接口申请教程来啦4步学会

小程序地理位置接口有什么功能&#xff1f; 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通&#xff0c;建议完成接口开通后或移除接口相关内容后再进行后续版本提审”&#xff0c;如果你也碰到类似问题&#xff…

任务:单域,域树的搭建

一、单域&#xff1a; 搭建所需的系统&#xff1a;win2016 sever&#xff0c;win10 1.在创建域前&#xff0c;先设置静态ip 先查看win2016 sever的IP&#xff0c; ip&#xff1a;192.168.154.133 网关&#xff1a;192.168.154.2 DNS服务器&#xff1a;192.168.154.2 设置…

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构&#xff08;0-63&#xff09;CLB&#xff1a;可配置逻辑块Slice&#xff1a;每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池&#xff1a;围绕在CLB周围&#xff0c;衔接FPGA的资源调度I/O块&#xf…

conan2 基础入门(02)-安装

conan2 基础入门(02)-安装 文章目录 conan2 基础入门(02)-安装⭐前言⭐安装python安装安装包安装自行操作 ⭐验证配置环境变量命令行验证conan配置文件 END ⭐前言 Conan 2.0: C and C Open Source Package Manager 官方提供三种安装conan的方式。分别为&#xff1a; Recommen…

vuex核心概念-getters

除了state之外&#xff0c;有时我们还需要从state中派生出一些状态&#xff0c;这些状态是依赖state的&#xff0c;此时会用到getters。

鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人

什么是远程登录? 每个人都有上门做客的经历,抖音也一直在教我们做人,做客不要空手去,总得带点东西,而对中国人你就不能送钟,不能送梨,最好也别送鞋,因他们与 终 离 邪 谐音,犯忌讳. 这是人情世故,叫礼仪,是中华文明圈的共识,是相互交流信任的基础. 那互联网圈有没有这种共识呢…

光伏无人机巡检都有哪些功能?

随着光伏产业的快速发展&#xff0c;光伏电站的巡检工作变得越来越重要。然而&#xff0c;传统的人工巡检方式面临着效率低下、安全隐患大等问题。为了应对这些挑战&#xff0c;光伏无人机巡检应运而生&#xff0c;以其独特的优势在光伏巡检领域发挥着越来越重要的作用。本文将…

OpenCv中cv2.subtract(image,blurred)与(image-blurred)的区别

目录 一、cv2.subtract()函数二、cv2.subtract(image,blurred)和&#xff08;image-blurred&#xff09;处理效果对比2.1 代码2.2 输出结果 三、总结 一、cv2.subtract()函数 cv2.subtract是OpenCV库中的一个函数&#xff0c;用于进行图像减法运算。它可以很方便地进行两个图像…

力扣刷题--数组--第一天

一、数组 数组特点&#xff1a; 连续内存空间存储得数据元素类型一致数组可以通过下标索引查找数据元素&#xff0c;可以删除、替换、添加元素等 1.1 二分查找 使用二分查找需满足得条件&#xff1a; 数组是有序的&#xff1b;数组中没有重复元素&#xff1b;查找的target…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

同程旅行基于Proxy的Kafka最佳实践

公众号文章&#xff1a;同程旅行基于Proxy的Kafka最佳实践 Apache Kafka&#xff0c;作为当前企业级数据流处理的首选平台&#xff0c;由于其高吞吐量和可扩展性而深受欢迎。 然而&#xff0c;随着企业数据量的爆炸性增长和业务需求的多样化&#xff0c;Kafka 集群面临着各种挑…

【Linux系统】进程

本篇博客整理了进程的多方面知识&#xff0c; 旨在从进程的概念、管理、属性、创建等方面让读者更加全面系统地理解进程和操作系统的管理设计。 目录 一、进程是什么 二、操作系统如何管理进程 1.描述进程 PCB 2.组织进程 3.再谈进程和进程管理 三、Linux下的进程管理 1…

[机器学习-04] Scikit-Learn机器学习工具包进阶指南:集群化与校准功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

选型前必看,西门子五大系列PLC的区别及特点

西门子是全球知名的自动化解决方案提供商&#xff0c;其PLC&#xff08;可编程逻辑控制器&#xff09;系列产品广泛应用于工业控制领域。不同系列的PLC在功能、性能和适用范围上有所区别。本文将详细介绍西门子PLC各个系列的特点和区别&#xff0c;以及在实践应用时如何采用无线…

具备教学意义的实操(用队列实现栈)

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 实现逻辑 一个是先进先出&#xff08;队列&#xff09;&#xff0c;一个是后进先出&#xff08;栈&#xff09; 这里用两个队列导入一下数据…

论文研读 An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale

完整翻译 《An Image is Worth 16x16 Words》完整版翻译_an image is worth 16*16words-CSDN博客 大神讲解 Vision Transformer详解-CSDN博客 视频讲解 11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili 学习整理 简要概述&#xff1a;Vision Transformer&#xff…

Flutter3.x get-cli中运行get init初始化项目报错如何处理

Flutter get-cli中运行get init初始化项目会提示如下错误&#xff1a; get init s E:\flutter\flutter study\tempstudy\misapp01> get init 1)Getx Pattern (by Kau) 2)CLEAN (by Arktekko) which architecture do you want to use? [1] unhandled exception: Synchromu…

谁使用DITA?

▲ 搜索“大龙谈智能内容”关注公众号▲ Keith根据LinkedIn上的数据进行的统计&#xff0c;主要反应的西方世界使用DITA的公司。因为LinkedIn在国内不能访问&#xff0c;笔者认为针对中国的数据并不准确。 作者 | John Walker - NXP销售和市场营销业务分析师 2013年4月18日 …

Java --- 集合(2)--- 这篇文章让你学会如何使用List集合

本期文章来自黑马程序员以及Java入门到精通&#xff0c;希望各位大佬发现文章的瑕疵及时表出&#xff0c;另外也感谢您的收看。话不多说&#xff0c;直接进入正题...... 目录 一.List集合的使用&#xff1a; 二.三种遍历List方式&#xff1a; 首先还是给大家呈现这幅图&#x…