理念:一次镜像,处处运行。是基于go语言实现的云开源项目
容器与虚拟机的区别:
- 虚拟机是一种带环境安装的解决方案,可以在一种操作系统中运行另外一种操作系统。 容器不是模拟一整个操作系统,而是只有软件所需要的库资源和设置。
- Docker是在操作系统层面实现的虚拟化,直接复用本地主机的操作系统,传统的虚拟机是在硬件层面实现的虚拟化。
- Docker是内核级虚拟化,不需要额外的Hypervisor支持,在一台物理机上可以运行多个容器实例。
- Docker 并非是一个通用的容器工具,而是依赖已经运行的环境,实质上是制造了一个隔离的文件环境,Docker必须不是在Linux内核的系统上,其他系统想要部署Docker必须安装一个虚拟Linux环境。(Win10可以在WSL中部署Docker)。
Docker为什么会比VM虚拟机快(重点)
- docker有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源的虚拟化(也就是docker是在操作系统层面实现的虚拟化),运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。
- docker利用的是宿主机的内核,不需要加载操作系统OS内核,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核(也就是不像虚拟机每开一个虚拟机需要重新运行一个完整的操作系统)
tips:Hypervisor是一种将操作系统与硬件抽象分离的方法,以达到host machine的硬件能同时运行一个至多个虚拟机作为guest machine的目的,这样能够使得这些虚拟机高效地分享主机硬件资源。
什么叫Docker的虚悬镜像
- 仓库名和标签都是none的镜像叫虚悬镜像,一般用 docker image prune删除
Docker的基本组成:
- 镜像:用来创建Docker容器,相当于是一个root文件系统。
- 容器:应用程序或者服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
- 仓库:是集中存放镜像文件的场所。官方的registry就是Docker Hub。国内一般用阿里云和网易云。
Docker的工作原理
Docker的安装
- 下载地址
- Docker Hub
- 文档地址
- ps -ef|grep docker 查看docker服务是否启动成功。
配置阿里云镜像加速
- 登录阿里云,进入容器与镜像服务,找到镜像加速器地址
- 根据命令配置镜像:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你镜像的地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker的常用命令
帮助启动类命令
镜像命令:
容器命令
exit:退出容器并杀死
ctrl+p+q :退出但是不杀死
启动后台守护式容器:-d
启动前台交互式容器:-i(-it)
docker容器后台运行必须要有前台进程,如果不是那种一直挂起的命令(比如top,tail),就会自动退出,所以最佳的解决方案就是将运行的程序以前台进程的形式运行,最常见的就是命令行模式。
查看日志: docker logs 容器ID
查看容器内部细节:docker inspect 容器ID
重新进入已经退出的容器:
docker exec -it 容器ID bashShell (启动新的进程)
docker attach 容器ID (不启动新的进程)
容器 -> 主机:docker cp 容器ID:容器内路径 目的主机路径
导出容器:
export 导出容器的内容留作为一个tar归档文件
docker export 容器ID > 文件名.tar
从tar包中导入容器:(导入后生成的是一个镜像)
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
交互式命令:
Docker 镜像:
UnionFS:联合文件系统,支持对文件系统的修改作为一次提交来一层层叠加。镜像可以通过分层来进行继承。
boot file system主要包含bootloader 和kernel。是docker的最底层。
root file system;就是各种不同操作系统的发行版。(在boofs之上)
docker commit -m = “提交的描述信息” -a = “作者” 容器ID 要创建的目标镜像名:[版本号]
发布自己的镜像到阿里云(阿里云会给脚本)
进入阿里云 - > 实例列表 -> 镜像仓库 -> 创建命名空间 -> 创建仓库
发布镜像到自己的私有库(Docker Registry)
docker pull registry
容器数据卷(相当于将容器中的数据在宿主机上备份一份)
容器卷记得加 :–privileged = true
卷就是目录或者文件,存在于一个或者多个文件容器中,由docker挂载到容器,但是不属于UnionFS,可以绕过UnionFS提供一些用于持续存储或共享数据的特性。
运行一个带有容器卷存储功能的容器实例:
docker run -it --privileged = true -v /宿主机绝对路径 :/容器内目录 镜像名
-v后面可以绑定多个
特点:(双向绑定)
- 可以在容器之间共享或者重用数据
- 卷中的更改可以实时生效
- 数据卷的生命周期知道没有容器使用它为止
查看数据卷是否挂载成功: inspect
运行一个带有容器卷存储功能的容器实例,这个容器的读写权限默认是rw的,可以设置成只读的。
docker run -it --privileged = true -v /宿主机绝对路径 :/容器内目录 :ro 镜像名
卷的继承和共享:
docker run -it --prilileged = true --volumes -from 父容器名 --name 子容器名 容器ID
docker 中MySQL插入中文乱码
mysql 和redis这种软件一定要挂容器数据卷
- 查看mysql中database的字符编码格式:
show variables like ‘character%’
新建my.cnf配置文件,进行修改后同步到docker的mysql中 - 删除容器后mysql中的数据怎么办:
一定要挂载容器卷,即使mysql容器被删除了,只要宿主机的文件没有被删除,重启容器后数据还是会存在。
高级篇
- MySQL配置主从复制:
- 一致性hash解决方案:就是使用hash环,容错性和扩展性提高。缺点是可能会产生数据倾斜的问题。
- hash槽分区:就是在redis和数据之间加入了一层,专门来给数据分配redis。一个集群只能有16384(2^14)个槽
- 3主3从redis集群配置:
开启6台redis,
cluster nodes :查看主从信息。
cluster info : 查看集群信息。具体解释
- 主从容错切换迁移:
链接redis集群的时候 redis-cli -p 6381 -c 后面要加“-c”;
查看集群信息:
主从切换: 备机上位之后变成master,当原来的master再次启动之后,原来的master就会编程slave。
-
主从扩容:
重新分配槽号:是原始的主机每个分一部分槽号给新加入的主机
给新加入的主机挂从机:
-
主从缩容:
从集群中删除一个从机:
重新分配槽号:
redis-cli --cluster reshard 主机IP:端口
分配完成之后,从集群中删除主机。
阳:zzyybs@126.com
Dockerfile
- Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网 - 基础知识
- 执行Dockerfile的流程:
- CMD和RUN命令的区别:
CMD是在 docker run 一个镜像的时候运行的,RUN 是在Docker build一个镜像的时候运行的。
Docker 网络
- docker network ls :查看当前的网络模式。
- 四种主要的网络模式:默认的是bridge
- Docker服务会默认创建一个docker0网桥(bridge模式)。(非常重要)
- host模式:直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换。
- lo模式:禁用网络功能,只有lo标识。
- Container模式:
宿主容器关闭 了,寄生容器的网络也会关闭。
- 自定义网络模式(非常重要):
Docker-compose容器编排
- Docker-compose:负责实现对Docker容器集群的快速编排。也就是用来管理容器的。定义的是一个YAML格式文件,docker-compose.yml
- 官网链接
- 一文件两要素:docker-compose.yml,服务,工程。
- 使用步骤:
- 常用命令:
可视化工具:
-
Portainer:
-
CAdvisor + InflusDB + Granfana
-
List item