从零学 - docker

前言

最近使用 nest 做了一个 后端项目,遇到了很多关于没有遇见过的后端的知识,决定开一个新的栏目记录我的第一次

🦝关于docker

  1. 为什么会有 docker
  2. 什么是 docker
  3. 怎么使用 docker

也就是 why,what ,how

首先第一个问题:为什么会有docker

要想解决这个问题,就要知道 docker 解决了哪些痛点😧

在传统部署后端项目中,常常会遇到以下的情况 在

  1. 开发人员在不同的环境中开发和测试应用程序时可能会出现环境不一致的情况,导致开发、测试和生产环境之间存在差异。
  2. 传统部署应用程序需要手动设置环境、安装依赖等耗时耗力。
  3. 传统部署应用程序可能会造成资源浪费,因为每次部署都需要独立的虚拟机或物理服务器。

特别是前两个问题,比如你在项目中使用 mysqlredis,nginx,那么就需要分别设置环境,搞一大堆配置项,但是有了 docker,只需要 Dockerfile 文件即可解君愁,使用文件来帮你搞定所有环境和配置项

第二个问题,什么是docker

Docker 是一种开源的容器化平台,可以让开发人员和系统管理员在容器中打包、交付和运行应用程序。Docker 利用容器技术,将应用程序和其所有依赖项打包到一个独立的容器中,形成一个轻量级、可移植的应用环境。

Docker 的主要组成部分包括:

  • Docker引擎:负责管理容器的创建、运行和销毁。Docker 引擎包含 Docker 守护进程(Docker Daemon)和 Docker 客户端(Docker Client)。
  • Docker镜像(Image) :镜像是应用程序打包的静态文件,包括应用程序的代码、运行环境、依赖库等。镜像可以通过 Dockerfile 定义,然后使用 Docker 镜像构建工具构建。
  • Docker容器(Container) :容器是从镜像创建的运行实例,包含了应用程序以及其运行时需要的所有组件。容器可以快速部署、启动、停止和删除。

通过 Docker,开发人员可以实现快速部署应用程序、实现开发环境的一致性、有效利用计算资源等优势。Docker 已经被广泛用于开发、测试和生产环境中,成为现代软件开发和部署的重要工具之一。

以上回答来自 gpt3.5

docker 最重要的概念是 容器镜像 的概念,镜像可以看做是带有运行环境的 , 容器是这个 创建出来的 实例有一个不太恰当的例子,镜像就是前端中的 lodash库,容器就是使用 lodash 的文件

第三个问题,怎么使用 docker

先举一个简单的例子,把 一个index.html 文件使用本地服务运行起来

如果你的编辑器安装了插件 http-server 后,可以启动一个本地服务

使用 docker 怎么启动服务呢?

多说无益,直接上代码

js 复制代码
FROM node:latest

WORKDIR /app

COPY . .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm install -g http-server

EXPOSE 8080

CMD ["http-server",'-p','8080']

先不要管为什么这么写,先看效果

代码结构长这样

在终端中执行 docker build -t a:b .

在终端中执行 docker run -d --name cc a:b -p 8888:8080

访问 http://localhost:8888/,你就会神奇的发现😲,你的 index.html 文件可以访问了

在分析 Dockerfile 之前,我们想象一个饭店是怎么在空地上开起来的

  1. 找到合适的大楼
  2. 在大楼里找到设置一个工作空间,以确保能够找到所有的工具
  3. 把所需要的材料都搬进屋子里
  4. 开始做饭
  5. 安装一个全局的服务台,用于家中提供服务
  6. 开设供应服务的窗口

我们来逐行分析 Dockerfile 文件

  1. FROM node:latest 拉取最新的 node 镜像 -- 找到合适的大楼
  2. WORKDIR /app 创建工作目录 app -- 找到合适的屋子
  3. COPY . . 把本地文件拷贝到当前文件下即 app 目录里 --- 把材料搬进屋子
  4. RUN npm config set registry https://registry.npmmirror.com/ 在终端中设置 npm 加速镜像
  5. RUN npm install -g http-server 下载 http-server 模块 --开始做饭
  6. EXPOSE 8080 把容器内的端口暴露出来 --开设窗口
  7. CMD ["http-server", "-p", "8080"] 执行http-server 命令并配上参数

我们再来看命令

docker build -t a:b .

注意:最后有一个 .

我们是构建了一个镜像,-ttag 的缩写,a:b 的含义是镜像名是 a, 打了一个叫 b 的标签 同时,在最后我们使用 . 作为上下文,代表了 Dockerfile 的位置

如果你安装了 docker 的客户端,你会看到这样的

等镜像构建完成,我们就可以基于这个镜像创建一个容器了

docker run -d --name cc -port 8888:8080 a:b

  • -d 是 detach(脱离),可以开一个守护进程,不会把终端卡住
  • --name 创建一个容器名称
  • -port 把外面的端口和容器端口做一个映射
  • a:b 就是把 镜像名:tag整体 作为唯一标识

通过 copy 把文件复制到 app 目录里面,所以可以访问 / 或者是index.html

访问 http://localhost:8888/index.html 也是一样的

ok,到现在为止已经docker 的基础部分已经结束了

但是你也许会发现了问题,如果我想要修改 html 文件,必须重新构建,然后再次运行,还是挺麻烦的,有没有解决办法呢?有的,那就是数据卷

数据卷会把外界的文件与容器内的文件做一个映射,修改外界文件相当于修改容器内的文件

我们先使用 docker stop cc 把容器停掉,然后使用docker rm cc 把容器 cc 删除

我们再重新跑一遍,这次加上 -v(volume)

把我桌面上的路径映射到 /app 目录里,docker 自动把 app 目录标识为 mount状态

当我修改我外部的文件时,只需要让容器重新启动即可docker restart cc

也可以在 这里查看修改文件

nginx 练习

nginx 也可以启动一个本地服务,来使用 nginx 做一个练习吧

Dockerfile 就这么两行,因为 /usr/share/nginx/html 是 nginx 内部放 html 文件的地方,所以无需创建 workdir

js 复制代码
FROM nginx:1.24.0

COPY . /usr/share/nginx/html

剩下的就和上文一样,创建镜像,启动容器,感兴趣的可以自己试试

结束

docker 确实大大简化了我们部署的难度,可以更快速、高效地构建、发布和运行应用程序,实现了开发、测试和部署过程的标准化和自动化。

今天介绍了docker的一些简单知识,希望本文对你理解 Docker 技术有所帮助

相关推荐
GISer_Jing6 分钟前
前端测试工具(Jest与Mock)
前端·测试工具
techdashen7 分钟前
Go context.Context
开发语言·后端·golang
凡人的AI工具箱9 分钟前
40分钟学 Go 语言高并发:Select多路复用
开发语言·后端·架构·golang
ModelBulider14 分钟前
SpringMVC应用专栏介绍
java·开发语言·后端·spring·springmvc
恬淡虚无真气从之16 分钟前
go 结构体方法
开发语言·后端·golang
licy__17 分钟前
HTML 元素类型介绍
前端·css·html
一雨方知深秋22 分钟前
WEB APIS(DOM对象,操作元素内容,属性,表单属性,自定义属性,定时器)
开发语言·前端·javascript
三金1213834 分钟前
整站使用Vue(工程化)
前端·javascript·vue.js
爪哇学长1 小时前
打造极致网页体验:HTML与CSS高级实战秘籍
前端·css·html
m0_748230211 小时前
【Spring Boot】Spring AOP中的环绕通知
spring boot·后端·spring