SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

目录

一:Docker基本操作

[1. 镜像操作](#1. 镜像操作)

镜像相关命令

[2. 容器操作](#2. 容器操作)

容器相关命令

[3. 数据卷(容器数据管理)](#3. 数据卷(容器数据管理))

数据卷

操作数据卷

挂载数据卷

挂载的方式区别


前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,感兴趣的同学可以进行学习人工智能学习

一:Docker基本操作

1. 镜像操作

镜像相关命令

镜像的命名规范

镜像名称一般分两部分组成:[repository]:[tag]; 在没有指定tag时,默认是latest,代表最新版本的镜像。

镜像操作命令:CRUD

①获取镜像的方式有两种:

第一种是从本地获取,需要一个Dockerfile文件,利用docker build 命令把它构件成一个镜像。

第二种是从镜像服务器拉取,使用docker pull 进行拉取镜像,可以从私服拉,也可以从DockerHub拉取。

②想知道本地有哪些镜像,使用docker images 命令查看镜像。这里image理解为镜像的意思。

③使用docker rmi命令删除镜像,rmi是remove image的缩写。

④分享镜像的两种方式:

第一种是把镜像推送到镜像服务器,使用docker push命令推送到Docker Register。

第二种是使用docker save 命令保存镜像为一个压缩包进行拷贝;然后在使用docker load命令解压加载镜像压缩包为镜像。

⑤也可以使用docker --help命令查看帮助文档。

案例1:从DockerHub中【拉取】一个nginx镜像并【查看】

第一步:去镜像仓库搜索nginx镜像,比如DockerHub

第二步:根据查看到的镜像名称,拉取自己需要的镜像

通过命令docker pull nginx拉取,没指定版本号就是最新版本

第三步:通过命令docker images 查看拉取到的镜像

案例2:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

步骤一:利用docker 命令 --help命令查看docker save和docker load的语法

docker save --help查看命令,o压缩包的名称

docker load --help查看命令,i参数会打印日志,q参数不会打印日志

步骤二:使用docker save导出镜像到磁盘

bash 复制代码
docker save -o nginx.tar nginx:lastest

步骤三:使用docker load加载镜像

首先先删除原来的镜像,可以根据 镜像名称+版本号 或者 镜像id 进行删除

bash 复制代码
docker rmi -f  镜像名称:版本号 # -f参数表示删除正在运行的镜像

加载压缩包为镜像

bash 复制代码
docker load -i nginx.tar

2. 容器操作

学习完了镜像,接下来就学习一下怎么基于镜像(image)创建容器(container),完成容器的各种操作!

容器相关命令

①创建容器比较常用的命令就是docker run,不仅仅可以创建容器,还可以让容器处于运行状态---三大状态之一。

②三大状态之二就是暂停状态,使用docker pause命令,让容器处于暂停状态。要想恢复到运行状态,使用docker unpause命令。

③三大状态之二就是停止状态,使用docker stop命令,从停止恢复运行使用docker start命令。

**Tip:**暂停和停止的区别,为什么暂停可以使用pause和unpause;而stop确不使用unstop?

暂停和停止的区别在于操作系统的处理方式不同

**暂停:**操作系统会将容器的进程挂起,内存暂存起来;一恢复就可以直接运行。

**停止:**操作系统直接把进程杀死,容器所占为内存回收;进程被杀死只能重新创建一个新的容器。

④使用docker ps命令可以查看当前所有运行的容器及状态。docker logs命令查看容器运行日志。docker exec命令可以进入容器的内部。

⑤使用docker rm 可以删除指定容器。

案例1:创建运行一个Nginx容器

Docker Hub查看Nginx的容器运行命令,以下命令为例:

bash 复制代码
docker run --name some-nginx -d -p 8080:80 some-content-nginx

*docker run :创建并运行一个容器;

*--name:给容器起一个名字;

*-p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口(可以随意改变),右侧是容器端口;作用是让本来完全隔离的容器暴露一个窗口,让外界进行访问;

*-d:后台运行容器

*some-content-nginx:镜像名称,例如nginx

解释:端口映射

对于一个容器是对外隔离的,如果用户想要访问容器,直接访问肯定是不行的;这样就需要端口映射,让宿主机的端口与容器的端口产生映射关系;以后直接访问宿主机的80端口就会转发到容器的80端口去处理请求。

创建并运行容器

查看容器的状态:docker ps

访问nginx

bash 复制代码
# 前面是虚拟机的IP,后面是我们指定的端口
192.168.2.129:81

查看容器的日志信息

bash 复制代码
docker logs -f 容器名称 # -f 表示持续更新查看日志

案例2:进入Nginx容器,修改HTML文件内容,添加"北京欢迎您"

进入我们刚刚创建的nginx容器

bash 复制代码
docker exec -it mn bash # bash表示使用linux命令操作

*docker exec :进入容器内部,执行一个命令;

*-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互 ;

*mn :要进入的容器的名称 ;

*bash:进入容器后执行的命令,bash是一个linux终端交互命令;

进入容器内部

查看nginx在那个目录,就需要查看DockerHub,静态页面的文件夹/usr/share/nginx/html

bash 复制代码
cd /usr/share/nginx/html

找到index.html

镜像只是封装必要的函数库,对于vim命令没有封装不能使用,使用sed命令进行修改

bash 复制代码
sed -i 's#Welcome to nginx#北京欢迎您#g' index.html # 替换原始的标签
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html #支持中文

再次去访问:成功替换

使用exit退出容器,然后停掉容器

bash 复制代码
docker stop 容器名称

此时查看容器的状态

bash 复制代码
docker ps -a # 默认是只能查看正在运行的容器,-a表示查看所有(包括停掉的)

要想在启动,使用

bash 复制代码
docker start 容器名称

此时在删除容器

对于-f参数表示强制删除正在运行的容器;如果直接删除正在运行的容器会报错无法删除,需要我们stop停止容器才可以删除比较麻烦;所以可以使用-f参数强制删除!删除以后使用docker ps -a也无法查到,是真正意义的上被删除了。

bash 复制代码
docker rm -f 容器名称

案例3:创建并运行一个redis容器,并且支持数据持久化,进入redis容器,并执行redis-cli客户端命令,存入num=666

创建并运行容器

bash 复制代码
docker run --name mr -p 6379:6379 -d redis --appendonly yes #aof模式的持久化

进入容器内部并连接redis

存入数据

查看容器状态:

docker ps 添加 -a 参数查看所有状态的容器;

删除容器:

docker rm 不能删除运行中的容器,除非添加 -f 参数;

进入容器:

命令是docker exec -it [容器名] [要执行的命令] ;exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的:第一点不方便,连vim命令都没有,第二点:在容器中进行修改是没有任何记录的。

3. 数据卷(容器数据管理)

容器与数据耦合的问题

**不便于修改:**当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。

**数据不可复用:**在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的。

**升级维护困难:**数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。

数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

例如:对于一个Docker主机管理很多的数据卷,而对应的数据卷一定会指向宿主机的/var/lib/docker/volumes目录创建。然后让容器的内部目录与数据卷进行关联,关联以后本质上就是与宿主机的目录进行关联!

注:相当于通过数据卷进行容器和宿主机的文件建立了联系!就不要进入容器内部修改了!

数据卷的作用: 将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全!

操作数据卷

数据卷操作的基本语法如下:

bash 复制代码
docker volume [COMMAND] # 二级命令,后面才是真正的操作数据卷的命令

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

*create:创建一个volume

*inspect:显示一个或多个volume的详细信息

*ls:列出所有的volume

*prune:删除未使用的所有的volume

*rm:删除一个或多个指定的volume

案例1:创建一个数据卷,并查看数据卷在宿主机的目录位置

创建一个数据卷

bash 复制代码
docker volume create 数据卷名称 # 创建一个数据卷

查看数据卷

bash 复制代码
docker volume ls # 列出所有的数据卷
docker volume inspect 数据卷名称 # 查看某个数据卷的详细信息

删除数据卷

bash 复制代码
docker volume prune # 删除所有未使用的数据卷
docker volume rm 数据卷名称 # 删除某个指定的数据卷

挂载数据卷

前面的操作相当于让数据卷宿主机的某个文件建立了联系;下面就需要容器挂载数据卷,让数据卷容器建立联系!

首先创建好数据卷,在运行容器时,可以通过**-v**参数来挂载一个数据卷到某个容器目录

html 复制代码
docker run --name mn -p 88:80 -v html:/root/html -d nginx

*docker run :就是创建并运行容器

*-- name mn :给容器起个名字叫mn

*-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中

*-p 8080:80 :把宿主机的88端口映射到容器内的80端口

*nginx :镜像名称

案例1:创建一个nginx容器,修改容器内的html目录内的index.html内容

这个案例前面已经做过了,先进入nginx容器内部,然后进入到/usr/share/nginx/html目录,然后使用sed命令修改index.html比较麻烦!现在就使用数据卷volume来实现这个功能。

步骤一:创建容器并挂载数据卷到容器内的html目录

注:直接使用-v参数,如果此时html数据卷没有创建,docker会帮我们创建好!

bash 复制代码
docker run --name mn -p 88:80 -v html:/usr/share/nginx/html -d nginx

步骤二:进入html数据卷所在的位置,并修改html内容

bash 复制代码
docker volume inspect html # 查看数据卷所在的位置
cd //var/lib/docker/volumes/html/_data # 进入数据卷所在的目录
ls # 查看目录下的文件,nginx文件会被同步过来
vim index.html # 可以使用vim命令进行修改

数据卷挂载方式: -v 数据卷名称: /容器的目标目录, 如果容器运行时volume不存在,会自动被创建出来!所以以后就没有必要刻意的去创建数据卷!

案例二:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

注: 实际上不通过数据卷 这个媒介,宿主机目录 可以直接与容器 的目录进行挂载

提示:目录挂载与数据卷挂载的语法是类似的:

第一种方式: -v [宿主机目录]:[容器内目录] ;与数据卷挂载的结构是相同的。

第二种方式: -v [宿主机文件]:[容器内文件];数据卷挂载方式所没有的,会用宿主机文件覆盖容器内的文件。

第一步:从DockerHub拉取myql的镜像

bash 复制代码
docker pull mysql

也可以加载已经下载好的压缩包,把压缩包上传到一个目录,例如tmp目录,然后执行load命令

bash 复制代码
docker load -i mysql.tar # 把压缩包加载为镜像

第二步:创建两个目录

bash 复制代码
mkdir -p /tmp/mysql/data # 创建mysql存储数据的目录,-p表示递归创建
mkdir -p /tmp/mysql/conf # 创建mysql配置目录,并把mysql的配置文件传进去

第三步:运行mysql容器

bash 复制代码
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \ # 设置密码
 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 挂载配置文件
 -v /tmp/mysql/data:/var/lib/mysql \ #挂载数据目录
 -d  mysql:5.7.25 

挂载的方式区别

**数据卷挂载的方式:**Docker全自动创建数据卷对应的目录;耦合度低,由Docker来管理目录,但是目录较深,不好找。

**目录挂载的方式:**目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看。

相关推荐
带刺的坐椅4 分钟前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
IT_Octopus2 小时前
triton backend 模式docker 部署 pytorch gpu模型 镜像选择
pytorch·docker·triton·模型推理
壹佰大多4 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
wudl55664 小时前
Docker 常用命令
docker·容器·eureka
DokiDoki之父4 小时前
Spring—注解开发
java·后端·spring
选与握5 小时前
ubuntu22 docker安装ros1 noetic
docker·ros1
wuyunhang1234565 小时前
Docker----快速入门
docker·容器·架构
catoop6 小时前
Sprintf Boot 之 Nacos 配置中心实践(spring.config.import=optional:nacos:)
spring·springboot
liliangcsdn6 小时前
docker环境如何基于python操作mysql关系数据库
docker·容器
keke_俩个科7 小时前
ShardingSphere分库分表基础配置与使用说明
java·数据库·分布式·spring