微服务05-Docker基本操作

Docker的定义

1.什么是Docker

Docker是一个快速交付应用、运行应用的技术:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

2.为什么要用Docker

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。

Docker·为了解决依赖的兼容问题的,采用了两个手段:

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包

  • 将每个应用放到一个隔离容器去运行,避免互相干扰


这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker的基本操作

1 Docker命令

常见的镜像操作命令如图:

举例:

需求:从DockerHub中拉取一个nginx镜像并查看

1)首先去镜像仓库搜索nginx镜像,比如DockerHub:

2)根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx

3)通过命令:docker images 查看拉取到的镜像

保存、导入镜像

命令格式:

shell 复制代码
docker save -o [保存的目标文件名称] [镜像名称]

1)使用docker save导出镜像到磁盘

运行命令:

sh 复制代码
docker save -o nginx.tar nginx:latest

结果如图:

2)使用docker load加载镜像

先删除本地的nginx镜像:

sh 复制代码
docker rmi nginx:latest

然后运行命令,加载本地文件:

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

结果:

2 容器相关命令

容器操作的命令如图:

容器保护三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等资源

其中:

  • docker run:创建并运行一个容器,处于运行状态

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

举例

创建并运行nginx容器的命令:

sh 复制代码
docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器
  • --name : 给容器起一个名字,比如叫做mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

这里的-p参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

我们可以通过docker logs 容器名字 来查看日志

  1. 先利用镜像产生容器,然后再对容器进行命令执行模式

exit退出容器

docker stop 容器名称:停掉容器名称,直接死掉

docker ps:默认查看运行中的容器

docker ps -a:查看所有容器

docker start 容器名字:开始容器,停掉的容器再开始

总结:

docker exec -it 容器名字 命令:是进入容器后修改文件,因为容器是隔离性的,所以我们不能使用vi命令,非常不方便修改,而且修改时没有日志记录的;

数据卷

出现问题:多个容器修改困难

解决方案:

我们可以利用数据卷(是一个虚拟目录),将容器挂载到数据卷上,而数据卷映射文件系统:

所以我们改动主机的文件系统,那么容器就会改变:因为容器挂载到了数据卷上->映射在主机文件系统上;

主机文件系统位置:在创建数据卷的时候就自动设置了(数据卷相当于代理帮你自动设置位置),实际上跟你你设置的数据卷名字有关;

容器挂载数据卷位置:通过创建容器的-v参数设置



容器删除,数据卷不会被删,这样有利于数据的保存与维护(直接改变数据卷,也就是可以通过主机修改数据------>容器升级),较为安全;

操作数据卷常见命令

作用:

将容器与数据分离,降低耦合,方便操作容器内的数据(->通过主机进行操作),方便数据维护升级------>容器删除,数据卷依然在;

注意:

docker volume prune相当于强制删除卷(未使用)

docker volume rm xx:指定删除

练习数据卷操作:

挂载数据卷

如果此时我将数据卷删除的话,创建容器直接设置数据卷挂载位置,docker非常智能会自动创建没有的数据卷

练习:创建并且运行mysql容器,将宿主机目录挂载到容器(目录挂载)

步骤:

通过mysql镜像启动mysql容器,设置主机挂载目录的位置以及容器挂载的位置(一一对应的感觉,没有代理帮你管理,自己设置两边的位置)

powershell 复制代码
docker run --name mysql -p 3308:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25

目录挂载与数据卷挂载的区别

相关推荐
猿java10 分钟前
Elasticsearch有哪几种分页方式?该如何选择?
后端·elasticsearch·架构
K神2 小时前
Spring Cloud Gateway+Redis+Nacos之动态路由和负载均衡
后端·微服务
数据智能老司机2 小时前
探索Java 全新的线程模型——结构化并发
java·性能优化·架构
数据智能老司机2 小时前
探索Java 全新的线程模型——作用域值
java·性能优化·架构
数据智能老司机2 小时前
探索Java 全新的线程模型——并发模式
java·性能优化·架构
数据智能老司机2 小时前
探索Java 全新的线程模型——虚拟线程
java·性能优化·架构
小马哥编程3 小时前
【软考架构】云计算相关概念
架构·云计算·软件工程·安全架构
架构精进之路3 小时前
多智能体系统不是银弹
后端·架构·aigc
mit6.8243 小时前
[身份验证脚手架] 应用布局如何构建
架构·php·后端框架
CHEN5_024 小时前
时序数据库选型“下半场”:从性能竞赛到生态博弈,四大主流架构深度横评
数据库·人工智能·ai·架构·时序数据库