前言
最近使用 nest 做了一个 后端项目,遇到了很多关于没有遇见过的后端的知识,决定开一个新的栏目记录我的第一次
🦝关于docker
- 为什么会有
docker
- 什么是
docker
- 怎么使用
docker
也就是 why,what ,how
首先第一个问题:为什么会有docker
要想解决这个问题,就要知道 docker 解决了哪些痛点😧
在传统部署后端项目中,常常会遇到以下的情况 在
- 开发人员在不同的环境中开发和测试应用程序时可能会出现环境不一致的情况,导致开发、测试和生产环境之间存在差异。
- 传统部署应用程序需要手动设置环境、安装依赖等耗时耗力。
- 传统部署应用程序可能会造成资源浪费,因为每次部署都需要独立的虚拟机或物理服务器。
特别是前两个问题,比如你在项目中使用 mysql
,redis
,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
之前,我们想象一个饭店是怎么在空地上开起来的
- 找到合适的大楼
- 在大楼里找到设置一个工作空间,以确保能够找到所有的工具
- 把所需要的材料都搬进屋子里
- 开始做饭
- 安装一个全局的服务台,用于家中提供服务
- 开设供应服务的窗口
我们来逐行分析 Dockerfile
文件
FROM node:latest
拉取最新的 node 镜像 -- 找到合适的大楼WORKDIR /app
创建工作目录 app -- 找到合适的屋子COPY . .
把本地文件拷贝到当前文件下即app
目录里 --- 把材料搬进屋子RUN npm config set registry https://registry.npmmirror.com/
在终端中设置 npm 加速镜像RUN npm install -g http-server
下载http-server
模块 --开始做饭EXPOSE 8080
把容器内的端口暴露出来 --开设窗口CMD ["http-server", "-p", "8080"]
执行http-server 命令并配上参数
我们再来看命令
docker build -t a:b .
注意:最后有一个
.
我们是构建了一个镜像,-t
是 tag
的缩写,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 技术有所帮助