云计算与云服务期末

打印 上一主题 下一主题

主题 533|帖子 533|积分 1599

云计算与云服务期末论文


  
一、docker engine 安装过程

   进入官网下载,只安装Docker Engine 选择Apt安装Docker

  复制以下内容到putty
  1. # Add Docker's official GPG key:
  2. sudo apt-get update
  3. sudo apt-get install ca-certificates curl gnupg
  4. sudo install -m 0755 -d /etc/apt/keyrings
  5. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  6. sudo chmod a+r /etc/apt/keyrings/docker.gpg
  7. # Add the repository to Apt sources:
  8. echo \
  9.   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  10.   $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  11.   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  12. sudo apt-get update
复制代码
  1. sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
复制代码
检验安装是否成功
  1. sudo docker run hello-world
复制代码
  给当前用户运行Docker的权限
  1. sudo usermod -aG docker $USER
复制代码
重启并再次运行Docker:
  1. sudo reboot
  2. docker run hello-world
复制代码
成功
二、docker CLI

帮助:远程:docs.docker.com;本地:docker --help
1.docker主机操作

(1) docker version


检察docker版本信息
  1. docker version
复制代码
(2) docker info


检察docker体系信息
  1. docker info
复制代码
(3) docker volume

Docker Volume 命令用于管理 Docker 中的卷,卷用于长期化存储数据,以便在容器之间共享和重用。
  1. docker volume create # 用于创建一个新的卷
  2. docker volume inspect [卷名] # 用于查看卷的详细信息。返回卷的详细属性,如创建时间、驱动程序、路径等。
  3. docker volume ls # 用于列出所有已创建的卷。可以查看卷的名称、驱动程序、挂载点等信息。
  4. docker volume rm [卷名] # 用于删除一个卷。需要指定要删除的卷的名称或 ID,删除后该卷的数据将被永久删除。
复制代码
2. 容器生命周期管理

(1)docker run

创建并运行一个容器,从一个映像开始


  • –name:为容器指定名称,在一个host上不能有同名容器
  • -it:以交互模式运行,并出现一个终端
  1. # docker run --name [容器名字] -i -t [ubuntu版本]
  2. docker run --name myUbuntu -i -t ubuntu:22.04
复制代码


  • -d:后台运行容器
  1. # docker run -d --name [容器名字] [ubuntu版本]
  2. docker run -d --name myUbuntu1 ubuntu:22.04
复制代码


  • -e:设置环境变量
  1. # docker run -e "ENV_VARIABLE=value" <image_name>
  2. docker run -e PATH=/home/syr/cloud/node-v18.18.2-linux-x64/bin:$PATH ubuntu:22.04
复制代码


  • -p:映射端口
  1. # docker run -p [宿主机端口]:[容器端口] <image_name>
  2. docker run -p 3000:4000 ubuntu:22.04
复制代码


  • -v:挂载卷,同步本地目录与容器目录内容
  1. # docker run -v [本地目录]:[容器目录] image
  2. docker run -v /home/syr2/containerROOT:/root -it ubuntu
  3. # 将containerROOT文件夹和这个新建容器的root目录中的文件同步
复制代码
  允许数据在容器之间共享和重用,即使容器被删除也可以保存数据。volume 可以看作是宿主机上的一个目录或文件,当容器内的目录与 volume 目录绑定后,对容器的修改会立即反映到 volume 中
容器挂载后volume目录的数据就是与主机数据相同,如果image或容器内目录中存在原有数据,那么原有数据会被清除
  (2)docker start/stop/restart

docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
  1. # docker start [容器名]
  2. # docker stop [容器名]
  3. # docker restart [容器名]
  4. docker start myUbuntu
  5. docker stop myUbuntu
  6. docker restart myUbuntu
复制代码
(3) docker kill



  • 竣事一个正在运行中的容器
  1. # docker kill  [容器名]
  2. docker kill myUbuntu
复制代码
(4) docker rm



  • 删除一个容器(不能是正在运行中的)
  1. # docker rm [容器名]
  2. docker rm myUbuntu
  3. #删除所有已经停止的容器(常用于实验结束后)
  4. docker rm $(docker ps -a
  5. -q)
复制代码


  • -f 强制删除一个容器
  1. # docker rm -f [容器名]
  2. docker rm -f myUbuntu
复制代码
(5) docker pause/unpause

docker pause :暂停容器中全部的进程
docker unpause :恢复容器中全部的进程
  1. # docker pause [容器名]
  2. # docker unpause [容器名]
  3. docker pause myUbuntu
  4. docker unpause myUbuntu
复制代码
(6)docker exec

docker exec命令可以在容器中打开新的终端,而且可以启动新的进程


  • -it
  1. # docker exec -it [容器名] /bin/bash
  2. # 进入一个正在运行的容器中
  3. docker exec -it myUbuntu /bin/bash
复制代码


  • 在正在运行的容器中执行echo命令
  1. # docker exec [容器名] [命令内容]
  2. # 在一个正在运行的容器中执行命令打印"Hello, World!"
  3. docker exec myUbuntu echo "Hello, World!"
复制代码


  • -d:在后台运行命令
  1. # docker exec -d [容器名] [命令内容]
  2. # 在后台运行一个正在运行的容器,并在这个容器中执行打印"Hello, World!"
  3. docker exec -d myUbuntu echo "Hello, World!"
复制代码


  • -w:在指定目录下运行命令
  1. # docker exec -w [目录名] [容器名] [命令内容]
  2. # 在一个正在运行的容器的/apps目录下执行创建一个文件夹的命令
  3. docker exec -w /apps myUbuntu mkdir nodeProject
复制代码


  • -u:以指定用户运行命令
  1. # docker exec -u [用户名] [容器名] [命令内容]
  2. # 在一个正在运行的容器中,以root用户执行查看文件夹内容的命令
  3. docker exec -u root myUbuntu ls
复制代码
利用exit退出容器的时候不会关闭容器(保举利用)
命令功能区别能否启动新进程能否打开新的终端exec可以在容器中直接启动新的进程可以在容器中打开新的终端attach直接进入容器启动命令的终端,不会启动新的进程主要用于检察启动命令的输入 3.容器操作

(1) docker ps



  • 表现当前正在运行中的容器
  • -a:表现全部容器
  1. docker ps -a
复制代码


  • -s:检察容器的磁盘大小
  1. docker ps -s
复制代码
输出详情先容:


  • CONTAINER ID: 容器 ID。
  • IMAGE: 利用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。
状态有7种:


  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(殒命)
    PORTS: 容器的端口信息和利用的毗连类型(tcp\udp)。
NAMES: 自动分配的容器名称。
(2) docker attach

docker attach命令用于毗连到正在运行中的容器。
  1. # docker attach [容器名]
  2. docker attach myUbuntu
复制代码
利用exit退出容器时会关闭容器(不发起利用)
(3) docker port

docker port 用于列出指定的容器的端口映射
  1. # docker port [容器名]
  2. docker port myUbuntu
复制代码
(4)docker stats


docker stats
: 表现容器资源的利用环境,包括:CPU、内存、网络 I/O 等


  • 输出运行中容器的利用环境
  • -a:输出全部容器的利用环境
  1. docker stats
复制代码
(5) docker inspect

docker inspect : 获取容器/镜像的元数据


  • +[id]
(6) docker system

查找用法


  • -df 检察磁盘


    • -v 检察详细信息

4.容器rootfs命令

(1) docker commit

docker commit :从容器创建一个新的镜像
  1. # docker commit [容器名] [镜像名[:TAG]]
  2. docker commit myUbuntu myWeb1:v1
复制代码
(2) docker cp

docker cp :用于容器与主机之间的数据拷贝
  1. # docker cp  [容器名]:容器内地址 主机地址
  2. # docker cp  主机地址 [容器名]:容器内地址
  3. docker cp myUbuntu:/app/nodejs /node
  4. docker cp /node myUbuntu:/app/nodejs
复制代码
5.镜像仓库

(1) docker pull

docker pull : 从镜像仓库中拉取或者更新指定镜像
  1. docker pull java
复制代码
(2)docker search

用docker search搜刮内容
  1. # docker search <search_query>
  2. docker search ubuntu
复制代码
想要image详细信息时利用网页版registry。
6.本地镜像管理

(1) docker images


docker images
: 列出本地镜像


  • 列出本地映像
  1. docker images
复制代码


  • -a:列出本地全部映像
  1. docker images
  2. -a
复制代码
(2) docker rmi

docker rmi : 删除本地一个或多个镜像
  1. # docker rmi [镜像名]
  2. docker rmi hello-world
复制代码
(3 )docker build

docker build 命令用于利用 Dockerfile 创建镜像
参数说明:


  • -f :指定要利用的Dockerfile路径
  • -t: 镜像的名字及标签
  1. # 使用当前目录的 Dockerfile 创建镜像,标签为image4:v1
  2. docker build -f Dockerfile -t  image4:v1 .
复制代码
(4) docker save

docker save : 将指定镜像保存成 tar 归档文件


  • -o:指定参数名
  1. # docker save -o [输出文件名] [映像名]
  2. docker save -o myweb.tar image4:v1
复制代码
(5) docker load

docker load : 导入利用 docker save 命令导出的镜像


  • -i: 指定导入的文件
  1. # docker load -i [输入文件名]
  2. docker load -i myweb.tar
复制代码
三、Dockerfile

1. 什么是 Dockerfile?

Dockerfile是一个包罗用于构建Docker映像的指令的文本文档。这些指令可以是任何可以在命令行中调用的命令。Docker通过读取Dockerfile中的指令自动生成映像。
Dockerfile的基本结构包括四个部分:底子镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。第一条指令必须是FROM,用于指定底子映像。
Dockerfile中的指令包括但不限于RUN、CMD、FROM、EXPOSE、ENV等。这些指令在Dockerfile中按照从上到下的顺序执行。以“#”字符开头的声明被视为解释。
利用docker build命令可以从Dockerfile构建映像,可以利用-f标志指定Dockerfile在文件体系中的位置。
2. dockerfile内容及其作用

指令说明FROM指定底子镜像,用于后续的指令构建。MAINTAINER指定Dockerfile的作者。(已弃用,利用LABEL指令)LABEL添加声明,无执行结果,用于指定Dockerfile的作者。RUN在构建过程中在镜像中执行命令。CMD指定容器创建时的默认命令。(可以被覆盖)ENTRYPOINT设置容器创建时的主要命令。(不可被覆盖)EXPOSE声明容器运行时监听的特定网络端口。ENV在容器内部设置环境变量。如果需要添加路径,在PATH下添加。对于自己的应用,需要添加路径到PATH下。ADD将文件、目录或远程URL复制到镜像中,将目录或文件的压缩包拷贝到image里,会同时解压缩。如果开发用户名和部署用户名相同,可以省略权限部分。COPY将文件或目录复制到镜像中。VOLUME为容器创建挂载点或声明卷。WORKDIR设置后续指令的工作目录,在执行程序前,需要跳转到相应目录。USER指定后续指令的用户上下文。SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。 3.dockerfile 示例1

  1. # 指定基础镜像为Ubuntu
  2. FROM ubuntu
  3. # 标签作者为syr
  4. LABEL Author=syr
  5. # 将本地路径下的node-v18.18.2-linux-x64文件复制到容器中的/root/node目录
  6. ADD node-v18.18.2-linux-x64 /root/node
  7. # 将本地路径下的hello-world.js文件复制到容器中的/root目录
  8. ADD hello-world.js /root
  9. # 在容器中执行命令,创建一个名为dataPath的目录
  10. RUN ["mkdir","/root/dataPath"]
  11. # 将本地路径下的data1文件复制到容器中的/root/dataPath目录
  12. ADD data1 /root/dataPath
  13. # 创建一个卷,将容器的/root/dataPath目录挂载到宿主机上
  14. VOLUME /root/dataPath
  15. # 设置环境变量PATH,将/root/node/bin添加到PATH变量的开头
  16. ENV PATH=/root/node/bin:$PATH
  17. # 设置工作目录为/root
  18. WORKDIR /root
  19. # 公开容器的3000端口
  20. EXPOSE 3000
  21. # 设置容器启动时要执行的命令,即运行hello-world.js文件
  22. CMD  ["node","hello-world.js"]
复制代码
四、Ubuntu 应用 1 及 docker 部署

1.程序文件

部署一个简朴的web应用,实现的功能为:对网站的访问人数进行计数
  1. const http = require('node:http')
  2. const fs=require('fs')
  3. const port = 3000
  4. var i = fs.readFileSync('dataPath/data1')
  5. const server = http.createServer((req, res) => {
  6.   res.statusCode = 200;
  7.   res.setHeader('Content-Type', 'text/plain');
  8.   i++
  9.   fs.writeFile('dataPath/data1',' '+i,(err)=>{if(err) throw err})
  10.   console.log('i+'+i)
  11.   res.end('Hello, World! you are' + i + 'th visitor.\n');
  12. });
  13. server.listen(port, () => {
  14.   console.log(`Server running at http://:${port}/`);
  15. });
复制代码
2.dockerfile文件

web应用1的dockerfile文件为dockerfile示例1
3.部署过程

(1) 数据以及挂载卷预备

编辑data1
生成volume:
  1. docker volume create webData1
复制代码
将data1复制过去:
  1. sudo cp data1 /var/lib/docker/volumes/webData1/_data
复制代码
(2) 容器生成

生成容器,挂载volume,端口号4000,名字myweb-data1:
  1. docker run -v webData1:/root/dataPath -p 4000:3000 --name myweb-data1 image4:v1
复制代码
(3) 结果展示


五、Ubuntu 应用 2(带 mongodb 数据库)及 docker 部署

1.MongoDB安装

MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序
(1)MongoDB版本选择

   项目:完成一个web应用,用node.js语言,数据库利用mongodb:4.2.7。
利用框架: node.js用express,mongodb用mongoose:5.13.21。
项目管理工具: npm。
进入 npmjs.com,检察版本依赖。先检察node.js express,express当前版本是4.18.2,要求node.js是0.10版本以上,我们当前node.js版本是18.18.2,以是express利用当前版本。
在假造机上nongodb必须用5.0版本以下的,由于当前的假造机版本都不支持AVX指令集。通过npmis.com检察,4.17.2版本下载量最大,以是利用此版本。
  (2)初始化项目结构

   通过创建文件夹创建目录结构
  1. mkdir web2
复制代码
  项目npm初始化:进入项目文件夹,先创建入口文件,再执行初始化
  1. touch webApp.js
  2. npm init --save
复制代码
  安装express
安装mongodb的driver
安装mongoose
  1. npm install express
  2. npm install mongodb@4.17.2
  3. npm install mongoose@5.13.21
复制代码


  • 安装问题:国外下载源速度慢卡死,国内下载源更换网址导致无法下载
  • 解决办法:执行以下命令,更换最新的下载源(网络上绝大部分教程的下载源都是过时的)
  1. npm config set registry https://registry.npmmirror.com/
  2. npm config set ELECTRON_MIRROR https://npmmirror.com/mirrors/electron/
复制代码
2.web服务器搭建

(1)入口页面index.html

  1. <head>
  2.         <meta charset="UTF-8">
  3.         <meta name="viewport" content="width=device-width, initial-scale=1">
  4.         <title>Document</title>
  5. </head>
  6. <body>
  7.         <p>
  8.                 <form action="/form1" method="get">
  9.                         Name:<input type="text" value="Name" name="name"><br>
  10.                         Password:<input type="text" value="Password" name="password"><br>
  11.                         <input type="submit" value="Submit" >
  12.                 </form>
  13.         </p>
  14. </body>
  15. </html>
复制代码
页面结果

(2)路由程序

webApp.js
  1. const express = require('express')
  2. const app = express()
  3. app.get('/', function (req, res) {
  4.   res.sendFile(__dirname + '/index.html')
  5. })
  6. app.get('/form1', function (req, res) {
  7.   res.send('Received data:{name:'+req.query.name+',password:'+req.query.password+' }')
  8.   console.log(req.query.name)
  9.   console.log(req.query.password)
  10.   //res.sendFile(__dirname + '/index.html')
  11. })
  12. app.listen(3000)
复制代码


  • 测试1:程序能否运行

  • 测试2:是否能收到数据

  • 测试3:详细数据收集

3.mongodb数据库

(1)docker启动

直接利用mongodb的docker容器,版本4.2.7
  1. docker pull mongo:4.2.7
复制代码


  • 原有下载源下载速度过慢
    解决办法:将镜像修改成国内镜像
   在/etc/docker/daemon.json 文件中添加以下参数(没有该文件则新建):
{“registry-mirrors”: [“https://9cpn8tt6.mirror.aliyuncs.com”]}
服务重启
  1. systemctl daemon-reload
  2. systemctl restart docker
复制代码
创建mongodb数据文件夹/data/db
创建数据库数据文件volume:mongo-data:
  1. docker volume create mongo-data
复制代码
创建容器
  1. docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
复制代码
(2)UI界面下的mongodb访问

利用vscode,安装拓展

点击connect,在地址栏输入毗连字符串
  1. # mongodb://IP地址:端口号
  2. mongodb://192.168.146.129:27017
复制代码

试运行通过

(3)mongoose下操作

  1. const mongoose = require('mongoose');
  2. mongoose.connect('mongodb://192.168.146.129/syr0117');
  3. const logNamePassword = mongoose.model('logNamePassword', { name: String,password: String });
  4. const person = new logNamePassword({ name: 'Zildjian', password: '123' });
  5. person.save().then(() => console.log('is saved'));
复制代码


  • 测试1:能否运行

  • 测试2:数据导入


4.最后文件



  • webApp.js
  1. const express = require('express')
  2. const app = express()
  3. const mongoose = require('mongoose');
  4. mongoose.connect('mongodb://192.168.146.129/syr0117');
  5. const logNamePassword = mongoose.model('namePassword', { name: String,password: String });
  6. app.get('/', function (req, res) {
  7.   res.sendFile(__dirname + '/index.html')
  8. })
  9. app.get('/form1', function (req, res) {
  10.   res.send('Received data:{name:'+req.query.name+',password:'+req.query.password+' }')
  11.   console.log(req.query.name)
  12.   console.log(req.query.password)
  13.   const person = new logNamePassword({ name: req.query.name, password: req.query.password });
  14.   person.save()
  15.   //res.sendFile(__dirname + '/index.html')
  16. })
  17. app.listen(3000)
复制代码


  • web页面输入

  • 数据库担当数据

5.容器化

当前有两部分内容:mongodb数据库和webApp
构建dockerfile,生成image
web2应用的dockerfile如下:
  1. FROM ubuntu
  2. LABEL Author=syr
  3. COPY web2 /root/web2
  4. ENV PATH=/root/web2/node-v18.18.2-linux-x64/bin:$PATH
  5. WORKDIR /root/web2
  6. CMD ["node","webApp.js"]
  7. EXPOSE 3000
复制代码
利用dockerfile生成image
  1. docker build -f /home/syr2/dockerfile3 -t image2:v4 .
复制代码
完整在容器内启动web应用2的流程


  • 1.启动mongo容器
  1. docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
复制代码


  • 2.启动web2容器
  1. docker run -p 3000:3000 image2:v4
复制代码


  • 3.结果
    输入端
数据库担当到数据
t/web2/node-v18.18.2-linux-x64/binPATH
WORKDIR /root/web2
CMD [“node”,“webApp.js”]
EXPOSE 3000
  1. 使用dockerfile生成image
  2. ```shell
  3. docker build -f /home/syr2/dockerfile3 -t image2:v4 .
复制代码
完整在容器内启动web应用2的流程


  • 1.启动mongo容器
  1. docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
复制代码


  • 2.启动web2容器
  1. docker run -p 3000:3000 image2:v4
复制代码




  • 3.结果
    输入端

数据库接收到数据


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表