• [Docker]六.Docker自动部署nodejs以及golang项目


    一.自动部署nodejs

    1.创建node项目相关文件

    app.js代码如下:

    1. var express = require('express');
    2. var app=express();
    3. app.get('/',function(req,res){
    4. res.send('首页update');
    5. })
    6. app.get('/news',function(req,res){
    7. res.send('首页');
    8. })
    9. //docker做端口映射的时候不要指定ip
    10. app.listen(3000);

     package.json代码如下:

    1. {
    2. "dependencies": {
    3. "ejs": "^2.5.6",
    4. "express": "^4.15.3",
    5. "socket.io": "^2.0.3",
    6. "body-parser": "~1.17.1"
    7. }
    8. }

    把上面文件放入/var/www/node下,如图:

    2.创建Dockerfile并编写部署代码

    在/var/www/node下创建Dockerfile,并编写部署的代码,代码如下:

    1. #下载node镜像
    2. FROM node
    3. #拷贝当前node项目文件夹下所有文件到镜像的/root/wwwroot下
    4. COPY . /root/wwwroot/
    5. #进入镜像/root/wwwroot文件夹下,安装对应的依赖
    6. WORKDIR /root/wwwroot/
    7. #对外暴露的端口
    8. EXPOSE 3000
    9. #安装依赖:通过npm安装依赖时,有时会报错,这时可以通过安装cnpm来安装依赖
    10. RUN npm install cnpm -g --registry=https://registry.nlark.com
    11. RUN cnpm install
    12. #启动程序
    13. CMD node app.js

    3.生成nodejs项目的镜像并访问项目

    (1).通过docker build -t docker.io/mynode:v1 . 生成node项目镜像

    (2).通过docker images查看生成的node项目镜像
    REPOSITORY                       TAG                 IMAGE ID       CREATED          SIZE
    mynode                 v1                  0efc7b341f5a   28 seconds ago   1.17GB

    (3).通过 docker run -it -d -p 3000:3000 0efc7b341f5a生成的镜像运行node项目容器
    (4).通过docker ps查看运行的容器
    CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                       NAMES
    fe8a6faa796a   0efc7b341f5a   "docker-entrypoint.s…"   5 seconds ago   Up 2 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   eloquent_hodgkin
    (5).访问node项目
    curl 127.0.0.1:3000

    首页update

    (6).通过浏览器访问node容器项目

    1. #通过docker build -t docker.io/mynode:v1 . 生成node项目镜像
    2. [root@localhost node]# docker build -t docker.oo/mynode:v1 .
    3. Sending build context to Docker daemon 4.096kB
    4. Step 1/7 : FROM node
    5. ---> 51bf29046591
    6. Step 2/7 : COPY . /root/wwwroot/
    7. ---> b1f35befd1f9
    8. Step 3/7 : WORKDIR /root/wwwroot/
    9. ---> Running in 29015c51bf9a
    10. Removing intermediate container 29015c51bf9a
    11. ---> ecbd455f1189
    12. Step 4/7 : EXPOSE 3000
    13. ---> Running in 9d3c0d21d1dd
    14. Removing intermediate container 9d3c0d21d1dd
    15. ---> a38c3cd36bcd
    16. Step 5/7 : RUN npm install cnpm -g --registry=https://registry.nlark.com
    17. ---> Running in dcb9adf6929b
    18. npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs
    19. added 440 packages in 27s
    20. 28 packages are looking for funding
    21. run `npm fund` for details
    22. npm notice
    23. npm notice New patch version of npm available! 10.2.0 -> 10.2.4
    24. npm notice Changelog:
    25. npm notice Run `npm install -g npm@10.2.4` to update!
    26. npm notice
    27. Removing intermediate container dcb9adf6929b
    28. ---> 090e84deba2e
    29. Step 6/7 : RUN cnpm install
    30. ---> Running in 2f689257b8c9
    31. Recently updated (since 2023-11-11): 1 packages (detail see file /root/wwwroot/node_modules/.recently_updates.txt)
    32. ✔ Linked 88 latest versions fallback to /root/wwwroot/node_modules/.store/node_modules
    33. deprecate socket.io@2.5.0 › debug@~4.1.0 Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
    34. ✔ Run 1 script(s) in 204ms.
    35. ✔ Installed 4 packages on /root/wwwroot
    36. ✔ All packages installed (106 packages installed from npm registry, used 3s(network 2s), speed 872.71KB/s, json 88(574.66KB), tarball 1.56MB, manifests cache hit 0, etag hit 0 / miss 0)
    37. Removing intermediate container 2f689257b8c9
    38. ---> 445cb2b8c2ab
    39. Step 7/7 : CMD node app.js
    40. ---> Running in 2db6a0168a74
    41. Removing intermediate container 2db6a0168a74
    42. ---> 0efc7b341f5a
    43. Successfully built 0efc7b341f5a
    44. Successfully tagged docker.io/mynode:v1
    45. [root@localhost node]#
    46. [root@localhost node]# docker images
    47. REPOSITORY TAG IMAGE ID CREATED SIZE
    48. mynode v1 0efc7b341f5a 28 seconds ago 1.17GB
    49. #通过生成的镜像运行node项目容器
    50. [root@localhost node]# docker run -it -d -p 3000:3000 0efc7b341f5a
    51. fe8a6faa796a84b938addd9f1bdee02abdae9f90531eb3c05a21a8b1f97dc56a
    52. #docker ps查看运行的容器
    53. [root@localhost node]# docker ps
    54. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    55. fe8a6faa796a 0efc7b341f5a "docker-entrypoint.s…" 5 seconds ago Up 2 seconds 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp eloquent_hodgkin
    56. #访问node项目
    57. [root@localhost node]# curl 127.0.0.1:3000
    58. 首页update[root@localhost node]#

    二.自动部署golang项目

    1.部署编译好的golang项目

    (1).golang项目打包以及部署回顾

    windows下:

    golang项目目录下运行go run ./main.go成功后,在浏览器中访问项目,说明项目ok,然后在项目目录中运行以下命令:

    1. #filename: 文件名
    2. set GOOS=windows
    3. set GOARCH=amd64
    4. go build -o "filename"
    直接双击 filename.exe 文件执行即可,然后可以通过浏览器访问
    linux下:

     golang项目在windows下,需要打包到linux环境去运行,命令如下:

    1. set GOOS=linux
    2. set GOARCH=amd64
    3. go build -o "filename"

     上传到 linux 中赋予执行权限:

    chmod -R 777 目录

     然后在项目目录下执行:

    ./filename
    这样也可以通过浏览器访问了
    beego 项目打包:
    使用命令 bee pack
    windows环境下:
            bee pack -be GOOS=windows
    通过上面命令生成一个tar的打包文件,解压双击exe后即可通过浏览器访问
    而如果需要在linux环境下访问的话,则使用一下命令,生成一个在linux下执行的二进制文件,然后./文件名访问即可:
            bee pack -be GOOS=linux
     

    (2).在linux下访问编译好的项目

    在windows下编译好beego在linux下访问的二进制文件,然后上传到linux中的/var/www/beegotest目录下,然后./beegotest访问即可

     (3).部署编译好的beego项目

    1).在beego项目下创建Dockerfile文件,并写入以下代码
    1. #容器对应的镜像文件的环境
    2. FROM centos:centos7
    3. #把当前bee项目下面的文件拷贝到/root/golang下
    4. COPY . /root/golang
    5. #进入容器/root/golang文件夹
    6. WORKDIR /root/golang
    7. #对外暴露端接
    8. EXPOSE 8080
    9. #启动容器时运行命令:启动bee项目名
    10. ENTRYPOINT ["./beegodemo01"]
    2).编译生成bee项目的docker镜像
    1. [root@localhost beegodemo]# docker build -t docker.io/mybeego:v1.0.1 .
    2. Sending build context to Docker daemon 14.62MB
    3. Step 1/5 : FROM centos
    4. ---> 300e315adb2f
    5. Step 2/5 : COPY . /root/golang
    6. ---> 78670b1c00eb
    7. Step 3/5 : WORKDIR /root/golang
    8. ---> Running in 850af8309c34
    9. Removing intermediate container 850af8309c34
    10. ---> f6f6f3ef99ed
    11. Step 4/5 : EXPOSE 8080
    12. ---> Running in f1ea11c5c19b
    13. Removing intermediate container f1ea11c5c19b
    14. ---> ba11828a3ef1
    15. Step 5/5 : ENTRYPOINT ["./beegodemo01"]
    16. ---> Running in 57d921e41e48
    17. Removing intermediate container 57d921e41e48
    18. ---> 87700337cda3
    19. Successfully built 87700337cda3
    20. Successfully tagged
    3).通过dokcer images查看生成的bee项目docker镜像
    1. [root@localhost ~]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. mybeego v1.0.1 87700337cda3 10 minutes ago 224MB
    4).通过镜像启动bee项目docker容器
    1. [root@localhost ~]# docker run -it -d -p 8081:8080 mybeego:v1.0.1
    2. a38eb4ed369053f2d6c1209fb9070e388616613916f5dc228f5c539efd3aaeee
    5).访问

    2.部署未编译的 golang 项目 

    在linux的/var/www/goweb目录下创建main.go,以及Dockerfile,然后进行操作

    (1).goweb 目录新建 main.go

    1. package main
    2. import (
    3. "fmt"
    4. "net/http"
    5. )
    6. func handlerHello(w http.ResponseWriter, r *http.Request) {
    7. fmt.Fprintf(w, "hello docker")
    8. }
    9. func main() {
    10. http.HandleFunc("/", handlerHello)
    11. http.ListenAndServe(":8080", nil)
    12. }

    (2).在工程目录 goweb 下,新建 Dockerfile 文件

    1. #获取golang环境镜像
    2. FROM golang
    3. #设置开发人员信息
    4. MAINTAINER "1028538262@qq.com"
    5. #把goweb工程目录下的所有文件复制到容器/root/goweb下
    6. ADD . /root/goweb
    7. #cd到/root/goweb
    8. WORKDIR /root/goweb
    9. #执行命令
    10. RUN go mod init goweb
    11. RUN go mod tidy
    12. #执行go build生成可执行的二进制文件
    13. RUN go build
    14. #暴露端口
    15. EXPOSE 8080
    16. #执行容器启动命令: 启动goweb项目
    17. ENTRYPOINT ["./goweb"]

    (3).通过docker build -t 生成goweb项目镜像

    1. [root@localhost goweb]# docker build -t docker.io/goweb:v4 .
    2. Sending build context to Docker daemon 3.072kB
    3. Step 1/9 : FROM golang
    4. ---> 4c88d2e04e7d
    5. Step 2/9 : MAINTAINER "1028538262@qq.com"
    6. ---> Using cache
    7. ---> aa682bbc7c54
    8. Step 3/9 : ADD . /root/goweb
    9. ---> 9747f860ba2a
    10. Step 4/9 : WORKDIR /root/goweb
    11. ---> Running in 4ab2d41b8269
    12. Removing intermediate container 4ab2d41b8269
    13. ---> 794d6dc76dc4
    14. Step 5/9 : RUN go mod init mygoweb
    15. ---> Running in 0e7d4e43f510
    16. go: creating new go.mod: module mygoweb
    17. go: to add module requirements and sums:
    18. go mod tidy
    19. Removing intermediate container 0e7d4e43f510
    20. ---> 0f5176b44c2a
    21. Step 6/9 : RUn go mod tidy
    22. ---> Running in 2604b6df8323
    23. Removing intermediate container 2604b6df8323
    24. ---> c2e03a32a3b7
    25. Step 7/9 : RUN go build
    26. ---> Running in 0dd305afa33b
    27. Removing intermediate container 0dd305afa33b
    28. ---> 206024eb719c
    29. Step 8/9 : EXPOSE 8080
    30. ---> Running in 756480f55fb3
    31. Removing intermediate container 756480f55fb3
    32. ---> 60d3344f4c27
    33. Step 9/9 : ENTRYPOINT ["./goweb"]
    34. ---> Running in 6eca95002f82
    35. Removing intermediate container 6eca95002f82
    36. ---> 3bf4b763b543
    37. Successfully built 3bf4b763b543
    38. Successfully tagged goweb:v4

    (4).查看是否生成镜像

    通过docker images查看

    1. [root@localhost goweb]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. goweb v4 3bf4b763b543 About a minute ago 885MB

    (5).启动项目容器

    通过docker run -it -d -p 8081:8080 镜像ID启动

    1. [root@localhost goweb]# docker run -it -d -p 8081:8080 3bf4b763b543
    2. e44585ca40e1c3a19c6f61cac7eee40836e9d7e71d35de49e1449dcacc53959b

    (6).查看是否启动容器

    通过docke ps查看

    1. [root@localhost goweb]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. e44585ca40e1 ee27c58e2ef5 "./goweb" 7 seconds ago Up 4 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp epic_merkle

    (7).通过浏览器访问看看是否成功

     (8).进入goweb项目容器查看数据

    1. #通过docker exec -it 进入容器,
    2. [root@localhost goweb]# docker exec -it e44585ca40e1 /bin/bash
    3. #go version 存在,说明容器中已经有golang环境了
    4. root@e44585ca40e1:~/goweb# go version
    5. go version go1.21.4 linux/amd64
    6. #还可以通过go env 查看golang配置常量
    7. root@e44585ca40e1:~/goweb# go env
    8. GO111MODULE=''
    9. GOARCH='amd64'
    10. GOBIN=''
    11. GOCACHE='/root/.cache/go-build'
    12. GOENV='/root/.config/go/env'
    13. GOEXE=''
    14. GOEXPERIMENT=''
    15. GOFLAGS=''
    16. GOHOSTARCH='amd64'
    17. GOHOSTOS='linux'
    18. GOINSECURE=''
    19. GOMODCACHE='/go/pkg/mod'
    20. GONOPROXY=''
    21. GONOSUMDB=''
    22. GOOS='linux'
    23. GOPATH='/go'
    24. GOPRIVATE=''
    25. GOPROXY='https://proxy.golang.org,direct'
    26. GOROOT='/usr/local/go'
    27. GOSUMDB='sum.golang.org'
    28. GOTMPDIR=''
    29. GOTOOLCHAIN='local'
    30. GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
    31. GOVCS=''
    32. GOVERSION='go1.21.4'
    33. GCCGO='gccgo'
    34. GOAMD64='v1'
    35. AR='ar'
    36. CC='gcc'
    37. CXX='g++'
    38. CGO_ENABLED='1'
    39. GOMOD='/root/goweb/go.mod'
    40. GOWORK=''
    41. CGO_CFLAGS='-O2 -g'
    42. CGO_CPPFLAGS=''
    43. CGO_CXXFLAGS='-O2 -g'
    44. CGO_FFLAGS='-O2 -g'
    45. CGO_LDFLAGS='-O2 -g'
    46. PKG_CONFIG='pkg-config'
    47. GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build2427941496=/tmp/go-build -gno-record-gcc-switches'
    48. root@e44585ca40e1:~/goweb#

    3.部署未编译的 beego 项目

    (1).查看bee --help,bee自动生成Dockerfile

    可以通过bee --help查看帮助文档

    1. version Prints the current Bee version
    2. migrate Runs database migrations
    3. api Creates a Beego API application
    4. bale Transforms non-Go files to Go source files
    5. fix Fixes your application by making it compatible with newer versions of Beego
    6. pro Source code generator
    7. dev Commands which used to help to develop beego and bee
    8. dlv Start a debugging session using Delve
    9. dockerize Generates a Dockerfile and docker-compose.yaml for your Beego application
    10. generate Source code generator
    11. hprose Creates an RPC application based on Hprose and Beego frameworks
    12. new Creates a Beego application
    13. pack Compresses a Beego application into a single file
    14. rs Run customized scripts
    15. run Run the application by starting a local development server
    16. server serving static content over HTTP on port
    17. update Update Bee

    发现可以通过dockerize   参数生成Dockefile文件,当然也可以不通过dockerize自己编写Dockerfile

    (2).自己编写Dockerfile

    自己编写的Dockerfile: 

    1. #从golang获取镜像
    2. FROM golang
    3. #创建者邮箱
    4. MAINTAINER "1028538262@qq.com"
    5. #赋值beego项目到/root/beegodemo01
    6. COPY . /root/beegodemo01
    7. #进入容器中项目目录
    8. WORKDIR /root/beegodemo01
    9. #配置环境变量
    10. ENV GO111MODULE=on
    11. ENV GOPROXY=https://goproxy.cn,direct
    12. #运行命令:下载beego
    13. RUN go get -u github.com/beego/bee
    14. #暴露端口
    15. EXPOSE 8080
    16. #容器启动命令:运行bee项目
    17. ENTRYPOINT ["bee", "run"]

    (3).通过docker build -t 生成bee项目镜像

    1. [root@localhost beegotest]# docker build -t docker.io/beego:1.1 .
    2. Sending build context to Docker daemon 121.3kB
    3. Step 1/9 : FROM golang
    4. ---> 4c88d2e04e7d
    5. Step 2/9 : MAINTAINER "1028538262@qq.com"
    6. ---> Using cache
    7. ---> aa682bbc7c54
    8. Step 3/9 : COPY . /root/beegodemo01
    9. ---> 3f66273e71e9
    10. Step 4/9 : WORKDIR /root/beegodemo01
    11. ---> Running in c67b1bb8c951
    12. Removing intermediate container c67b1bb8c951
    13. ---> d3f44b8e021a
    14. Step 5/9 : ENV GO111MODULE=on
    15. ---> Running in 8b7b5c5e81d6
    16. Removing intermediate container 8b7b5c5e81d6
    17. ---> bb6f1cb28746
    18. Step 6/9 : ENV GOPROXY=https://goproxy.cn,direct
    19. ---> Running in 97b7a35d38c3
    20. Removing intermediate container 97b7a35d38c3
    21. Successfully built 931a238bfbbb
    22. Successfully tagged beego:1.1

    (4).通过docker images查看是否生成镜像成功

    1. [root@localhost beegodemo01]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. beego v3.0.1 931a238bfbbb About a minute ago 1.01GB

    (5).通过镜像ID启动bee项目容器

    docker run -it -d -p 8083:8080 --name beegodemo 镜像ID

    (6).查看是否启动容器成功

    1. [root@localhost beegodemo01]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED
    3. 1c96e85d3c03 golangimg:v3.0.1 "/bin/sh -c 'bee run'" 7 seconds ago Up 6 s
    4. econds 0.0.0.0:8083->8080/tcp, :::8083->8080/tcp beegodemo

    (7).通过浏览器访问看看是否成功

    发现操作成功,说明bee项目镜像,容器部署成功

    [上一节] [Docker]五.Docker中Dockerfile详解

  • 相关阅读:
    Windows11 OneDrive 安装后无法打开的解决办法
    Java基础入门1-2
    科研笔记—Ergodic Rate Analysis of STAR-RIS Aided NOMA Systems
    数据结构学习系列之双向链表的三种插入方式
    第六节:Word中对象的层次结构
    Windows 多线程编程 C语言
    《Go Web 编程》之第1章 Go与Web应用
    websocket 连接,http 协议下用 ws, https 协议下必须要使用 wss
    意大利法院认可GPL开源协议的法律效力
    DHCP自动分配IP原理
  • 原文地址:https://blog.csdn.net/zhoupenghui168/article/details/134480437