Docker
为什么使用容器
1.上线流程繁琐 2.资源利用率底 3.扩容、缩容不及时(已知,未知)
业务机器增加承载量,可以应对一些突发状况,30%
弹性伸缩 4.服务器环境臃肿 5.环境不一致
docker介绍
官网:https://docs.docker.com/
安装centOS https://docs.docker.com/engine/install/centos/
# 广泛介绍 1,使用最广泛的开源容器引擎 2.一种操作系统级别的虚拟化技术 3.依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 4.一个简单的应用程序打包工具 # 设计目标 1.提供简单的应用程序打包工具 (项目环境+代码成镜像) 2.开发人员和运维人员责任逻辑分离 3.多环境保持一致性 # 基本组成 * Docker Client: 客户端 * Docker Daemon: 守护进程 * Docker Images: 镜像 * Docker Container: 容器 * Docker Registry: 镜像仓库
容器与虚拟机的区别
Container VM 启动速度 秒级 分钟级别 运行性能 接近原生 5%左右损失 磁盘占用 MB GB 数量 成百上千 一般几十台 隔离性 进程级别 系统级别(更彻底) 操作系统 只支持linux 几乎所有 封装程度 只打包项目代码和依赖关系(共享宿主内存) 整个操作系统
容器:
容器提供了一个独立的环境,实现容器隔离、资源限制
主要解决应用层面问题,应用快速部署、高效管理
虚拟机:
提升服务器资源利用率
提供一个隔离环境
Docker应用场景
应用程序打包和发布
应用程序隔离
持续集成(解决产品依赖服务,快速部署)
部署微服务
快速搭建测试环境
提供PaaS(平台及服务)
安装docker
# CentOS安装 Docker(官网) https://docs.docker.com/engine/install/centos/
# CentOS安装 Docker(菜鸟) https://www.runoob.com/docker/centos-docker-install.html
# yum依赖包 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel # 在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker $ yum install -y yum-utils $ yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安装最新版本(ce:社区版 ee:企业版) yum install docker-ce # 设置docker服务开机启动 $ systemctl start docker $ systemctl enable docker # 查看是否启动 docker info # 在虚拟机安装完docker 分配一个伪终端
# docker run 命令:https://www.runoob.com/docker/docker-run-command.html docker run -i -t centos /bin/bash # 若果不存在镜像,默认官方自动安装
# 创建容器 -d
docker run -d nginx # 查看伪终端安装的CentOS版本 cat /etc/redhat-release
Docker镜像
镜像是什么
# 一个分层储存的文件,不是一个单一的文件 # 一个软件的环境 # 一个镜像可以创建N个容器 # 一种标准的交付方式 # 一个不包换linux1内核而又精简的Linux操作系统
Docker命令最后一个指定镜像
# Docker run 1. docker命令最后一个指定镜像 (仓库:https://hub.docker.com/) 2. 默认镜像版本 latest 3. 分层下载 # Docker查看安装 docker ps # 列出容器
docker ps -a # 显示所有容器(包括未运行)
docker images # 列出本地镜像
# 配置镜像加速器: vi /etc/docker/daemon.json { "registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"] }
# 启动容器
docker start 进程号 # 进程号获取方式 docker ps -a 第一列
镜像与容器的联系
# 当启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,即容器层
容器目录:ls /var/lib/docker/containers/ 镜像储存目录(分层):ls /var/lib/docker/overlay2/
容器没有自己的内核
rootfs 根文件系统
bootfs 引导文件系统,引导程序和内核
镜像管理常见命令
# export # 备份 docker container export 82ded77e5342 > nginx.tar # 查看备份出的大小 du -sh nginx.tar # 解压 tar xvf nginx.tar # save导出 docker save nginx > nginx.tar # 删除镜像 docker image rm -f nginx # 无法删除占用文件 # 批量删除容器 docker rm -f $(docker ps -aq) # load导入 docker load < nginx.tar
镜像存储核心技术,容器读写
存储驱动为:overlay2()
镜像层只读,容器层读写 # 容器之间隔离
docker exec -it ID bash # ID 需要docker ps 查询
# 退出容器id
ctrl+d
# 镜像高效存储 答:引用联合文件系统,将镜像多层文件联合挂载到容器文件系统 将多个目录记录到,一个单独目录中记录 将信息综合起来方便调用,节省空间
# 写时复制(cow)
联合文件系统后,镜像是只读,类似共享形式让多个容器使用,如果在容器离修改文件,及镜像里的文件,该怎么办呢? 答:引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改
# 容器层创建文件里面存在挂载宿主机三个文件
hostname
hosta
resolv.conf
# 查看三个文件
ls /var/lib/docker/overlay2/容器id/diff
例子: ls /var/lib/docker/overlay2/1432ab6979524f2c6f8ff3ff6c44e334baab4a3f866f0afcbf706535251d251f/diff
# 读文件: 容器层-》镜像层
# 修改文件: 容器层-》镜像层
# 容器层创建一个文件
管理容器的常用命令
创建容器的常用选项
# 进入容器 docker container exec -it 容器ID号 bash # 实例 docker run -d -e ABC=123 -p 8888:80 --name nginx -h web --restart=always nginx 镜像# always 开机重启 # 查看是否生效
echo $ABC
hostname
# 挂在宿主机三个文件修改
hostname --hostname
hosta --dns
resolv.conf --add-host
容器资源管理
# 容器可以使用的最大内存量 docker run -d -m="512m" nginx # 资源统计信息 docker stats 长ID
容器资源扩容
# 更新容器配置 docker update 更新配置
# 查看所有容器(包括停止的)
docker ps -a 查看所有容器
# 只显示容器id
docker ps -aq 只显示容器id
# 删除所有容器
docker rm -f $(docker ps -a)
# 从外部复制到容器中
# 从外到里
docker cp nginx.tar web:/opt
docker exec -it web bash
# 从里到外
docker cp web:/opt/xxx ./
容器实现核心技术
六种不同的命名空间 namespace
# 查看进程的命名空间
ll /proc/$$/ns # 查看有哪些命名空间
ls /proc/1/ns
限制容器资源CGroups
Docker核心组件
将数据从宿主机挂载到容器中的三种方法
volume
bind mounts
docker网络
# 查看网络 docker network ls # 应用场景 bridge host 希望使用宿主机网络 none 手动配置容器网络,对接公司的IPAM container 希望容器与另一个容器在一个网络命名空间,Inmp
iptables