Docker 使用教程
Docker 的简介和安装
Docker 是一个应用打包、分发、部署的工具。你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。
Docker 为什么比虚拟机快?
- Docker 有着比虚拟机更少的抽象层
- Docker 利用的是宿主机的内核,而 vm 需要 Guest OS,所以新建一个容器的时候,docker 不需要像虚拟机一样重新加载一个操作系统内核,避免引导。
- 打包:就是把软件所需的依赖、第三方库、软件打包到一起,变成一个安装包
- 分发:你可以把打包好的安装包上传到一个镜像仓库,其他人可以非常方便的获取和安装
- 部署:拿着安装包就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在
Docker 部署的优势?
-
常规应用开发部署方式:自己在 windows 上开发、测试 ( o) 到 Linux 服务器配置运行环境部署
-
Docker 开发部署流程:自己在 windows 上开发 ( o) 打包为 Docker 镜像(可以理解为软件安装包)( o) 各种服务器上只需要一个命令部署好,确保了不同机器上跑都是一致的运行环境,例如易文档、 的私有化部署就是用 Docker,轻松应对客户的各种服务器
Docker 通常用来做什么?
- 应用分发、部署,方便传播给他人安装,特别是开源软件和提供私有部署的应用
- 快速安装测试 / 学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上
- 多个版本共存,不污染系统
- Windows 上体验各种 Linux 系统
理解两个重要概念:
- 镜像 (image):可以理解为软件安装包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件。一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器
- 容器 (container)):软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器,最终服务运行或者项目运行就是在容器中
- 仓库 (repository):存放镜像的地方,分为公有仓库和私有仓库
安装链接:
-
桌面版:https://www.docker.com/products/docker-desktop
- 直接按步骤操作
- 设置 ( o) Docker Engine,添加镜像
- 修改默认镜像文件位置(为了避免 C 盘容量告急)
- 找到 下的 文件,复制到目标路径
- 删除上述原 文件夹
- 打开 cmd,运行:
-
服务器版:https://docs.docker.com/engine/install/#server
- 使用 连接远程服务器
- 查看 Linux 发行版名称和版本号:
- 查询安装文档,卸载旧版本,然后通过 repository 安装
- 运行 hello-world
- 查看一下下载的 hello-world 镜像
- 卸载 Docker Engine:如果需要卸载再卸载
-
阿里云镜像加速
- 登录阿里云网站 ( o) 产品 ( o) 容器镜像服务
- 获取镜像加速地址:https://6jotehk6.mirror.aliyuncs.com
- 配置镜像加速器
Docker 的底层原理:
- 是一个 结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问。
- 接收到 的指令,就会执行这个命令
Docker 的常用命令
帮助命令
帮助文档
镜像命令
- :查看本地主机上的所有镜像
- :搜索镜像
- :下载镜像
- :删除镜像,一般通过 id 来删除
- :批量删除
- :查看镜像的构建过程
容器命令
说明:我们有了镜像才可以创建容器。
-
下载一个 centos 镜像来测试学习:
-
新建容器并启动
- :列出所有运行中容器
- :退出容器
- :删除容器
- 启动和停止容器的操作
常用的其他命令
- :后台启动容器
- :查看日志
- :查看容器里的进程信息
- :查看镜像的数据
- :进入当前正在运行的容器
- :从容器内拷贝文件到主机
Docker 快速安装软件
直接安装的缺点:
- 安装麻烦,可能有各种依赖,运行报错。例如:,,,
- 可能对 Windows 并不友好,运行有各种兼容问题,软件只支持 Linux 上跑
- 不方便安装多版本软件,不能共存。
- 电脑安装了一堆软件,拖慢电脑速度。
- 不同系统和硬件,安装方式不一样
Docker 安装的优点:
- 一个命令就可以安装好,快速方便
- 有大量的镜像,可直接使用
- 没有系统兼容问题,Linux 专享软件也照样跑
- 支持软件多版本共存
- 用完就丢,不拖慢电脑速度
- 不同系统和硬件,只要安装好 Docker 其他都一样了,一个命令搞定所有
安装 Redis
-
Docker 官方镜像仓库查找 :https://hub.docker.com/
-
一个命令跑起来:
-
命令参考:https://docs.docker.com/engine/reference/commandline/run/
安装 WordPress
新建 文件:
在文件存放处打开 运行:
安装 nginx
Nginx 是一款轻量级的 Web 服务器、反向代理服务器,反向代理服务器在客户端和 Web 服务器之间起到中介作用,它将客户端的请求转发到后端服务器,并将响应发送回客户端,同时隐藏了后端服务器的细节。
思考问题:我们每次改动 nginx 配置文件,都需要进入容器内部?十分麻烦,我们要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?
答案:
安装 tomcat
发现问题:
- linux 命令少了
- 没有 webapps
这是阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉了,只保证最小可运行的环境。
思考问题:我们以后要部署项目,如果每次都要进入容器,是不是十分的麻烦?我们要是可以在容器外部提供一个映射路径,,我们在外部放置项目,就自动同步到内部就好了!
安装 ES + Kibana
思考:使用 Kibana 连接 es
更多相关命令
- :查看当前运行中的容器
- :查看镜像列表
- :删除指定 id 的容器
- :停止 / 启动指定 id 的容器
- :删除指定 id 的镜像
- :查看 volume 的列表
- :查看网络列表
制作自己的镜像
使用教程
commit
实战测试:
把自己写好的镜像提交上去,以后我们就使用修改过的镜像即可:
如果你想要保存当前容器的状态,就可以通过 commit 来提交,获得一个镜像,就好像我们之前学习 VM 时的快照!
Dockerfile
Dockerfile 介绍
Dockerfile 就是构建 docker 镜像的构建文件!命令脚本!通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本就是一个一个的命令,每个命令都是一层!
举个栗子:
注意:很多官方镜像都是基础包,很多功能都没有,我们通常会自己搭建镜像。
Dockerfile 构建过程
Dockerfile 命令:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
- 是面向开发的,我们以后要发布项目,做镜像,就需要编写 文件
实战测试
Docker Hub 中 99% 的镜像都是从基础镜像构建过来的 ,然后配置需要的软件和配置来进行构建。
接下来我们创建一个自己的 centos:
SpringBoot 的 web 项目构建 Docker 镜像
- 打包应用:在终端进入项目跟目录,使用 maven 将应用程序打包成可运行的 文件:,或者直接在 IDEA 界面右边的 Maven ( o) 项目 ( o) 生命周期 ( o) clean ( o) package,构建成功之后在 target 文件里可以看到 jar 包
- 编写 :在项目根目录下创建 文件,该文件用于描述 Docker 镜像的构建过程:
-
构建镜像:在终端进入项目根目录,并在该目录下执行以下命令构建 Docker 镜像:
- :用于指定镜像名字为
- :最后的句点表示 文件所在的当前目录
-
运行容器:执行以下命令即可启动一个新容器并运行应用程序:
- :用于将容器内部的 8080 端口映射到主机的 8080 端口上,这样外部就可以通过浏览器访问该应用程序了
目录挂载
现存问题:
- 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新 和 ,很是麻烦
- 容器里面产生的数据,例如 文件,数据库备份文件,容器删除之后就丢失了
我们希望容器之间可以有一个数据共享的技术。Docker 容器中产生的数据,同步到本地。
目录挂载可以解决以上问题:将容器内的目录,挂载到 Linux 上面,实现容器的持久化和同步操作。容器间也是可以数据共享的。
几种挂载方式:
- :直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上
- : 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上。
- : 适合存储临时文件,存宿主机内存中。不可多容器共享。
文档参考:https://docs.docker.com/storage/
挂载演示:
- 方式用绝对路径
- 方式,只需要一个名字
示例:
注意:挂载后,容器里的代码就会替代你本机的代码了,如果你的代码目录没有 目录,你需要在代码目录执行下 确保依赖库都已经安装,否则可能会提示 “Error: Cannot find module ‘koa’”
好处:以后修改只需要在本地修改即可,容器内会自动同步!
实战:
在本地进行连接:Navicat Premium 16
具名挂载和匿名挂载:
- 匿名挂载:,不写主机地址,所有 docker 容器内的卷,没有指定目录的情况下都是在 ,匿名挂载会随机生成一个名字
- 具名挂载:,不同于匿名挂载,具名卷需要赋予其一个有意义的名称,其存放在 中,具名挂载可以方便地找到我们的卷,大多数情况使用
- 指定路径挂载:, 是一种将主机文件系统的目录 (绝对路径)直接挂载到容器中的方式,容器中的修改也会同时影响到主机上的文件系统,因为它们使用的是同一个文件系统。这种挂载方式的优点是,您可以轻松地将您需要的主机文件目录(例如代码或配置文件)与容器分离出来。
数据卷通信:多容器间进行数据共享,
只要有一个容器还在用这个数据,这个数据就会一直存在!因为容器间共享的文件是一个双向拷贝的概念。
结论:
- 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
- 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
Docker 网络:多容器通信
理解 Docker0
-
清空所有容器和镜像
-
查看网卡
- 思考:docker 是如何处理容器的网络访问的?
- 启动容器后再次测试:
原理:
- Docker 使用的是 Linux 的桥接,宿主机中是一个 Docker 容器的网桥 docker0
- Docker 中的所有网络接口都是虚拟的,虚拟的转发效率高
- 只要安装了 Docker,就会有一个网卡 docker0,网卡使用桥接模式,使用的技术是 技术!
- 我们每启动一个 docker 容器,docker 就会给容器分配一个 ip
- 每多启动一个容器,主机 就会发现多了一对网卡
就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性, 可以充当一个桥梁,连接各种虚拟网络设备。
- 容器之间是可以互相 ping 通的,因为容器公用一个路由器 docker0,所有的容器不指定网络的情况下,都是 docker0 路由的,docker 会给我们的容器分配一个默认的可用 ip
思考一个问题:我们编写了一个微服务,;项目不重启,数据库 ip 换掉了,我们希望可以处理这个问题,可以使用名字来访问容器?
本质探究: 就是我们在 hosts 配置中增加了一个 172.17.0.3 tomcat02 2344c 的映射,所以可以通过容器名称 ping 通。
但是现在 Docker 已经不建议使用 –link 了
docker0 问题:不支持容器名连接访问
创建虚拟网络
网络模式:
- bridge:桥接模式(默认),自己创建的网络也属于这个模式
- none:不配置网络
- host:和宿主机共享网络
接下来我们的容器可以放在自己创建的网络当中:
现在同一网络内的容器就可以互相 ping 通:
网络连通
结论:假设要跨网络操作别人,就需要使用 docker network connect 连通!
实战:部署 Redis 集群
参考资料:【狂神说 Java】Redis 最新超详细版教程通俗易懂
使用 shell 脚本:
使用 docker 搭建 redis 集群完成!
Docker Swarm
Docker-Compose
如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。
在这节,我们使用 docker-compose 把项目的多个服务集合到一起,一键运行。
- 安装 Docker Compose
- 如果你是安装的桌面版 Docker,不需要额外安装,已经包含了。
- 如果是没图形界面的服务器版 Docker,你需要单独安装 安装文档
- 运行 检查是否安装成功
- 编写脚本:要把项目依赖的多个服务集合到一起,我们需要编写一个 文件,描述依赖哪些服务。参考文档:https://docs.docker.com/compose/
-
跑起来:
- 在 文件所在目录,执行:
- 命令参考:https://docs.docker.com/compose/reference/up/
-
Docker-Compose 的其他命令:
- 在后台运行只需要加一个 -d 参数
- 查看运行状态:
- 停止运行:
- 重启:
- 重启单个服务:
- 进入容器命令行:
- 查看容器运行 log:
发布和部署
镜像仓库介绍
镜像仓库用来存储我们 build 出来的 “安装包”,Docker 官方提供了一个 镜像库,里面包含了大量镜像,基本各种软件所需依赖都有,要什么直接上去搜索。
我们也可以把自己 build 出来的镜像上传到 docker 提供的镜像库中,方便传播。
当然你也可以搭建自己的私有镜像库,或者使用国内各种大厂提供的镜像托管服务,例如:阿里云、腾讯云
上传我们的镜像
发布到 Docker Hub
-
注册一个账号
-
创建一个镜像库
-
命令行登录账号:
-
新建一个 tag,名字必须跟你注册账号一样:
-
推上去:
-
部署试下:
发布到阿里云上
- 登录阿里云
- 找到容器镜像服务
- 创建命名空间
- 创建镜像仓库
- 浏览仓库信息
备份和迁移数据
迁移方式介绍
容器中的数据,如果没有用挂载目录,删除容器后就会丢失数据。
- 如果你是用 直接把宿主机的目录挂进去容器,那迁移数据很方便,直接复制目录就好了。
- 如果你是用 方式挂载的,由于数据是由容器创建和管理的,需要用特殊的方式把数据弄出来。
备份和导入 Volume 的流程
- 备份:
- 运行一个 ubuntu 的容器,挂载需要备份的 volume 到容器,并且挂载宿主机目录到容器里的备份目录。
- 运行 tar 命令把数据压缩为一个文件
- 把备份文件复制到需要导入的机器
- 导入:
- 运行 ubuntu 容器,挂载容器的 volume,并且挂载宿主机备份文件所在目录到容器里
- 运行 tar 命令解压备份文件到指定目录
备份 MongoDB 数据演示
-
运行一个 mongodb,创建一个名叫 的 volume 指向容器的 /data 目录
-
运行一个 Ubuntu 的容器,挂载 容器的所有 volume,映射宿主机的 backup 目录到容器里面的 /backup 目录,然后运行 tar 命令把数据压缩打包
-
最后你就可以拿着这个 文件去其他地方导入了
恢复 Volume 数据演示
- 运行一个 ubuntu 容器,挂载 mongo 容器的所有 volumes,然后读取 /backup 目录中的备份文件,解压到 /data/ 目录
- 注意,volumes-from 指定的是容器名字,strip 1 表示解压时去掉前面 1 层目录,因为压缩时包含了绝对路径
参考资Navicat for Premium 9.0.2激活料
-
Docker 快速入门
-
官方文档 | Docker Hub
-
狂神说 Java: Docker 最新超详细版教程通俗易懂
今天的文章
Navicat for Premium 9.0.2激活(Docker 使用教程)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/115631.html