Docker
1.Docker概述
Docker的思想来源于集装箱!
JRE –多个应用 (端口冲突) –原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的
1.1Docker能做什么
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器时是没有自己内核的
- 每个容器内是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发,运维)
更快速地交付和部署
Docker:打包镜像,发布测试,一键运行
更便捷的升级和扩缩容
使用了 Docker之后,我们部署应用就和搭积木一样
项目打包为一个镜像,扩展服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨
到极致。
1.2Docker基本组成
镜像(images):
docker镜像就好比一个模板,可以通过这个模板来创建容器服务,
例如:tomcat镜像===>run ==>tomcat01容器(提供服务器)
通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
容器可以启动,停止,删除等基本命令
目前可以把这个容器理解为一个简易的Linux系统,
仓库(repository):
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
1.3回顾Docker helloworld流程
1.run的运行流程图
1.4底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
DockerServer接收到Docker-Client的指令,就会执行这个命令
2.Docker的基本命令
2.1帮助命令
1 | docker version #查看版本信息 |
2.2 镜像命令
docker images
1 | [root@wpeng /]# docker images |
docker search 搜索镜像
1 | [root@wpeng ~]# docker search mysql |
docker pull 下载镜像
1 | 下载镜像 docker pull 镜像名[:tag] |
docker rmi 删除镜像
1 | [root@wpeng ~]#docker rmi -f 镜像id #删除指定的镜像 |
2.3 容器命令
说明:我们有了镜像才可以创建容器 下一个alibaba cloud linux3镜像测试学习
1 | docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1 |
上述是下载杭州节点的镜像
新建容器并启动
1 | docker run [可选参数] image |
列出所有运行中的容器
1 | docker ps |
退出容器
1 | exit #直接容器停止并退出 |
删除容器
1 | docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f |
启动和停止容器
1 | docker start 容器id #启动容器 |
2.4常用其他命令
后台启动容器
1 | docker run -d 镜像名或者镜像id |
查看日志
1 | docker logs -tf --tail number 容器id #显示number条的日志 |
查看容器中进程信息
1 | docker top 容器id |
查看镜像的元数据
1 | docker inspect 容器id |
进入当前正在运行的容器
1 | 我们通常容器都是使用后台方式进行的,需要进入容器,需要修改一些配置 |
从容器内拷贝文件到主机上
1 | docker cp 容器id:容器内路径 目的主机路径 |
3.作业练习
Docker安装nginx
1 | 1.搜索镜像 docker search 镜像名字 |
Docker安装tomcat
1 | 官方使用 |
Docker部署es+kibana
1 | es 暴露的端口很多 |
4.可视化
4.1portainer
1 | 查询当前有哪些Portainer镜像 |
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作
Rancher
5.Docker镜像讲解
5.1镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件
所有的应用,直接打包成一个docker镜像,就可以直接跑起来
如何得到镜像呢
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像 docker file
5.2Docker镜像加载原理
UnionFs (联合文件系统)
我们下载的时候看到一层层的下载就是这个。
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支
持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(
unite several directories into a single virtual filesystem)。Union文件系统是
Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应
用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系
统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
5.3分层理解
https://blog.csdn.net/weixin_46618592/article/details/126555359
5.4 commit镜像
1 | docker commit 提交容器成为一个新的副本 |
实战测试
1 | 启动一个默认的tomcat |
添加镜像
1 | [root@wpeng /]docker ps |
6.容器数据卷
6.1什么是容器数据卷
docker理念回顾、
将应用和环境打包成一个镜像
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!==需求:数据可以持久化==
Mysql,容器删除了数据就会丢失!==需求:Mysql数据可以存储在本地==
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地
这就是卷技术! 目录的挂载,将我们容器内的目录,挂载到Linux上面
总结一句话:容器的持久化和同步操作!容器之间的数据也是可以共享的
6.2使用数据卷
方式一:直接使用命令 -v
1 | docker run -it -v 主机目录:容器目录 |
测试
1 | [root@wpeng home]# docker run -it -v /home/ceshi:/home tomcat /bin/bash |
1 | 启动起来之后,可以通过docker inspect 容器id 查看容器的元数据,可以找到下方的挂载 |
6.3实战:部署Mysql
思考:mysql的数据持久化问题
1 | [root@wpeng /]# docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Mypasseord --name mysql01 mysql |
6.4具名和匿名挂载
1 | 匿名挂载 |
具名挂载
1 | docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx |
区别
1 | 如何确定是具名挂载还是匿名挂载,还是指定路径挂载 |
拓展:
1 | 通过 -v 容器内路径:ro rw 改变读写权限 |
6.5初始Dockerfile
dockerfile就是用来构建docker镜像的构建文件!命令脚本
通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本是一个一个命令 每个命令都是一层
1 | FROM centos |
构建镜像
1 | docker build -f /home/docker-test-volume/dockerfile -t wpeng/centos:1.0 . |
==复制粘贴时,小心细节,结尾一定要加空格再加点==。
1 | 启动自己生成的容器 |
==发现了这两个卷,说明外部一定有同步的目录==
1 | 使用inspect命令查看镜像元数据 |
在mounts下可以找到容器内挂载目录在宿主机上对应的目录,就是source目录
在宿主机下找到这个目录
1 | [root@wpeng /]# cd /var/lib/docker/volumes/d4a1b49ca6e2b10dde089f27d7ef5459b5b7e03aed4f42fbbea05961131f22e5/_data |
可以看到该目录下有一个container.txt
6.6数据卷容器
多个mysql同步数据
1 | 先启动一个容器 |
==上述容器docker02依赖于docker01,执行删除docker01容器之后,docker02里面的数据还是存在的,实现了共享与备份==
多个mysql实现数据共享
1 | [root@wpeng /]# docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Mypassword --name mysql01 mysql |
结论
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是你一旦持久化到本地,这个时候,本地的数据是不会删除的
7.DockerFile
7.1DockerFile介绍
dockerfile是用来构建docker镜像的文件,就是命令参数脚本
很多官方镜像都是基础包,很多功能没有,我们通常会搭建自己的镜像
构建步骤:
- 编写一个dockerfile文件
- docker build 一个镜像
- docker run 运行镜像
- 通过docker push 发布镜像(DockerHub,阿里云镜像仓库)
7.2DockerFile构建过程
基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,我们以后要发布项目,就需要编写dockerfile文件,这个文件是十分简单
DockerFile:构建文件。定义了一切的步骤,源代码
DockerImages:通过DockeFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是为镜像运行起来提供服务的
7.3DockerFile的指令
1 | FROM #基础镜像,一切从这里构建 |
==CMD和ENTRYPOINT的区别==
CMD
1 | 启动的时候会列出列表 |
ENTRYPOINT
1 | 启动的时候会出现列表 |
7.4实战测试
DockerHub中百分99的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自己的centos
1.编写dockerfile的编写文件
1 | [root@wpeng home]# cd dockerfile |
2.通过这个文件构建镜像
1 | [root@wpeng dockerfile]# docker build -f wpengdockerfile -t mycentos:0.1 . |
3.测试运行
1 | [root@wpeng dockerfile]# docker run -it mycentos:0.1 |
我们可以列出本地镜像的变更历史
docker histtory 镜像名或者id
7.5制作Tomcat镜像
1.准备镜像文件tomcat压缩包,jdk的压缩包!
1 | [root@wpeng ~]# cd /home |
2.编写dockerfile文件,官方命名:Dockerfile,build的时候会自动寻找这个文件,就不需要-f指定了
1 | [root@wpeng wpeng]# vim Dockerfile |
3.构建镜像
1 | [root@wpeng wpeng]# docker build -t diytomcat . |
7.6发布自己的镜像
发布镜像到dockerhub上
1.登录到dockerhub上
2.在我们的服务器上提交自己的镜像
1 | [root@wpeng ~]# docker login --help |
3.登录完毕后就可以提交镜像了,就是一步docker push
1 | 1.项目创建完成后,返回控制台,列出所有镜像 |
发布镜像到阿里云服务器上
1.登录阿里云,找到镜像服务
2.创建命名空键7
3.创建容器镜像
8.Docker网络
8.1 理解docker0
三个网络
1 | docker 是如何处理容器网络访问的 |
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0, 桥接模式,使用的技术是evth-pair技术
1
2
3我们发现这个容器带来网卡,都是一对对的
evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
正是因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备
8.2 自定义网络
查看所有的docker网络
1 | docker network ls |
网络模式
bridge:桥接 docker (默认,使用veth技术)
none:不配置网络
host:主机模式,和宿主机共享网络
container:容器网络联通(用的少,局限性很大
1 | 创建网络 |
检查自己的网络
1 | [root@wpeng /]# docker network inspect mynet |