Docker学习

Docker学习

1. Docker简介

Docker是一个用于构建 运行 传送 应用程序的平台

image-20231223112004969

为什么要使用Docker

一般在初学阶段可能会有以下步骤。看起来比较繁琐。

image-20231223112153602

而有了Docker后,我们可以将它们打包成一个个的集装箱,只要在开发环境中运行成功,那么在其他环境一定也是可以成功的。

image-20231223112235670

2. Docker和虚拟机的区别

image-20231223113255976

上述的传统虚拟机是通过一种叫做虚拟化(Hypervisor)技术来实现的

虚拟化计算是一种将物理资源虚拟为多个逻辑资源的技术,它可以将一台物理服务器虚拟成多个逻辑服务器,每个逻辑服务器都有自己的操作系统、CPU 、内存、硬盘和网络接口等等。它们之间是完全隔离的,可以独立运行,虚拟机在一定程度上实现了资源的整合,可以将一台服务器的计算能力、存储能力、网络资源分配给多个逻辑服务器,实现多台服务器的功能。

image-20231223113632203

缺点是每台服务器都需要占用大量的资源,比如CPU、内存 、硬盘、网络等等,而且启动速度特别慢,通常需要几分钟和几十分钟,而大部分情况下,其实我们的一台服务器上只需要运行一个主要对外提供的服务的应用程序就可以了,并不需要一个完整的操作系统所提供的所有功能。

image-20231223113855986

了解虚拟机后,一起了解一下容器。Docker和容器是两个不同的概念。

Docker只是容器的一种实现,是一个容器化的解决方案和平台。而容器是一种虚拟化技术和虚拟机类似,也是一个独立的环境,可以在这个环境中运行应用程序,和虚拟机不同的是,它并不需要在容器中运行一个完整的操作系统,而是使用宿主机的操作系统,所以启动速度非常快。通常需要几秒钟,同时因为需要的资源更少,所以可以在一台物理服务器上,运行更多的容器,这样就可以充分利用服务器的资源,减少资源的闲置和浪费。

image-20231223114714972

3. Docker的基本原理和概念

image-20231223114840312

Docker是使用Client-Server架构模式,Docker Client和Docker Daemon之间是通过Socket或者RESTful API进行通信;Docker Daemon就是服务器端的守护进程,他负责管理Docker的各种资源。Diocker Client负责像Docker Daemon发送请求,Docker Daemon接受请求之后进行处理,然后将结果返回给Docker Client,Docker Daemon是一个后台进程,用来接受并处理来自Docker客户端的请求,然后将结果返回客户端,所以我们在终端输入的各种Docker命令,实际上是通过Docker客户端,发送给Docker Daemon的,然后Docker Daemon再进行处理,最后再将结果返回客户端。然后就可以在终端中看到执行结果了。

Docker中的镜像、容器和仓库

  • 镜像是一个只读的模板,它可以用来创建Docker容器。

  • 容器是Docker的运行示例,它提供了一个独立的可移植的环境,可以在这个环境中运行应用程序。

  • 镜像和容器的关系有的像Java中类和实例的关系一样,我们可以定义一个类中,有哪些属性和方法。这个定义好的类就是一个模板,然后我们可以根据这个模板来创建多个实例,这个实例就是这个类的对象。

  • 从生活的角度看待,镜像就像是一个食谱,详细地描述如何去制作一道菜肴,而容器是你根据这个食谱做出很多道菜 ,但是做出来的菜都是一样的,而且你也可以把食谱分享给其他喜欢美食的朋友。,那他也可根据食谱,做出一样的菜。

  • Docker仓库是用来存储Docker镜像的地方。最流行和最常用的仓库是DockerHub,它是一个公共的Docker仓库,用来集中存储和管理Docker镜像,我们可以下载镜像以及上传自己的镜像。这样就可以实现Docker的共享和复用。

image-20231223164408456

4. Docker的安装配置

官网安装Docker Desktop

Windows端需要开启Hyper功能。

Hyper-V是Windows专业版专属功能,但大多数(除商业本)品牌机内置的Windows都是家庭版。只能通过命令开启,方法如下:

一、安装Hyper-V

a.在桌面空白处右键-新建-文本文档,命名为 hyper-v.cmd,如图1-1

(提示:必须开启显示文件扩展名选项,否则无效,开启方法参考图1-2)

img

1-1

img

1-2

b.单击这个文件,右键-编辑,如图1-3

image-20231223165440964

1-3

c.输入以下代码,如图1-4

1
2
3
4
5
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

img

1-4

d.点击文件-保存,如图1-5

image-20231223165546650

1-5

e.单击这个文本文档,右键-以管理员权限运行,如图1-6

img

1-6

f.等待加载完成即可,成功安装后,输入y并回车即可

二、启用Hyper-V

a.点击搜索按钮,输入控制面板,并点击打开,如图2-1

img

2-1

b.点击程序与功能,如图2-2

image-20231223164004798

2-2

c.点击启用或关闭Windows功能,如图2-3

img

2-3

d.勾选Hyper-V,Windows虚拟机监控程序平台和虚拟机平台,如图2-4,2-5

img

2-4

image-20231223164058987

2-5

e.点击确定,如图2-6

img

2-6

f.点击不重新启动即可

5. 容器化和Dockerfile

容器化就是将应用程序打包成容器,然后在容器中运行应用程序的过程。这个过程可以分为三个步骤

image-20231223164601276

Dockerfile是一个文本文件,里面包含了一条条的指令,用来告诉Docker如何来构建镜像。这个文件包括了我们应用程序执行的所有命令也就是我们刚刚提到的各种依赖 配置环境和运行应用程序所需要的所有内容,一般来说包括下面这些内容:

  • 精简的操作系统如:Alpine

  • 应用程序的运行环境如: Node JS Java

  • 应用程序 如: SpringBoot打包好的jar包

  • 应用程序的第三方依赖库或者包

  • 应用程序的配置文件、环境变量等等。

一般我们在项目的根目录下创建一个Dockerfile文件。Docker会根据Dockerfile里面的指令来构建一个镜像,有了镜像之后,我们可以使用这个镜像来创建容器,然后在容器中运行应用程序。

6. 实践

  1. 首先在创建一个HelloDocker的文件夹。

  2. 然后使用任何编辑器(如Vscode)打开该文件夹。

  3. 在文件夹中创建一个index.js文件,输入console.log(“Hello, Docker”)。

  4. 再打开终端 输入 node index.js,终端会显示Hello,Docker

  5. NodeJS是一个运行时环境,它可以让我们在浏览器之外的地方运行JavaScript的代码,NodeJS和JavaScript的关系就行Java和JRE一样。image-20231223164753609

  6. 所以如果我们要在另外一个环境运行程序,需要做到以下步骤:

    1. 安装操作系统
    2. 安装JavaScript运行环境(NodeJS)
    3. 复制应用程序、依赖包、配置文件
    4. 执行启动命令运行程序

有了Docker之后,我们把这些步骤写入Dockerfile中,剩下的工作Docker会自动化完成。

Dockerfile中

  • 我们需要先指定一个基础镜像,镜像是按层次来构建的,每一次都是基于上一层的,所以我们要指定一个基础镜像,然后在这个镜像的基础上添加我们的应用程序。
  • 我们可以从linux镜像开始,然后在这个镜像基础上安装NodeJS和我们的应用程序。或者使用NodeJS镜像。添加如下代码
1
2
3
FROM node:14-alpine
COPY index.js /index.js
CMD node /index.js

docker build -t hello-docker .

//生成一个镜像名称是hello-docker的镜像 . 表示当前目录

运行结果如下:

image-20231223133401797

docker image ls // 查看docker镜像

运行结果如下:image-20231223165004499

不指定版本默认是latest,如果想要指定版本,那么可以在镜像名字后面加上冒号和版本号,这样我们就完成了镜像的构建。

docker run hello-docker //运行镜像

运行结果如下:image-20231223133322516

如果你想要在另外一个环境中运行这个应用程序的话,那么就只需要复制该镜像运行以下就可以了,或者上传到DockerHub/Harbor镜像仓库中。

同时我们也可以通过在线网页进行Docker使用

play-with-docker

7.DockerDesktopd的使用

DOckerDesktop封装了容器日常使用和管理的各种常用功能,打开控制面板后,在左上角的可以看到

  • Containers(容器)

  • mages(镜像)

在这里可以看到容器和镜像的各种状态

image-20231223134651306

image-20231223134906248

  • volumes(逻辑卷)

    • 逻辑卷是Docker中用来存储数据的。
    • Docker容器有个特点: 容器中的数据不会用永久化。
    • 如果为了保存容器中的数据,那么就要使用逻辑卷解决这个问题。它可以把容器中的目录/路径映射到宿主机的某一个目录或位置上。这样就可以将数据保存到宿主机的磁盘上。实现了数据的持久化。
  • Dev Environments (开发环境)

    • 我们可以使用一些代码来配置这个开发环境,这样就可以把这个开发环境共享给其他工作人员,这样就可以使得每个人在一个相同的环境下进行开发,避免因为环境的不一致导致的各种问题。
  • learning Center(学习中心)

  • Add Extensions(添加扩展)

8. Docker Compose

image-20231223140103433

可以通过一个单独的docker-compose。yaml的配置文件来将这一组相互关联的容器组合在一起形成一个项目,然后使用一条命令就可以启动、停止、或者重建这些服务。

image-20231223140301420

运行一下docker compose up 就可以自动安装各种依赖和配置环境,就可以在本地运行项目了。


Docker学习
http://yyyks5836.github.io/2023/12/23/Docker学习/
作者
洋洋要开森
发布于
2023年12月23日
更新于
2023年12月25日
许可协议