Docker初识

什么是Docker

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

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

应用部署的环境问题

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

  • 依赖关系复杂,容易出现兼容性问题

  • 开发、测试、生产环境有差异

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

docker解决依赖兼容问题

而Docker确巧妙的解决了这些问题,Docker是如何实现的呢?

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

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包

  • 将每个应用放到一个隔离容器去运行,避免互相干扰

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

Docker解决操作系统环境差异

要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构包括:

  • 计算机硬件:例如CPU、内存、磁盘等
  • 系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
  • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便。

应用于计算机交互的流程如下:

1)应用调用操作系统应用(函数库),实现各种功能

2)系统函数库是对内核指令集的封装,会调用内核指令

3)内核指令操作计算机硬件

Docker如何解决不同系统环境的问题?

  • Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
  • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

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

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

Docker和虚拟机的区别

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

  • 虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

  • Docker仅仅是封装函数库,并没有模拟完整的操作系统

特性Docker虚拟机
性能接近原生性能较差
硬盘占用一般为MB一般为GB
启动秒级分钟级

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统

  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

Docker架构

镜像和容器

Docker中有几个重要的概念:

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

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

DockerHub

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。

  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像

Docker架构

我们要使用Docker来操作镜像、容器,就必须要安装Docker。

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

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等

  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

image-20230810161802874

Docker的基本操作

镜像操作

镜像名称

首先来看下镜像的名称组成:

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

镜像命令

常见的镜像操作命令如图

image-20230810162617340

docker pull nginx	# 拉取镜像
docker images		# 查看拉取的镜像# docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest	# 保存镜像
docker rmi nginx:latest					# 删除镜像
docker load -i nginx.tar				# 加载镜像

容器操作

容器保护三个状态:

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

容器相关命令

  • docker run:创建并运行一个容器,处于运行状态

    docker run --name containerName -p 80:80 -d nginx
    
    • docker run :创建并运行一个容器
    • --name : 给容器起一个名字,比如叫做mn
    • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
    • -d:后台运行容器
    • nginx:镜像名称,例如nginx
  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

  • docker exec:进入容器

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

    容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样

docker run命令的常见参数

  • --name:指定容器名称
  • -p:指定端口映射
  • -d:让容器后台运行

查看容器日志的命令:

  • docker logs
  • 添加 -f 参数可以持续查看日志

查看容器状态:

  • docker ps
  • docker ps -a 查看所有容器,包括已经停止的

数据卷(容器数据管理)

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

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

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

什么是数据卷

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

image-20230810164051404

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了

数据集操作命令

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume
  • inspect 显示一个或多个volume的信息
  • ls 列出所有的volume
  • prune 删除未使用的volume
  • rm 删除一个或多个指定的volume

创建和查看数据卷

需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

  1. 创建数据卷
docker volume create html
  1. 查看所有数据
docker volume ls
  1. 查看数据卷详细信息卷
docker volume inspect html

创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data目录。

挂载数据卷

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:

docker run \--name mn \-v html:/root/html \-p 8080:80nginx \

这里的-v就是挂载数据卷的命令:

  • -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

  • 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
  • 直接挂载模式:宿主机目录 ---> 容器内目录

docker安装MySQL5.7:

# --privileged=true参数,让容器拥有真正的root权限
docker run --privileged=true --name mysql5.7 -p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 -d \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-v /mydata/mysql/log:/var/log/mysql \
mysql:5.7

docker run的命令中通过 -v 参数挂载文件或目录到容器中:

  • -v volume名称:容器内目录
  • -v 宿主机文件:容器内文
  • -v 宿主机目录:容器内目录

数据卷挂载与目录直接挂载的

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

Docker的一些常见命令

  1. docker --version

    • 显示 Docker 版本信息。
    • 例如:
      docker --version

  2. docker pull <镜像名称>:<标签>

    • 从 Docker 镜像仓库下载指定的镜像。
    • 例如:
      docker pull ubuntu:20.04

  3. docker images

    • 列出本地已下载的 Docker 镜像。
    • 例如:
      docker images

  4. docker run <选项> <镜像名称>

    • 运行一个 Docker 容器。
    • 常见选项:
      • -d:以后台模式运行容器。
      • -it:以交互模式运行容器(通常用于终端交互)。
      • --name:指定容器的名称。
      • -p:映射容器端口到主机端口。
    • 例如:
      docker run -d --name my-container nginx

  5. docker ps

    • 列出正在运行的容器。
    • 常见选项:
      • -a:显示所有容器,包括已停止的。
    • 例如:
      docker ps -a

  6. docker stop <容器名称或ID>

    • 停止一个运行中的容器。
    • 例如:
      docker stop my-container

  7. docker start <容器名称或ID>

    • 启动一个已停止的容器。
    • 例如:
      docker start my-container

  8. docker restart <容器名称或ID>

    • 重启一个容器。
    • 例如:
      docker restart my-container

  9. docker exec -it <容器名称或ID> <命令>

    • 在运行的容器中执行命令(进入容器的终端交互模式)。
    • 例如:
      docker exec -it my-container bash

  10. docker rm <容器名称或ID>

    • 删除一个已停止的容器。
    • 例如:
      docker rm my-container

  11. docker rmi <镜像名称>:<标签>

    • 删除一个本地镜像。
    • 例如:
      docker rmi ubuntu:20.04

  12. docker logs <容器名称或ID>

    • 查看容器的日志输出。
    • 例如:
      docker logs my-container

  13. docker network ls

    • 列出 Docker 网络。
    • 例如:
      docker network ls

  14. docker volume ls

    • 列出 Docker 卷(用于数据持久化)。
    • 例如:
      docker volume ls

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

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

相关文章

Matlab图像处理-模式识别

模式识别 模式识别就是用计算的方法根据样本的特征将样本划分到一定的类别中去。模式识别就是通过计算机用数学技术方法来研究模式的自动处理和判读&#xff0c;把环境与客体统称为“模式”。模式识别以图像处理与计算机视觉、语音语言信息处理、脑网络组、类脑智能等为主要研…

题目 1063: 二级C语言-统计字符

输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 样例输入a 1, 样例输出 1 1 1 1 鉴于直接用cin会导致空格无法录入&#xff0c;于是用string的getline函数。 再在对应区间的计数器1就好 #include<iostream> #include<string> …

【每日一题】436. 寻找右区间

436. 寻找右区间 - 力扣&#xff08;LeetCode&#xff09; 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。 区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > endi &#xff0c;且 startj…

【每日随笔】驾驭人性 ③ ( 胡萝卜 - 用利益让员工离不开你 | 大棒 - 用规则让员工害怕你 | 如何建立制度规则 )

文章目录 一、胡萝卜 - 用利益让员工离不开你二、大棒 - 用规则让员工害怕你三、如何建立制度规则 一、胡萝卜 - 用利益让员工离不开你 上一篇博客 【每日随笔】驾驭人性 ② ( 员工立场问题 | 立场转变 | 吴越同舟 | 老板如何与员工结成利益共同体 ) 中 提到了 , 用利益让员工离…

十几张高清世界地图

十几张高清世界地图 仅供学习&#xff01;

pom.xml中解决“vulnerable dependency maven:org.yaml:snakeyaml:1.33“警告问题

问题 当我们引入依赖的时候&#xff0c;pom文件会有这样的提示&#xff0c;其大概的意思就是 maven:org.yaml:snakeyaml:1.30"表示通过Maven引入了一个潜在的安全漏洞依赖项"org.yaml:snakeyaml:1.30" 解决办法 其实我们就是要更改这个依赖的版本&#xff0c…

PB转纯BS工具

pbtoweb Convert Powerbuilder UI to web Automatically. 源码地址&#xff1a;GitHub - pcwe2002/pbtoweb: automatically convert Powerbuilder UI to web 支持转换控件 Window DataWindow CommandButton CheckBox RadioButton Tab DropdownListbox StaticText EditMask S…

有效保护敏感数据的最佳实践

在当今数据驱动的环境中&#xff0c;数据就是力量&#xff0c;组织仍然高度关注如何利用其数据进行 BI、分析和其他业务驱动计划。 事实上&#xff0c;最近的研究表明&#xff0c;数据领导者的主要动机是对高质量分析洞察的需求&#xff0c;而不是合规性。 然而&#xff0c;…

eNSP基础网络学习-v02

一、eNSP 1.什么是eNSP eNSP(Enterprise Network Simulation Platform)是一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台&#xff0c;主要对企业网络路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟&#xff0c;让…

git reset origin --hard解决‘Your branch is ahead of ‘origin/xxxx‘ by xx commit.’

git reset origin --hard解决‘Your branch is ahead of origin/xxxx by xx commit.’ 如图&#xff1a; 之前是这么解决的解决git&#xff1a;Your branch is ahead of ‘XXX‘ by X commits-CSDN博客git删除/撤销远已经push到程服务器上某次代码提交场景&#xff1a;不小心把…

忽视日志吃大亏,手把手教你玩转 SpringBoot 日志

一、日志重要吗 程序中的日志重要吗&#xff1f; 在回答这个问题前&#xff0c;笔者先说个事例&#xff1a; ❝ 笔者印象尤深的就是去年某个同事&#xff0c;收到了客户反馈的紧急bug。尽管申请到了日志文件&#xff0c;但因为很多关键步骤没有打印日志&#xff0c;导致排查进…

K8S:pod集群调度及相关操作

文章目录 一.pod集群调度概念1.调度约束( List-Watch组件)2.List-Watch的工作机制&#xff08;1&#xff09;List-Watch的工作机制流程&#xff08;2&#xff09;List-Watch的工作机制图示 3.调度的过程&#xff08;1&#xff09;调度的任务&#xff08;2&#xff09;调度选择p…

vue3项目发布后修改配置文件仍然生效

使用json&#xff0c;并且要用ajax来加载&#xff1b;应用过程中也有一些注意的问题。 有关“vue3项目发布后修改配置文件仍然生效”问题&#xff0c;之前做过一篇笔记《vue项目读取全局配置》。但事实上&#xff0c;那篇笔记的步骤&#xff0c;只解决了项目发布后&#xff0c…

【工具插件类教学】三种常用日期选择UI控件工具

目录 一. DataPicker的简介 二. DateTimePicker的简介 ​三. FlatCalendar的简介 一. DataPicker的简介 一种是常显,一种是按钮控制显示逻辑,可以设置年,月,日。并输出结果

Ubuntu 22.04 快速安装 MySQL 数据库 8.0

Ubuntu 22.04 快速安装 MySQL 数据库 8.0 1. 安装 MySQL2. 配置 MySQL2.1 公网访问2.2 添加用户2.2.1 切换 root 用户2.2.2 链接 MySQL2.2.3 添加新的 MySQL 用户2.2.4 退出 MySQL2.2.5 退出 root 用户 2.3 测试新用户 1. 安装 MySQL sudo apt install mysql-server-8.02. 配置…

【Vue3 源码解析】reactive 全家桶

// 泛型约束&#xff1a;只能传入引用类型 export function reactive<T extends object>(target: T): UnwrapNestedRefs<T> // 判断只读&#xff0c;否则创建reactive响应式对象 export function reactive(target: object) {// if trying to observe a readonly pr…

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows 大家好我是艾西&#xff0c;最近研究了下 l4d2&#xff08;求生之路2&#xff09;这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游…

Unity Bolt 实现UI拖拽功能

最近在学习使用Bolt插件实现五代码对UGUI Image元素实现拖拽。先看效果 录制_2023_09_15_17_50_45_29 下面是实现方式介绍&#xff1a; 1&#xff1a;注册RectTransformUtility 在使用Bolt插件实现UI拖拽的功能&#xff0c;需要使用 RectTransformUtility.ScreenPointToLoca…

数据分析总结

数据分析 AB检测 AB检测&#xff0c;也称为AB测试&#xff0c;是一种在线实验的方法&#xff0c;用于比较两个或多个版本的网页或应用程序的效果&#xff0c;以确定哪个版本能够更好地实现预期的目标&#xff0c;例如提高用户转化率、点击率、留存率等。AB检测的流程大致如下…

【微信小程序】文章设置

设置基本字体样式&#xff1a;行高、首行缩进 font-size: 32rpx;line-height: 1.6em;text-indent: 2em;padding: 20rpx 0;border-bottom: 1px dashed var(--themColor); 两端对齐 text-align: justify; css文字两行或者几行显示省略号 css文字两行或者几行显示省略号_css…