• 教你使用Docker部署node项目


    1.引言

        最近一打开CSDN基本上都是在介绍云原生,本着不想被时代淘汰的想法自己也找了个视频教程看了看,发现原来还是与Docker相关,自己之前也写过一篇关于Docker的学习总结,但是感觉写的不是很好,由于时间关系等没有对Docker展开实际实践,于是决定以实践为主再来写下一篇,为学习云原生做铺垫。

    2.学习条件

        云服务器分为公有云、私有云以及混合云(公有云和私有云的一种混合),公有云是指由阿里云、腾讯云、青云等平台提供的云资源,包括服务器、数据库等,私有云则是指由企业自己搭建的私有机房构成的,这种往往运营成本比较高,而且稳定性不如公有云,学习云原生,需要有一台服务器,刚好我这里由阿里云学生机,当然如果没有的话可以使用Linux镜像本地搭建一个服务器,当然有服务器用起来还是更加真实。

    3.基本概念介绍

        基本的理论基础还是需要的,这里主要介绍几个关键的理论知识点,以实践为主。云原生,云原生不是一个产品,而是一套技术体系和一套方法论,是云计算的一个必然导向。它可以根据商业能力对公司进行重组的能力,既包含技术、也包含管理,可以说是一系列云技术和企业管理方法的集合,通过实践及与其他工具相结合更好地帮助用户实现数字化转型。云原生的要点如下:
    在这里插入图片描述
    这些概念我表示自己也不是很清晰,这个时候可以先逐步 使用之后再来分析。首先咱走Docker+kubernetes(k8s)。k8s可以粗糙的理解成用来更好的管理Docker中运行的容器的,k8s对于容器化的推广起到了很关键的作用,之后再来细说这个。咱这篇文章就是得把Docker摸明白。
        最开始一台电脑上面运行多个应用,但是有些时候可能某个应用故障了,直接导致整个机器崩溃了。于是有了虚拟机,虚拟机指的是在一台机器上新开一个操作系统,但是一个操作系统需要占用大量的资源,不利于提高资源的利用率,于是出现了Docker的容器化思想,将相同的资源重复利用,依赖于Linux 内核环境(因此在Windows系统中需要开启虚拟化技术或者构建Linux虚拟机),只需要将不同的资源差分加载,减少了操作系统级别资源的加载,极大的提高了资源的利用率。

    4.Docker基本使用

    下载Docker,对于windows使用Docker,Docker会自动安装到C盘,并构建Linux环境,Windows装这个主要是用于开发。接着连接虚拟机,这里使用Xshell工具连接远程虚拟机方便输入Linux指令。依次执行如下指令:
    (1)切换到管理员级别的用户:

    sudo su root
    
    • 1

    (2)删除原来可能已经存在的Docker相关资源:

    sudo yum remove docker*
    
    • 1

    (3)配置yum源,改用阿里云镜像,提高下载速度:

    sudo yum install -y yum-utils
    sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    • 1
    • 2
    • 3
    • 4

    (4)下载Docker(-y表示始终确认下一步):

    sudo yum install -y docker-ce docker-ce-cli containerd.io
    
    • 1

    安装完成效果如下:
    在这里插入图片描述
    (5)启动docker:

    systemctl enable docker --now
    
    • 1

    (6)在docker中配置阿里云加速(免费功能),在阿里云搜索栏搜索容器镜像服务,找到如下内容:
    在这里插入图片描述
    接下来以Nginx为例使用docker,首先前往dockerHub搜索需要的镜像:
    在这里插入图片描述
    在docker中下载镜像:
    在这里插入图片描述
    下载完成之后可以使用docker images查看下载的镜像:
    在这里插入图片描述
    补充说明:如果需要指定版本号,使用:docker pull nginx:1.20.1,默认其实是docker pull nginx:latest。之后这个版本号就对应上面的tag,可以再下一个redis练习一下。
    (7)开启镜像,使用如下指令:

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    #【docker run  设置项   镜像名  】 镜像启动运行的命令
    # -d:后台运行,没有配置后台运行
    # --restart=always: 开机自启
    # -p端口映射 主机端口:被映射的docker容器端口,举例如下
    docker run --name=mynginx   -d  --restart=always -p  88:80   nginx
    # 查看正在运行的容器
    docker ps
    # 查看所有
    docker ps -a
    # 删除停止的容器
    docker rm  容器id/名字
    docker rm -f mynginx   #强制删除正在运行中的
    
    #停止容器
    docker stop 容器id/名字
    #再次启动
    docker start 容器id/名字
    
    #应用开机自启,但是update函数不能够临时修改映射端口
    docker update 容器id/名字 --restart=always
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (8)以nginx为例开一个容器,首先去阿里云服务器开放88端口:
    在这里插入图片描述
    执行如下的Linux指令(利用nginx开设镜像,配置开机自启,后台运行,将虚拟主机的88端口映射到docker的80端口上):

    docker run --name=mynginx   -d  --restart=always -p  88:80   nginx
    
    • 1

    展示效果(等价于将一个Linux映射到另外一个小的Linux环境中):
    在这里插入图片描述

    5.Docker进阶使用

        接下来的使用举例可能理解起来或者实际操作等的时候有点难度,额外罗列出来。
    (1)修改nginx的默认展示页面,这个就需要明白在nginx里面,默认的html页面所在位置了,解决方法是查看docker hub里面提供的介绍:
    在这里插入图片描述
    接下来是修改指令以及效果展示:

    docker exec -it mynginx /bin/bash \
    cd /usr/share/nginx/html \
    echo "<h1>Welcome to website of flying_dark_feather.</h1>" > index.html \
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    接下来直接上手尝试打包和部署我们常用的node项目,首先,因为我的项目之前是已经在学生机里面部署好了的:
    在这里插入图片描述
    咱这里直接压缩下载一份,确保项目的良好性:
    在这里插入图片描述
    接着目标就是在windows(开发系统)中打包项目:
    在这里插入图片描述
    接下来,用VScode打开项目,没有安装docker扩展程序的可以装一下,然后在根目录下面新建一个Dockerfile文件,写入如下内容:

    # use docker node latest
    FROM node:latest
    # create a directory to run docker
    WORKDIR /app
    # copy package.json into the new directory
    COPY package.json /app
    # install the dependencies
    RUN npm install
    # copy all other files into the app directory
    COPY . /app
    # open port 5000(这个是服务器访问端口)
    EXPOSE 5000
    # run the server
    CMD node app.js
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    双击运行windows(开发系统)的docker:
    在这里插入图片描述
    接下来创建一个docker镜像(取名为:docker-node-epidemic),后面的 . 是一个参数,不要漏了:

    docker build -t docker-node-epidemic .
    #-t即取名参数,这里的.可以理解成根据Dockerfile文件将当前目录的项目打包成镜像
    
    • 1
    • 2

    在docker的windows图形化界面的images里面就可以看见了:
    在这里插入图片描述
    使用localhost:5000(因为现在是将windows的5000端口映射到了Linux虚拟应用的3030端口上面了)访问:
    在这里插入图片描述
    我们回到docker的用户可视化工具里面可以看到如下容器信息:
    在这里插入图片描述
        每次重新执行docker run -it -p 5000:3030 docker-node-epidemic都会重新建立一个新的容器,及时是端口被占用依旧会产生的新的镜像。甚至可以将主机上面的多个端口都映射到一个容器里面。那这样你就会立马想到:可以构建多个使用不同端口的相同项目,然后将服务器的不同端口映射到不同的容器上面,也就是一个服务器其实可以同时运行了多个相同功能应用,有提高并发的可能。虽然客户端的docker可以利用可视化工具编辑docker,但是还是建议使用命令行,就和git的使用一样,虽然有gitGUI但是命令行使用的更多。命令行也能更好的理解原理。
        接下来尝试将这个容器弄到服务器上面。首先需要在dockerhub注册用户,验证邮箱,然后创建镜像仓库:
    在这里插入图片描述
    远程的dockerhub里面创建了镜像之后,需要使用如下指令将镜像换个名字:

    docker tag docker-node-epidemic moonlight1224/epidemic-admin:latest
    
    • 1

    然后执行如下bash指令将镜像推到远程去:

    docker push moonlight1224/epidemic-admin
    
    • 1

    推动完成之后的效果如下:
    在这里插入图片描述
    好接下来就去镜像的拉取了,回到Xshell里面,直接执行如下指令拉取镜像:
    在这里插入图片描述
    为了防止发生冲突咱先把服务器上正在运行的项目给停了,方式之后使用端口的时候冲突,然后执行如下指令:

    docker run -it -p 5000:3030 moonlight1224/epidemic-admin
    
    • 1

    在这里插入图片描述
    接下来就涉及到了端口的修改问题了,也就是对应于项目中的迭代,即修改代码重新部署发布。直接修改本地的Dockerfile文件,重新打包镜像。上传,然后去服务器上面拉取,发现如下问题:
    在这里插入图片描述
    那就得把这个无效的镜像给删了,解决方法为docker images | grep none查到镜像对应的id,然后利用docker rmi 镜像id删除镜像。这次由于更改了外部端口,因此对应的端口也是一样的了:

    docker run -it -p 3030:3030 moonlight1224/epidemic-admin
    
    • 1

    和我们想的一样:
    在这里插入图片描述
    结束了吗?因为这个域名我一开始使用的是白塔面板配的,果不其然把这个项目删了只能使用端口访问了:
    在这里插入图片描述

    6.为容器绑定域名

        有一些强迫症,这个域名还是得绑定一下的。还得细摸一会儿,感觉还没搞懂,如果搞懂了之后可能会再写一篇。

    7.参考文献

        (1)详解使用Docker给nodejs程序打包的方法

  • 相关阅读:
    大神方案|如何重写一个万行代码的类文件
    144. 授人以渔 - 如何查找 SAP UI5 官网上没有提到的控件属性的使用明细
    大数据组件之Hbase(待补充)
    Vant组件库入门知识
    利用神器Nginx + X-Accel,实现PHP大文件下载统计、权限判断、速度限制
    在k8s中通过CoreDNS进行域名解析的其中三种方法
    玩玩群晖NAS-搭建一个私有的Git服务
    安装及使用nginx
    数据结构基础10:三路划分(解决快速排序的问题)
    RabbitMQ消息发送和接收(实例)
  • 原文地址:https://blog.csdn.net/weixin_46560512/article/details/125544423