Docker 搭建你的第一个 Node 项目到服务器
nanshan 2024-10-10 07:16 13 浏览 0 评论
本文你能学到什么
Docker 是什么
Docker 概念
关于 Docker 的概念是确实不太好总结,下面我通过四点向你说明 Docker 到底是个什么东西。
- Docker 是世界领先的软件容器平台。
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核 的cgroup,namespace,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进 程,因此也称其为容器。Docker 最初实现是基于 LXC.
- Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上,构建杰出的软件。
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 的基本组成架构
看一张 Docker 架构图
- 左边大框框是我们进行 Docker 操作的宿主机,其运行了一个 Docker daemon 的核心守护程序,负责构建、运行和分发 Docker 容器。
- 在宿主机中安装了 Docker 客户端,其与 Docker daemon 守护进程进行通信,客户端会将 build、pull、run 等命令发送到 Docker daemon 守护进程进行执行。
- 右框框为 Docker 注册表存储 Docker 镜像,是一个所有 Docker 用户共享 Docker 镜像的服务,Docker daemon 守护进程与之进行交互。
下面是对架构中基本组成说明,比较详细,大家看的时候可以对着架构图看。概念这个东西,你看下就好,怎么记都记不住的,只有你常用的东西才会记住和想着去记住它,看完本文,可以把下面的应用实践一遍。
Registry
镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像。
Docker 镜像
类似虚拟机快照,从仓库拉取,或者在现有工具镜像上创建新镜像。通过镜像可以启动容器。
Docker 容器
从镜像中创建应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。
Docker 数据卷
数据卷可以完成数据持久化,数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
Docker 网络
Docker 容器之间的网络交互,可以使用端口映射的方式,其他容器可以直接通过端口实现。除该方式外还有一个容器连接(linking)系统也可以达到容器交互。(本文中 node 连接 mongodb 使用的是端口映射的方式)
关于Docker 网络模块,容器连接详情推荐这篇文章:Docker的网络模式详解
Docker 应用场景
Docker 部署 Node 项目完整流程(DockerFile实践)
- 使用 Koa2 初始化一个 Node 项目,通过 Mongose 中间件 连接 Mogodb 数据库,实现一个基础接口 Mogodb 插入数据。项目地址:https://github.com/koala-coding/dockerstudy
- 首先在项目根目录下创建 .dockerignore 文件,把不需要打包进 Docker Image 里的文件进行过滤# /usr/src/nodejs/dockerstudy/.dockerignore .git node_modules
- 在项目的根目录中创建 Dockerfile 文件(Dockerfile 这里重点讲一下)部署 Node项目 的时候,会有一个 Dockerfile 文件配置# /usr/src/nodejs/hello-docker/Dockerfile FROM node:10.0 # 在容器中创建一个目录 RUN mkdir -p /usr/src/nodejs/ # 定位到容器的工作目录 WORKDIR /usr/src/nodejs/ # RUN/COPY 是分层的,package.json 提前,只要没修改,就不会重新安装包 COPY package.json /usr/src/app/package.json RUN cd /usr/src/app/ RUN npm i # 把当前目录下的所有文件拷贝到 Image 的 /usr/src/nodejs/ 目录下 COPY . /usr/src/nodejs/ EXPOSE 3000 CMD npm start 配置参数说明( DockerFile 学习):
- FROM:FROM 是构建镜像的基础源镜像,该 Image 文件继承官方的 node image。详细说明:Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令!它引入一个镜像作为我们要构建镜像的基础层,就好像我们首先要安装好操作系统,才可以在操作系统上面安装软件一样。
- RUN:后面跟的是在容器中要执行的命令。详细说明:每一个 RUN 指令都会新建立一层,在其上执行这些命令,我们频繁使用 RUN 指令会创建大量镜像层,然而 Union FS 是有最大层数限制的,不能超过 127 层,而且我们应该把每一层中我用文件清除,比如一些没用的依赖,来防止镜像臃肿。
- WORKDIR:容器的工作目录
- COPY:拷贝文件至容器的工作目录下,.dockerignore 指定的文件不会拷贝
- EXPOSE:将容器内的某个端口导出供外部访问
- CMD:Dockerfile 执行写一个 CMD 否则后面的会被覆盖,CMD 后面的命令是容器每次启动执行的命令,多个命令之间可以使用 && 链接,例如 CMD git pull && npm start详细说明:CMD 指令用来在启动容器的时候,指定默认的容器主进程的启动命令和参数。它有两种形式CMD echo 1 CMD ["npm", "run", "test"] 必须是双引号 第一种执行的命令会被包装程,CMD [ "sh", "-c", "echo 1" ] JSON 数组形式,一般推荐 JSON 数组形式。容器中的应用都应该以前台执行,而不是启动后台服务,容器内没有后台服务的概念。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义。比如 CMD service nginx start 它等同于 CMD [ "sh", "-c", "service nginx start"] 主进程实际上是 sh,sh 也就结束了,sh 作为主进程退出了。
- ENV(补充)ENV 指令用来设置环境变量,它有两种形式:ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... 定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
Docker 部署 Mongodb 环境
- 远程获取 Mongodb 镜像
docker pull mongo
- 创建一个docker容器docker run -p 27017:27017 -v /data/db --name docker_mongodb -d mongo 在上面的命令中,几个命令参数的详细解释如下:
- -p 指定容器的端口映射(特殊说明:前面的是本机端口 ,后面的是容器的端口,添加-p参数主动将容器内部端口给暴漏出来,将服务器的 27017 端口映射到容器的 27017 端口,这样在外网就可通过 服务器的 27017 端口访问到我们的服务,Mongodb 默认端口为 27017。最终访问的还是本机的端口)
- -v 为设置容器的挂载目录,这里是将即本机中的目录挂载到容器中的/data/db中,作为 Mongodb 的存储目录
- --name 为设置该容器的名称
- -d 设置容器以守护进程方式运行
可视化工具连接
以上是 MongoDB 容器创建后的信息。接下来,我们使用 Robo 3T 图形界面软件尝试打开数据库。打开 RoBo 3T,选择新建连接,按照下图填入相关数据库信息,保存。
★
注意其中的权限认证。连接数据库时候可能失败,会出现问题,这时候注意一个问题,安全组问题,需要把安全组中的27017的 Mongodb 数据库端口打开
”
优雅部署方式 DockerCompose
Compose 是 Docker 官方开源的一个项目,可以管理多个 Docker 容器组成一个应用,例如 Web 服务,除了服务本身还有数据库、Redis、Nginx 等一系列相关联服务需要安装。
有个 Compose 的支持,我们只需要定义一个 YAML 格式的配置文件(docker-compose.yml),来编写一个项目所需要的多个容器配置及调用关系,通过简单的命令即可同时开始或者关闭这些容器。Compose 定位是定义和运行多个 Docker 容器的应用。在这篇文章中不具体讲 DockerCompose 使用,主要讲清楚 Docker 基本架构各部分的应用,多实践下哦!
Docker 带来了什么(优点)
- 环境隔离('隔离,安全')Docker 实现了资源隔离,一台机器运行多个容器互无影响。
- 更高效的资源利用(节约成本)Docker 容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
- 更快速的交付部署(敏捷)使用 Docker,开发人员可以利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。
- 更易迁移扩展(可移植性)Docker 容器几乎可以在任意的平台上运行,包括虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。
- 更简单的更新管理(高效)使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。
Docker的常用命令
镜像常用命令
docker pull [镜像名称:版本] 拉取镜像
docker images 镜像列表
docker rmi [镜像名称:版本] 删除镜像
docker history [镜像名称] 镜像操作记录
docker tag [镜像名称:版本][新镜像名称:新版本]
docker inspect [镜像名称:版本] 查看镜像详细
docker search [关键字] 搜索镜像
docker login 镜像登陆
容器常用命令
docker ps -a 容器列表(所有容器)
docker ps 查看所有(运行的)容器
docker exec -ti <id> bash 以 bash 命令进入容器内
docker run -ti --name [容器名称][镜像名称:版本] bash 启动容器并进入
docker logs 查看容器日志
docker top <container_id> 查看容器最近的一个进程
docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash 端口映射
docker rm <container_id> 删除容器
docker stop <container_id> 停止容器
docker start <container_id> 开启容器
docker restart <container_id> 重启容器
docker inspect <container_id> 查看容器详情
docker commit [容器名称] my_image:v1.0 容器提交为新的镜像
DockerFile常用命令
在上面实战中已经详细讲解,可以返回看,这里就不再重复写。
总结
读完本文后,你应该掌握了 Docker 的基本使用,对 Docker 这个概念不那么陌生了,并且知道了它的应用场景,可以自己实践下,这个过程也会出现很多问题的,实践才能更好的记住那些知识以及常用命令。
相关推荐
- 实战派 | Java项目中玩转Redis6.0客户端缓存
-
铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
-
1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...
- Redis与本地缓存联手:多级缓存架构的奥秘
-
多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
-
本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
-
你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
-
在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...
- Spring boot 整合Redis缓存你了解多少
-
在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
-
在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
-
一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
-
缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- Redis客户端缓存的几种实现方式
-
前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...
- Nginx合集-常用功能指导
-
1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...
- 腾讯云国际站:腾讯云怎么提升服务器速度?
-
本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...
- 雷霆一击服务器管理员教程
-
本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 实战派 | Java项目中玩转Redis6.0客户端缓存
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
- Redis与本地缓存联手:多级缓存架构的奥秘
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
- Spring boot 整合Redis缓存你了解多少
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)