Docker的入门与使用

什么是Docker?

docker官网

简介与概述

  1. Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

  2. Docker的主要目标是‘build ,ship and run any app,anywhere’,也就是说通过对应用程序组件的封装,分发,部署,运行等生命周期的管理。使用户的app(可以是一个web应用程序或者数据库应用等)及其运行环境能够做到‘一次封装,到处运行’。

  3. Linux容器技术的出现解决了这个问题。而docker就是基于他的基础上发展过来的。将应用运行到docker容器上面,而docker容器在任何操作系统上都是一致的,这就是实现跨平台跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

  4. 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

  5. Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

在这里插入图片描述

Docker实际上就是一个虚拟化轻量级linux服务器,可以解决我们在开发环境中运行配置问题。

为什么需要使用docker?

Docker:虚拟化容器技术
Docker主要解决我们开发环境配置迁移的问题。

  • 我们现在开发了一个javaweb项目,需要依赖很多环境配置 比如:Tomcat、JDK环境、Nginx、Redis环境等。

  • 本地需要安装这些环境Tomcat、JDK环境、Nginx、Redis环境等,在打war包给运维部署在linux服务器,运维人员也需要在linux服务器上安装Tomcat、JDK环境、Nginx、Redis环境。

  • 但是有时候可能会发生这些问题:我在本地运行环境没有问题,但是打包到Linux服务器运行总是遇到很多错误,大多数由于一些版本冲突影响。

  • 所以在这时候我们就可以使用docker部署和安装软件就非常方便,直接将该springboot项目制作成一个镜像文件,镜像文件中包含jdk版本 tomcat版本信息 直接部署linux即可,减少依赖冲突概率。

使用docker的好处

  1. 简化配置 安装创建非常的方便
  2. 代码流水线(Code Pipeline)管理 传统项目部署可能需要经过很多环节,容易产生版本的依赖冲突问题,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少
  3. Devops 开发与运维一体化减少沟通的成本 (docker或者是k8s实现)
  4. 虚拟技术 快速部署
  5. 弹性扩容

应用场景

  1. Web 应用的自动化打包和发布。
  2. 自动化测试和持续集成、发布。
  3. 在服务型环境中部署和调整数据库或其他的后台应用。
  4. 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境

容器与虚拟机区别

虚拟机: 在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。
在这里插入图片描述
从下到上理解上图:

  • 最下面的一层就是物理机,可以是服务器,设置是一台个人电脑;
  • 电脑上需要安装操作系统,比如我们安装了win10的操作系统;
  • 再往上就是虚拟机软件了,比如我们常用的VirtualBox、VMWare,它们的作用是模拟计算机硬件;
  • 继续向上,就是虚拟机模拟出来的操作系统了;
  • 在虚拟的操作系统中,安装所需的软件、组件等。比如我们需要在虚拟操作系统中安装JDK、Tomcat等;
  • 最后就是具体的应用了,例如部署到Tomcat中。

Docker : Docker是开源的应用容器引擎

在这里插入图片描述
依然从下往上看:

  • 最下面两层,概念同上。
  • 往上,可以看做Docker容器的管理器。
  • 依赖和应用都被打包成了Docker镜像。例如,JDK、Tomcat、应用都被打包在了一起,运行在Docker容器里,容器和容器间是隔离的。

Docker和虚拟机的区别

  1. 从两者的架构图上看,虚拟机是在硬件级别进行虚拟化,模拟硬件搭建操作系统;而Docker是在操作系统的层面虚拟化,复用操作系统,运行Docker容器。
  2. Docker的速度很快,秒级,而虚拟机的速度通常要按分钟计算。
  3. Docker所用的资源更少,性能更高。同样一个物理机器,Docker运行的镜像数量远多于虚拟机的数量。
  4. 虚拟机实现了操作系统之间的隔离Docker是进程之间的隔离,虚拟机隔离级别更高安全性方面也更强
  5. 虚拟机和Docker各有优势,不存在谁替代掉谁的问题,很多企业都采用物理机上做虚拟机,虚拟机中跑Docker的方式。
特性Docker虚拟机
启动速度秒级分钟级别
硬盘使用一般为MB一般GB
性能接近原生弱于
系统支持量单机支持上千个容器一般几十个
隔离性完全隔离完全隔离

Docker快速入门

镜像文件

简单理解为就是一个安装包,里面包含容器所需要运行的的基础文件和配置信息,比如:redis镜像、mysql镜像等。

镜像的来源方式:

  1. 自己做镜像 比如(自己开发微服务项目)
  2. 拉取别人制作好的镜像, 例如 nginx、mysql、redis等。

容器

容器就是镜像运行的实例,容器状态分为:初创建、运行、停止、暂停、删除, 一个镜像可以创建多个不同的容器。

每个镜像文件都有自己独立ip信息—轻量级的linux服务器 虚拟化

比如:镜像就是类 容器就是实例对象

仓库

仓库可以简单理解为,专门存储镜像文件仓库, 类似于谷歌手机市场,统一在谷歌手机市场下载开发者的安装包。

Docker 公开仓库地址: Docker hub
hub

Docker常用命令

docker --help  帮助命令
docker -version 查看版本信息
docker images  查看本地images 镜像缓存

在这里插入图片描述

  • REPOSITORY 存储库名称
  • Tag 镜像的标签 不写版本号码 默认下载最新latest镜像
  • IMAGE ID 镜像id
  • CREATED 创建时间
  • SIZE 大小
docker images -a
docker images -q ---只显示镜像的id
docker images --digests ---显示镜像的摘要信息
docker images --no-trunc ---显示完整镜像信息
docker rmi 镜像id		删除镜像文件根据id 
docker rmi -f hello-world  删除镜像文件根据名称
docker search mysql  在仓库里面查找mysql镜像

在这里插入图片描述

docker pull mysql   默认拉取最新版本的mysql

latest代表最新的版本

docker run 镜像名
docker ps 查看正在运行的容器
docker ps -a 查看运行和已经运行关闭的容器(所有)
docker stop 容器id    关闭容器
docker start 容器id   启动容器
docker rm  容器id     删除容器
# 查看容器信息
docker ps  获取到容器id
docker inspect  1e07cc5cc78d  查看容器信息

docker运行镜像命令详解
docker run
-i(保持容器一直运行
-t(给容器一个伪终端
-d(后台运行,不直接进入容器)
–name=tomcat9.2(给启动容器起名字
-p 8080:8080(宿主:docker容器)
tomcat:9.2(启动的容器) 【参数】(加入容器初始化命令)

docker run -dit --name 镜像名 -d -p 端口:端口 镜像名

从打包到运行再到停止删除流程

先docker ps查看,
然后docker stop 停止,
然后docker rm 删除,
然后docker images 查看镜像,
docker rmi 删除镜像,
上传文件 jar包,
然后docker build -t 自定义镜像名字 .    #后面有逗号
然后运行镜像 
#通过 -it 启动的容器有两个特点 一创建就进入容器 exit退出容器 容器就会停止运行  ---交互式容器
#通过 -id 创建的容器 docker exec -it tomcat9.2(--name起的名称)进入容器 exit退出容器 容器不会停止运行   ---守护式容器
docker exec 参数  进入容器

docker run 运行原理

docker run mysql

简单描述:首先会先从本地获取获取mysql镜像文件,如果本地没有该镜像文件则会去阿里云仓库查找该镜像文件,如果阿里云仓库也没有该镜像文件,则会报错找不到镜像文件。

获取到镜像文件之后直接运行

详细描述

  1. docker在本机缓存中 mysql镜像文件,如果本地存在该镜像文件,则以该镜像文件作为模板在容器中运行。
  2. 如果本地缓存中,没有mysql镜像文件 则会从dockerhub 或者加速镜像中查找,如果查找不到的话,则返回错误找不到该镜像。如果能够查找到该镜像,则以该镜像作为模板运行。

每个容器都有自己独立的网络 ip信息 运行成功 就是一个轻量级linux操作系统

进入容器中

# 首先使用下面的命令,查看容器ID(CONTAINER ID):
docker ps -a
# 然后用下面的命令进入容器,就可以使用bash命令浏览容器里的文件:
docker exec -it [CONTAINER ID] bash
# 有的镜像没有bash命令,可以用对应的shell,比如sh
docker exec -it [CONTAINER ID] sh

Docker 镜像原理

镜像是什么

镜像加载的原理

在这里插入图片描述

Linux文件系统由bootfs和rootfs两部分组成

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
    不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

Docker镜像底层实际上是有多个不同的联合文件系统组成的

  • 最底层:bootfs,并使用宿主机的bootfs-复用

  • 第二层:root文件系统rootfs,称为base image Union fs

  • 然后再往上可以叠加其他的镜像文件
    统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,隐藏多层的存在,我们看来只是存在一个文件系统。

  • 因为当我们安装的tomcat镜像大小是600多MB时是因为里面还包含了jdk和centos的镜像而centos镜像复用了宿主机的bootfs 下载的只有rootfs 所以小很多

  • 因为tomcat -> jdk(父镜像)->centos 所以整个向外暴露就是600MB
    镜像只读 当从一个镜像启动容器时, docker会在镜像上面加载一个可读可写的文件系统作为容器运行。

Docker Commit

主要作用:根据当前容器制作为镜像文件

如:

  1. 从docker hub中下载一个tomcat8镜像文件;
  2. 运行tomcat8镜像文件 在tomcat的webapps 目录中新增 test文件夹 index.html
  3. 将当前容器内容根据模板制作为镜像文件

docker commit 提交容器副本使之成为一个新的镜像
命令:

docker commit -m=“提交的描述信息” -a=“作者名” 容器ID 要创建的目标镜像名:[标签名]

操作

  1. 安装一个tomcat8
docker run -p 8081:8080   tomcat:8
  1. 进入容器
    docker exec -it 3a06b4c779a8 bash

  2. 打开文件夹
    cd webapps

  3. 新建文件夹
    mkdir test

  4. 新建文件
    touch index.html

  5. 向文件里面追加内容
    echo "test Docker Commit" >>index.html

  6. 构建镜像
    docker commit -m="test Docker Commit" -a="tujr" 3a06b4c779a8 test-Docker-Commit:1.0

  7. 运行新镜像
    docker run -p 8088:8080 test-Docker-Commit:1.0

Docker数据卷

数据卷就是宿主机上的一个文件或目录
当容器目录和数据卷(宿主机)目录绑定,双方修改会立即同步操作一个数据卷可以被多个容器同时挂载

数据卷作用: 容器数据的持久化,外部机器和容器间接通信容器之间数据交换使用 -v命令。

数据卷添加的方式

容器内与宿主机实现数据的共享
数据卷–添加两种方式

  1. 直接命令形式添加 docker run -it -v 宿主机绝对路径目录 : 容器内目录 镜像文件名称
  2. Dockerfile方式添加

Docker运行底层原理

  1. 首先启动docker systemctl start docker
  2. Docker是一个CS架构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接收命令管理运行在主机上的容器。
ps aux | grep 'docker'

在这里插入图片描述

DockerFile 解析

一个镜像文件到底是如何创建?

  1. dockerfile 描述出镜像文件需要的一些依赖配置和环境变量 执行命令
  2. 我们将dockerfile 文件打包成一个镜像文件
  3. 直接使用我们的容器运行到该镜像文件。
  • 需要手动编写一个dockerfile文件
  • 将该dockerfile docker build 自定义成一个镜像文件
  • docker run 运行容器

下一篇单独讲解DockerFile

Docker Compose

Docker Compose 容器编排技术

为什么需要使用Docker Compose

  1. 现在我们有一个springboot项目,需要依赖Redis、mysql5.7、nginx。如果使用docker原生部署的话,则需要安装Redis、mysql5、nginx容器,在才可以启动我们springboot项目,这样的话部署项的流程非常复杂,所以需要引入我们的Docker compose实现容器编排技术。
    在这里插入图片描述

基本的概念

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

开发一个springboot项目—大工程

  1. 依赖mysql
  2. 依赖redis
  3. 依赖zk
  4. 等等。
    需要在docker-compose.yml 配置项目工程依赖环境配置
  • Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。
  • 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
  • 一个服务当中可包括多个容器实例,但是Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Compose 中有两个重要的概念:

  • 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
    一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

Docker-Compose分成两层

  1. 项目层 springboot项目依赖于我们的mysql、redis、nginx等 一个项目是由多个容器组成的。
  2. 服务层 运行一个镜像的实例

Docker可视化工具使用

Portainer

Portainer是一款Docker可视化管理工具,允许我们在网页中方便的查看和管理Docker容器。

要使用Portainer很简单,运行下面两条命令即可。这些命令会创建一个Portainer专用的卷,然后在8000和9000端口创建容器并运行

docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RISCV 5 RISC-V调用规则

RISCV 5 RISC-V调用规则 1 Register Convention1.1 Integer Register Convention1.2 Floating-point Register Convention 2. Procedure Calling Convention2.1 Integer Calling Convention2.2 Hardware Floating-point Calling Convention2.3 ILP32E Calling Convention2.4 Na…

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图: 弹框信息: Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…

webshell免杀项目-Auto-JSPwebshell(五)

Auto-JSPwebshell/jsp免杀/webshell免杀/自动生成 项目地址: https://github.com/G0mini/Bypass 具体使用请参考: https://mp.weixin.qq.com/s/9-__B0MBRSXHla6O0KU7Gg

缓解针对LLM应用程序的存储提示注入攻击

推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 LLM提供提示文本,并根据其已训练和访问的所有数据进行响应。为了用有用的上下文补充提示,一些 AI 应用程序捕获来自用户的输入,并在将最终提示发送到 LLM 之前将用户看不…

08. 容器间通信

目录 1、前言 2、容器间通信 2.1、通过IP地址进行通信 2.2、通过DNS Server进行通信 2.3、通过Joined方式通信 3、容器跨节点通信 3.1、通过容器在宿主机上的端口映射实现 3.2、通过Docker Overlay网络实现 4、小结 1、前言 上一篇《07.Docker网络通信模式》我们初步认…

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

24届近5年南京航空航天大学自动化考研院校分析

今天给大家带来的是南京航空航天大学控制考研分析 满满干货~还不快快点赞收藏 一、南京航空航天大学 学校简介 南京航空航天大学创建于1952年10月,是新中国自己创办的第一批航空高等院校之一。1978年被国务院确定为全国重点大学;1981年经…

TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建

前言 (1) 首先,我们需要知道TM4C123是M4的内核。对于绝大多数人而言,入门都是学习STM32F103,这款芯片是采用的M3的内核。所以想必各位对M3内核还是有一定的了解。M4内核就是M3内核的升级版本,他继承了M3的的…

Vue3项目中使用原生input实现excel导入导出功能

重写input样式 首先我们先来重写input的原生样式&#xff0c;毕竟实在不好看。这里的思路很简单input外面套一层div然后让input撑满盒子然后给input隐藏了就行 <div class"bg-[#f8f8f8] w-[430px] h-[220px] rounded-md cursor-pointer relative outline-0">…

智慧影院--java开源电影票优惠券制作系统快速开发

搭建一个智慧影院可以通过使用Java开源电影票优惠券制作系统来快速开发。这个系统可以帮助影院管理电影票的销售和优惠活动&#xff0c;提供便捷的购票方式和优惠券的生成与使用功能。 首先&#xff0c;我们需要建立一个数据库来存储电影、影厅、放映计划、订单等信息。在数据…

Java并发编程(一)多线程基础概念

概述 多线程技术&#xff1a;基于软件或者硬件实现多个线程并发执行的技术 线程可以理解为轻量级进程&#xff0c;切换开销远远小于进程 在多核CPU的计算机下&#xff0c;使用多线程可以更好的利用计算机资源从而提高计算机利用率和效率来应对现如今的高并发网络环境 并发编程…

C++代码生成静态LIB链接库及其调用方法

1、在进行C代码移植时可将CPP文件封装为静态lib链接库&#xff0c;本文章讲述了如何将cpp文件封装为lib文件。 2、假设有文件a.cpp、a.h、b.cpp、b.h以及main.cpp&#xff0c;假设main调用了b&#xff0c;b调用了a。现在需要将a.cpp以及b.cpp封装为a.lib以及b.lib。 3、在VS2…

RISC-V公测平台发布 · UnixBench完整测试

简介 UnixBench是一个开源的GPLv2许可的工具&#xff0c;它提供了对类Unix系统性能的基本指标。 通过运行UnixBench&#xff0c;可以获得有关系统性能的基本指标&#xff0c;用于与其他系统进行比较&#xff0c;也可以作为改进系统性能的参考。但UnixBench并不是一个综合性能…

MySQL和钉钉单据接口对接

MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…

【iOS】RunLoop

前言-什么是RunLoop&#xff1f; 什么是RunLoop? 跑圈&#xff1f;字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…

基于Echarts的大数据可视化模板:智慧物流管理

目录 引言物流管理的重要性大数据可视化在解决物流管理挑战中的作用智慧物流概述定义智慧物流的概念和特点智慧物流的关键技术和平台风险管理和预测:交通拥堵情况和风险预警Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满…

动手学深度学习Pytorch 4.4练习

1.这个多项式回归问题可以准确地解出吗&#xff1f;提⽰&#xff1a;使⽤线性代数。 可以,把多项式问题&#xff0c;用matlab的str2sym表示出来&#xff0c;再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度&#xff08;多项式的阶数&#xff09;的关系…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

抖音商品上架有攻略:详细介绍步骤与注意事项

抖音是一款非常流行的短视频分享平台&#xff0c;也是一个非常适合进行商品销售的平台。上架商品是在抖音上进行电商销售的重要一环&#xff0c;下面不若与众将介绍抖音商品的上架流程和注意事项。 1. 注册账号和认证&#xff1a;首先&#xff0c;你需要在抖音平台上注册一个账…

MYSQL06高级_为什么使用索引、优缺点、索引的设计、方案、聚簇索引、联合索引、注意事项

文章目录 ①. 为什么使用索引②. 索引及其优缺点③. InnoDb - 索引的设计④. InnoDb中的索引方案⑤. 索引 - 聚簇索引⑥. 索引 - 二级索引⑦. B树索引的注意事项⑧. MyISAM中索引方案 ①. 为什么使用索引 ①. 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆…