狂神的 Docker 课程:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0
2、Docker 概述 2.1、Docker 为什么出现?传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完!
安卓流程:java — apk —发布(应用商店)一 张三使用apk一安装即可用!
docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)-----
Docker给以上的问题,提出了解决方案!
Docker 的思想来自于集装箱!
JRE – 多个应用(端口冲突) – 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。
Docker通过隔离机制,可以将服务器利用到极致!
2.2、Docker 为什么这么活?原因:十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个VMware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
-
vm : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 几个G 几分钟
-
docker: 隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧!
几个M 秒级启动!
Docker基于Go语言开发的!开源项目!
docker官网:https://www.docker.com/
文档:https://docs.docker.com/
仓库:https://hub.docker.com/
2.3、Docker 能做什么?比较 Docker 和虚拟机技术的不同:
- 传统虚拟机,虚拟出一个硬盘,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了。
- 每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
-
镜像(image)
docker 镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat 镜像 = => run = =容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
-
容器(container)
Docker 利用容器技术,独立运行创建一个或者一组应用,通过镜像创建的,启动、停止、删除、基本命令等
-
仓库(repository)
仓库就是存放镜像的地方,这里跟 maven 的仓库类似,也分为私有仓库和公有仓库
我的Linux 内核是 5.x 的,Ubuntu 是 20x
你可以根据帮助文档进行安装也可以安装我的方式安装
帮助文档:https://docs.docker.com/engine/install/
说明:
#安装命令 使用 aliyun 安装速度更快 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun #说明如果显示下面的错误需要你去安装 curl 指令 sudo apt install curl
安装成功
输入docker version
测试一下
输入命令 docker run hello-world
查看镜像 docker images
配置阿里云镜像加速(首先需要的是你有阿里云账号且实名认证)
自己注册个人版后找到镜像加速(选择不同的版本,老胡用的是 Ubuntu)
说明:
-
第一步选择你的 Linux 版本
-
第二步创建 daemon.json 文件 (vim /etc/docker/daemon.json)
-
第三步在文件中添加你的阿里云镜像地址
-
第四步输入下面两条命令重载
sudo systemctl daemon-reload
sudo systemctl restart docker
ok 阿里云镜像加速配置成功!
3.3.2、底层原理Docker 是怎么工作的?
Docker 是一个 client-server 结构的系统,Docker 的守护线程运行在主机上。通过 socket 从客户端访问。Docker-server 接收到 Docker-client 的指令,就会执行这个命令。
为什么 Docker 比 VM 快
- Docker 有着比虚拟机更少的抽象层,由于 Docker 不需要 hypervisor 实现硬件资源虚拟机化,运行在 Docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 Docker 将会在效率上有明显优势。
- Docker 利用的是宿主机的内核,而不需要 Guest OS
- GuestOS:vm 里的系统
- HostOS:物理机里的系统
因此,当新建一个容器时,Docker 不需要和虚拟机一样重新加载一个操作系统内核。然后避免引导、加载操作系统内核是个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 GuestOS,这个新建过程是分钟级别的。而 Docker 由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个 Docker 容器只需要几秒钟的时间。
4、Docker 的常用命令 4、1帮助命令-
docker version:(显示版本信息)
-
docker info:(显示 docker 的系统信息,包括镜像和容器的数量)
-
docker 命令 --help:(帮助命令)
-
帮助文档地址
https://docs.docker.com/engine/reference/commandline/build/
-
docker images:(查看所有本地主机上的镜像,可以使用 docker image ls 代替)
-
docker search 镜像:(搜索镜像)
-
docker push 镜像:[版本号]:(下载镜像方式一:可以指定版本,若不指定就是最新版本)
问题:
因为我的是mac 的m1 在 docker 上没有适配的mysql(因为 m1 是 arm64 架构的所以这时候我们要使用其他的命令去拉去)
-
docker pull mysql/mysql-server:latest(m1 Mac)
注意:好像是只能使用 latest,我换了 5 但是告诉我拉取失败,你们可以试一试来告诉老胡
分层下载:就是说,当你需要更新 mysql 版本的时候,它会根据你之前下载的版本与现在版本进行比对,对于相同的是不需要下载的,直接拿来使用,节省了空间
-
docker rmi 镜像 id :(删除镜像)
说明:
docker rmi 删除镜像 :(与 docker image rm 相似)
docker rmi -f $(docker images -aq) :(删除全部的镜像)
-
**docker run [可选参数] image **:(run 也可以写为 container 是一样的)
-
参数说明
–name=“name”:(容器名字 tomcat1 tomcat2 用来区分容器)
-d:(后台方式运行)
-it:(使用交互方式运行,进入容器查看内容)
-p:(指定容器的端口 -p 8080(宿主机):8080(容器))
-p ip:(主机端口:容器端口)
-p 主机端口:容器端口(常用)
-p 容器端口
-P:(大写的 P,随机指定端口)
-
-
docker ps [可选参数]:(列出当前正在运行的容器)
-
-a:(列出所有执行过的容器)
-
-n:(列出 n 个最近展示的)
-
**注意:**若你想容器退出不停止使用(ctrl +P +Q )
-
-
docker start 容器 id:(删除指定的容器,不能删除正在运行的容器,如果强制删除 rm -rf)
-
docker restart 容器 id:(重启容器)
-
docker stop 容器 id:(停止当前正在运行的容器)
-
docker kill 容器 id:(强制停止当前容器)
-
docker run -d 镜像名:(后台启动命令)
-
docker logs [可选参数]:(查看日志,可以通过可选参数来进行日志的选择性输出)
-
docker top 容器 id:(查看容器中进程信息)
-
docker inspect 容器 id:(查看镜像的元数据)
-
docker exec -it 容器 id bashshell:(方式一:进入容器,这种方式是进入当前容器后开启一个新的终端。可以在里面操作)
-
docker attach 容器 id:(方式二:进入容器,这种方式是进入容器中正在执行的终端)
-
docker cp 容器 id:路径/文件 /当前 Linux 路径:(从容器中拷贝文件到 Linux 中)
| 命令 | 介绍 |
|---|---|
| attach | 当前 shell 下 attach 连接指定运行的镜像 |
| build | 通过 dockerfile 定制镜像 |
| commit | 提交当前容器为新的镜像 |
| cp | 拷贝文件 |
| create | 创建一个新的容器 |
| diff | 查看 docker 容器的变化 |
| events | 从服务获取容器实时时间 |
| exec | 在运行中的容器上运行命令 |
| export | 导出容器文件系统作为一个 tar 归档文件(对应 import) |
| history | 展示一个镜像形成的历史 |
| images | 列出系统当前的镜像 |
| import | 从 tar 包中导入内容创建一个文件系统镜像 |
| info | 显示全系统信息 |
| inspect | 查看容器详细信息 |
| kill | kill 指定docker 容器 |
| load | 从一个 tar 包或标准输入中加载一个镜像 |
| login | 登录 |
| logout | 登出 |
| log s | 日志 |
| ps | 当前运行的容器列表 |
| pull | 从仓库拉取镜像 |
| push | 上传一个镜像到仓库中 |
| rename | 重命名一个容器 |
| restart | 重启一个或多个容器 |
| rm | 删除一个或多个容器 |
| rmi | 删除一个或多个镜像 |
| run | 运行一个容器 |
| save | 保存一个或多个镜像为 tar 包 |
| search | 搜索 docker 仓库中存在的镜像 |
| start | 启动一个或多个容器 |
| stats | 显示容器资源使用统计信息的实时流 |
| stop | 停止一个或多个正在运行的容器 |
| tag | 创建引用源图像的标记目标图像 |
| top | 展示一个容器中正在运行的进程 |
| unpause | 取消一个或多个容器中的所有进程 |
| update | 更新一个或多个容器配置 |
| version | 展示docker 版本信息 |
| wait | 阻止停止一个或多个容器,然后打印其输出 |
-
拉取 nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gsh9mrxQ-1635711562527)(https://gitee.com/HJIC/upload_image3/raw/master/img/image-20211106181531639.png)]
-
curl localhost:3344:(是否能够访问到 nginx)
-
思考问题:
我们每次改动 nginx 配置文件,都需要进入容器内部?十分的麻烦,要是可以在容器外部提供一个映射文件,达到在容器修改文件名,容器内部就可以自动修改?数据卷
端口暴露示意图
-
docker run it --rm tomcat:8:(官方使用,rm 是删除的意思,即一般是用来测试用完就删除)
-
docker pull tomcat:(拉取 最新版tomcat)
-
docker run -d -p 8080:8080 --name tomcat01 tomcat:(启动运行)
-
为什么无法访问:
这是一个阉割版的,你进入容器中会发现少了 webapps,即阿里云镜像为了保证最小镜像,将不会要的都剔除了(为了保证最小可运行环境!)
思考问题:
我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,能够自动同步就好了!
5.3.3、docker 部署 es+kibana
- es 暴露的端口很多
- es 十分耗内存
- es 的数据一般需要放置到安全目录!挂载
- –net somenetwork ? 网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.14.1
-
docker run -d --name elasticsearch5 -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.14.1:(注意我的版本是 m1 的所以最好的是去 docker 官网找适合你的版本)
-
curl localhost:9200:(查看是否启动成功)
-
注意 es 是十分耗内存的,甚至出现了占用 1 个 G 多的内存,使用 docker stats 容器 id
-
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.14.1:(添加参数解决占 CPU 过高问题:ES_JAVA_OPTS="-Xms64m -Xmx512m")
-
思考:如何使用 kibana 连接es



