赞
踩
进入官网下载,只安装Docker Engine 选择Apt安装Docker
复制以下内容到putty
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
检验安装是否成功
sudo docker run hello-world
给当前用户运行Docker的权限
sudo usermod -aG docker $USER
重启并再次运行Docker:
sudo reboot
docker run hello-world
成功
帮助:远程:docs.docker.com;本地:docker --help
docker version
查看docker系统信息
docker info
Docker Volume 命令用于管理 Docker 中的卷,卷用于持久化存储数据,以便在容器之间共享和重用。
docker volume create # 用于创建一个新的卷
docker volume inspect [卷名] # 用于查看卷的详细信息。返回卷的详细属性,如创建时间、驱动程序、路径等。
docker volume ls # 用于列出所有已创建的卷。可以查看卷的名称、驱动程序、挂载点等信息。
docker volume rm [卷名] # 用于删除一个卷。需要指定要删除的卷的名称或 ID,删除后该卷的数据将被永久删除。
创建并运行一个容器,从一个映像开始
# docker run --name [容器名字] -i -t [ubuntu版本]
docker run --name myUbuntu -i -t ubuntu:22.04
# docker run -d --name [容器名字] [ubuntu版本]
docker run -d --name myUbuntu1 ubuntu:22.04
# docker run -e "ENV_VARIABLE=value" <image_name>
docker run -e PATH=/home/syr/cloud/node-v18.18.2-linux-x64/bin:$PATH ubuntu:22.04
# docker run -p [宿主机端口]:[容器端口] <image_name>
docker run -p 3000:4000 ubuntu:22.04
# docker run -v [本地目录]:[容器目录] image
docker run -v /home/syr2/containerROOT:/root -it ubuntu
# 将containerROOT文件夹和这个新建容器的root目录中的文件同步
允许数据在容器之间共享和重用,即使容器被删除也可以保留数据。volume 可以看作是宿主机上的一个目录或文件,当容器内的目录与 volume 目录绑定后,对容器的修改会立即反映到 volume 中
容器挂载后volume目录的数据就是与主机数据相同,如果image或容器内目录中存在原有数据,那么原有数据会被清除
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
# docker start [容器名]
# docker stop [容器名]
# docker restart [容器名]
docker start myUbuntu
docker stop myUbuntu
docker restart myUbuntu
# docker kill [容器名]
docker kill myUbuntu
# docker rm [容器名]
docker rm myUbuntu
#删除所有已经停止的容器(常用于实验结束后)
docker rm $(docker ps -a -q)
# docker rm -f [容器名]
docker rm -f myUbuntu
docker pause :暂停容器中所有的进程
docker unpause :恢复容器中所有的进程
# docker pause [容器名]
# docker unpause [容器名]
docker pause myUbuntu
docker unpause myUbuntu
docker exec命令可以在容器中打开新的终端,并且可以启动新的进程
# docker exec -it [容器名] /bin/bash
# 进入一个正在运行的容器中
docker exec -it myUbuntu /bin/bash
# docker exec [容器名] [命令内容]
# 在一个正在运行的容器中执行命令打印"Hello, World!"
docker exec myUbuntu echo "Hello, World!"
# docker exec -d [容器名] [命令内容]
# 在后台运行一个正在运行的容器,并在这个容器中执行打印"Hello, World!"
docker exec -d myUbuntu echo "Hello, World!"
# docker exec -w [目录名] [容器名] [命令内容]
# 在一个正在运行的容器的/apps目录下执行创建一个文件夹的命令
docker exec -w /apps myUbuntu mkdir nodeProject
# docker exec -u [用户名] [容器名] [命令内容]
# 在一个正在运行的容器中,以root用户执行查看文件夹内容的命令
docker exec -u root myUbuntu ls
使用exit退出容器的时候不会关闭容器(推荐使用)
| 命令功能区别 | 能否启动新进程 | 能否打开新的终端 |
|---|---|---|
| exec | 可以在容器中直接启动新的进程 | 可以在容器中打开新的终端 |
| attach | 直接进入容器启动命令的终端,不会启动新的进程 | 主要用于查看启动命令的输入 |
docker ps -a
docker ps -s
输出详情介绍:
状态有7种:
NAMES: 自动分配的容器名称。
docker attach命令用于连接到正在运行中的容器。
# docker attach [容器名]
docker attach myUbuntu
使用exit退出容器时会关闭容器(不建议使用)
docker port 用于列出指定的容器的端口映射
# docker port [容器名]
docker port myUbuntu
docker stats : 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等
docker stats
docker inspect : 获取容器/镜像的元数据
查找用法
-df 查看磁盘
docker commit :从容器创建一个新的镜像
# docker commit [容器名] [镜像名[:TAG]]
docker commit myUbuntu myWeb1:v1
docker cp :用于容器与主机之间的数据拷贝
# docker cp [容器名]:容器内地址 主机地址
# docker cp 主机地址 [容器名]:容器内地址
docker cp myUbuntu:/app/nodejs /node
docker cp /node myUbuntu:/app/nodejs
docker pull : 从镜像仓库中拉取或者更新指定镜像
docker pull java
用docker search搜索内容
# docker search <search_query>
docker search ubuntu
想要image详细信息时使用网页版registry。
docker images : 列出本地镜像
docker images
docker images -a
docker rmi : 删除本地一个或多个镜像
# docker rmi [镜像名]
docker rmi hello-world
docker build 命令用于使用 Dockerfile 创建镜像
参数说明:
# 使用当前目录的 Dockerfile 创建镜像,标签为image4:v1
docker build -f Dockerfile -t image4:v1 .
docker save : 将指定镜像保存成 tar 归档文件
# docker save -o [输出文件名] [映像名]
docker save -o myweb.tar image4:v1
docker load : 导入使用 docker save 命令导出的镜像
# docker load -i [输入文件名]
docker load -i myweb.tar
Dockerfile是一个包含用于构建Docker映像的指令的文本文档。这些指令可以是任何可以在命令行中调用的命令。Docker通过读取Dockerfile中的指令自动生成映像。
Dockerfile的基本结构包括四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。第一条指令必须是FROM,用于指定基础映像。
Dockerfile中的指令包括但不限于RUN、CMD、FROM、EXPOSE、ENV等。这些指令在Dockerfile中按照从上到下的顺序执行。以“#”字符开头的声明被视为注释。
使用docker build命令可以从Dockerfile构建映像,可以使用-f标志指定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指令。 |
# 指定基础镜像为Ubuntu FROM ubuntu # 标签作者为syr LABEL Author=syr # 将本地路径下的node-v18.18.2-linux-x64文件复制到容器中的/root/node目录 ADD node-v18.18.2-linux-x64 /root/node # 将本地路径下的hello-world.js文件复制到容器中的/root目录 ADD hello-world.js /root # 在容器中执行命令,创建一个名为dataPath的目录 RUN ["mkdir","/root/dataPath"] # 将本地路径下的data1文件复制到容器中的/root/dataPath目录 ADD data1 /root/dataPath # 创建一个卷,将容器的/root/dataPath目录挂载到宿主机上 VOLUME /root/dataPath # 设置环境变量PATH,将/root/node/bin添加到PATH变量的开头 ENV PATH=/root/node/bin:$PATH # 设置工作目录为/root WORKDIR /root # 公开容器的3000端口 EXPOSE 3000 # 设置容器启动时要执行的命令,即运行hello-world.js文件 CMD ["node","hello-world.js"]
部署一个简单的web应用,实现的功能为:对网站的访问人数进行计数
const http = require('node:http')
const fs=require('fs')
const port = 3000
var i = fs.readFileSync('dataPath/data1')
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
i++
fs.writeFile('dataPath/data1',' '+i,(err)=>{if(err) throw err})
console.log('i+'+i)
res.end('Hello, World! you are' + i + 'th visitor.\n');
});
server.listen(port, () => {
console.log(`Server running at http://:${port}/`);
});
web应用1的dockerfile文件为dockerfile示例1
编辑data1
生成volume:
docker volume create webData1
将data1复制过去:
sudo cp data1 /var/lib/docker/volumes/webData1/_data
生成容器,挂载volume,端口号4000,名字myweb-data1:
docker run -v webData1:/root/dataPath -p 4000:3000 --name myweb-data1 image4:v1

MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序
项目:完成一个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版本下载量最大,所以使用此版本。
通过创建文件夹创建目录结构
mkdir web2
项目npm初始化:进入项目文件夹,先创建入口文件,再执行初始化
touch webApp.js
npm init --save
安装express
安装mongodb的driver
安装mongoose
npm install express
npm install mongodb@4.17.2
npm install mongoose@5.13.21
npm config set registry https://registry.npmmirror.com/
npm config set ELECTRON_MIRROR https://npmmirror.com/mirrors/electron/
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Document</title>
</head>
<body>
<p>
<form action="/form1" method="get">
Name:<input type="text" value="Name" name="name"><br>
Password:<input type="text" value="Password" name="password"><br>
<input type="submit" value="Submit" >
</form>
</p>
</body>
</html>
页面效果

webApp.js
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html')
})
app.get('/form1', function (req, res) {
res.send('Received data:{name:'+req.query.name+',password:'+req.query.password+' }')
console.log(req.query.name)
console.log(req.query.password)
//res.sendFile(__dirname + '/index.html')
})
app.listen(3000)
测试1:程序能否运行

测试2:是否能收到数据

测试3:具体数据收集

直接使用mongodb的docker容器,版本4.2.7
docker pull mongo:4.2.7
在/etc/docker/daemon.json 文件中添加以下参数(没有该文件则新建):
{“registry-mirrors”: [“https://9cpn8tt6.mirror.aliyuncs.com”]}
服务重启
systemctl daemon-reload
systemctl restart docker
创建mongodb数据文件夹/data/db
创建数据库数据文件volume:mongo-data:
docker volume create mongo-data
创建容器
docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
使用vscode,安装拓展

点击connect,在地址栏输入连接字符串
# mongodb://IP地址:端口号
mongodb://192.168.146.129:27017

试运行通过

const mongoose = require('mongoose');
mongoose.connect('mongodb://192.168.146.129/syr0117');
const logNamePassword = mongoose.model('logNamePassword', { name: String,password: String });
const person = new logNamePassword({ name: 'Zildjian', password: '123' });
person.save().then(() => console.log('is saved'));
测试1:能否运行

测试2:数据导入


const express = require('express') const app = express() const mongoose = require('mongoose'); mongoose.connect('mongodb://192.168.146.129/syr0117'); const logNamePassword = mongoose.model('namePassword', { name: String,password: String }); app.get('/', function (req, res) { res.sendFile(__dirname + '/index.html') }) app.get('/form1', function (req, res) { res.send('Received data:{name:'+req.query.name+',password:'+req.query.password+' }') console.log(req.query.name) console.log(req.query.password) const person = new logNamePassword({ name: req.query.name, password: req.query.password }); person.save() //res.sendFile(__dirname + '/index.html') }) app.listen(3000)
web页面输入

数据库接受数据

当前有两部分内容:mongodb数据库和webApp
构建dockerfile,生成image
web2应用的dockerfile如下:
FROM ubuntu
LABEL Author=syr
COPY web2 /root/web2
ENV PATH=/root/web2/node-v18.18.2-linux-x64/bin:$PATH
WORKDIR /root/web2
CMD ["node","webApp.js"]
EXPOSE 3000
使用dockerfile生成image
docker build -f /home/syr2/dockerfile3 -t image2:v4 .
完整在容器内启动web应用2的流程
docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
docker run -p 3000:3000 image2:v4
数据库接受到数据
t/web2/node-v18.18.2-linux-x64/bin:$PATH
WORKDIR /root/web2
CMD [“node”,“webApp.js”]
EXPOSE 3000
使用dockerfile生成image
```shell
docker build -f /home/syr2/dockerfile3 -t image2:v4 .
完整在容器内启动web应用2的流程
docker run -p 27017:27017 -v mongo-data:/data/db --name mymongo mongo:4.2.7
docker run -p 3000:3000 image2:v4



数据库接收到数据

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。