Docker
前言
1, 虚拟化
在计算机中, 虚拟化 (英语: Virtualization) 是一种资源管理技术, 是将计算机的各种实体资源, 如服务器, 网络, 内存及存储等, 予以抽象, 转换后呈现出来, 打破实体结构间的不可切割的障碍, 使用户可以比原本的组态更好的方式来应用这些资源. 这些资源的新虚拟部份是不受现有资源的架设方式, 地域或物理组态所限制. 一般所指的虚拟化资源包括计算能力和资料存储.
在实际的生产环境中, 虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用, 透明化底层物理硬件, 从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多, 例如: 软件虚拟化, 硬件虚拟化, 内存虚拟化, 网络虚拟化(vip), 桌面虚拟化, 服务虚拟化, 虚拟机等等.
解决高性能机器无法拆分的问题.
2, 虚拟化种类
(1)全虚拟化架构
虚拟机的监视器 (hypervisor) 是类似于用户的应用程序运行在主机的 OS 之上, 如 VMware 的 workstation, 这种虚拟化产品提供了虚拟的硬件.
(2)OS 层虚拟化架构
(3)硬件层虚拟化
硬件层的虚拟化具有高性能和隔离性, 因为 hypervisor 直接在硬件上运行, 有利于控制 VM 的 OS 访问硬件资源, 使用这种解决方案的产品有 VMware ESXi 和 Xen server
Hypervisor 是一种运行在物理服务器和操作系统之间的中间软件层, 可允许多个操作系统和应用共享一套基础物理硬件, 因此也可以看作是虚拟环境中的 "元" 操作系统, 它可以协调访问服务器上的所有物理设备和虚拟机, 也叫虚拟机监视器(Virtual Machine Monitor,VMM).
Hypervisor 是所有虚拟化技术的核心. 当服务器启动并执行 Hypervisor 时, 它会给每一台虚拟机分配适量的内存, CPU, 网络和磁盘, 并加载所有虚拟机的客户操作系统. 宿主机
Hypervisor 是所有虚拟化技术的核心, 软硬件架构和管理更高效, 更灵活, 硬件的效能能够更好地发挥出来. 常见的产品有: VMware,KVM,Xen 等等. Openstack.
一, docker 简介
1, 什么是 docker
1.1 容器技术
在计算机的世界中, 容器拥有一段漫长且传奇的历史. 容器与管理程序虚拟化 (hypervisor virtualization,HV) 有所不同, 管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行于物理硬件之上, 而容器则是直接运行在操作系统内核之上的用户空间. 因此, 容器虚拟化也被称为 "操作系统级虚拟化", 容器技术可以让多个独立的用户空间运行在同一台宿主机上.
由于 "客居" 于操作系统, 容器只能运行于底层宿主机相同或者相似的操作系统, 这看起来并不是非常灵活. 例如: 可以在 Ubuntu 服务中运行 RedHat Enterprise Linux, 但无法在 Ubuntu 服务器上运行 Microsoft Windows.
相对于彻底隔离的管理程序虚拟化, 容器被认为是不安全的. 而反对这一观点的人则认为, 由于虚拟容器所虚拟的是一个完整的操作系统, 这无疑增大了攻击范围, 而且还要考虑管理程序层潜在的暴露风险.
尽管有诸多局限性, 容器还是被广泛部署于各种各样的应用场合. 在超大规模的多租户服务部署, 轻量级沙盒以及对安全要求不太高的隔离环境中, 容器技术非常流行. 最常见的一个例子就是 "权限隔离监牢"(chroot jail), 它创建一个隔离的目录环境来运行进程. 如果权限隔离监牢正在运行的进程被入侵者攻破, 入侵者便会发现自己 "身陷囹圄", 因为权限不足被困在容器所创建的目录中, 无法对宿主机进一步破坏.
最新的容器技术引入了 OpenVZ,Solaris Zones 以及 Linux 容器 (LXC). 使用这些新技术, 容器不在仅仅是一个单纯的运行环境. 在自己的权限类内, 容器更像是一个完整的宿主机. 对 Docker 来说, 它得益于现代 Linux 特性, 如控件组(control group), 命名空间(namespace) 技术, 容器和宿主机之间的隔离更加彻底, 容器有独立的网络和存储栈, 还拥有自己的资源管理能力, 使得同一台宿主机中的多个容器可以友好的共存.
容器被认为是精益技术, 因为容器需要的开销有限. 和传统虚拟化以及半虚拟化相比, 容器不需要模拟层 (emulation layer) 和管理层(hypervisor layer), 而是使用操作系统的系统调用接口. 这降低了运行单个容器所需的开销, 也使得宿主机中可以运行更多的容器.
尽管有着光辉的历史, 容器仍未得到广泛的认可. 一个很重要的原因就是容器技术的复杂性: 容器本身就比较复杂, 不易安装, 管理和自动化也很困难. 而 Docker 就是为了改变这一切而生的.
Docker 是一种轻量级的容器化技术.
1.2 容器与虚拟机比较
(1)本质上的区别
(2)使用上的区别
1.3 docker 特点
(1)上手快
用户只需要几分钟, 就可以把自己的程序 "Docker 化".Docker 依赖于 "写时复制"(copy-on-write)模型, 使修改应用程序也非常迅速, 可以说达到 "随心所致, 代码即改" 的境界.
随后, 就可以创建容器来运行应用程序了. 大多数 Docker 容器只需要不到 1 秒中即可启动. 由于去除了管理程序的开销, Docker 容器拥有很高的性能, 同时同一台宿主机中也可以运行更多的容器, 使用户尽可能的充分利用系统资源.
(2)职责的逻辑分类清晰
使用 Docker, 开发人员只需要关心容器中运行的应用程序, 而运维人员只需要关心如何管理容器. Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性. 从而降低那种 " 开发时一切正常, 肯定是运维的问题(测试环境都是正常的, 上线后出了问题就归结为肯定是运维的问题).
(3)快速高效的开发生命周期
Docker 的目标之一就是缩短代码从开发, 测试到部署, 上线运行的周期, 让你的应用程序具备可移植性, 易于构建, 并易于协作.(通俗一点说, Docker 就像一个盒子, 里面可以装很多物件, 如果需要这些物件的可以直接将该大盒子拿走, 而不需要从该盒子中一件件的取.)
(4)鼓励使用面向服务的架构
Docker 还鼓励面向服务的体系结构和微服务架构. Docker 推荐单个容器只运行一个应用程序或进程, 这样就形成了一个分布式的应用程序模型, 在这种模型下, 应用程序或者服务都可以表示为一系列内部互联的容器, 从而使分布式部署应用程序, 扩展或调试应用程序都变得非常简单, 同时也提高了程序的内省性(当然, 可以在一个容器中运行多个应用程序).
2,docker 组件
2.1 docker 客户端和服务器(守护进程)
Docker 是一个客户端 - 服务器 (C/S) 架构程序. Docker 客户端只需要向 Docker 服务器或者守护进程发出请求, 服务器或者守护进程将完成所有工作并返回结果. Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API. 你可以在同一台宿主机上运行 Docker 守护进程和客户端, 也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程.
2.2 Image(镜像)
镜像是构建 Docker 的基石. 用户基于镜像来运行自己的容器. 镜像也是 Docker 生命周期中的 "构建" 部分. 镜像是基于联合文件系统的一种层式结构, 由一系列指令一步一步构建出来. 例如:
添加一个文件;↓
执行一个命令;↓
打开一个窗口.↓
也可以将镜像当作容器的 "源代码". 镜像体积很小, 非常 "便携", 易于分享, 存储和更新.
2.3 Registry(注册中心, 仓库)
Docker 用 Registry 来保存用户构建的镜像. Registry 分为公共和私有两种. Docker 公司运营公共的 Registry 叫做 Docker Hub. 用户可以在 Docker Hub 注册账号, 分享并保存自己的镜像(说明: 在 Docker Hub 下载镜像巨慢, 可以自己构建私有的 Registry).
2.4 Containers (容器)
Docker 可以帮助你构建和部署容器, 你只需要把自己的应用程序或者服务打包放进容器即可. 容器是基于镜像启动起来的, 容器中可以运行一个或多个进程. 我们可以认为, 镜像是 Docker 生命周期中的构建或者打包阶段, 而容器则是启动或者执行阶段. 容器基于镜像启动, 一旦容器启动完成后, 我们就可以登录到容器中安装自己需要的软件或者服务.
所以 Docker 容器就是:
一个镜像格式;
一些列标准操作;
一个执行环境.
Docker 借鉴了标准集装箱的概念. 标准集装箱将货物运往世界各地, Docker 将这个模型运用到自己的设计中, 唯一不同的是: 集装箱运输货物, 而 Docker 运输软件.
和集装箱一样, Docker 在执行上述操作时, 并不关心容器中到底装了什么, 它不管是 web 服务器, 还是数据库, 或者是应用程序服务器什么的. 所有的容器都按照相同的方式将内容 "装载" 进去.
Docker 也不关心你要把容器运到何方: 我们可以在自己的笔记本中构建容器, 上传到 Registry, 然后下载到一个物理的或者虚拟的服务器来测试, 在把容器部署到具体的主机中. 像标准集装箱一样, Docker 容器方便替换, 可以叠加, 易于分发, 并且尽量通用.
使用 Docker, 我们可以快速的构建一个应用程序服务器, 一个消息总线, 一套实用工具, 一个持续集成 (CI) 测试环境或者任意一种应用程序, 服务或工具. 我们可以在本地构建一个完整的测试环境, 也可以为生产或开发快速复制一套复杂的应用程序栈.
2.5 其他
libcontainer
namespace 命名空间
cgroups 资源配额
二, docker 的安装与启动
1, 安装 docker
yum install docker
2, 查看 docker 的版本
- docker -v
- docker version
3, 启动与停止 docker
systemctl status docker #查看 docker 的状态 systemctl start docker #启动 docker systemctl stop docker #停止 docker systemctl restart docker #重启 docker systemctl enable docker #设置开机启动 docker info #查看 docker 概要 docker help #查看帮助
三, docker 镜像的操作
1, 什么是 docker 镜像
Docker 镜像是一个文件, 里面存储的核心: 最基本的操作系统 + 软件运行环境
2, 列出镜像
docker images #查看本地主机上已有的镜像 ? [root@docker_c7 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest fce289e99eb9 2 weeks ago 1.84 kB docker.io/tomcat latest 1a51cb5e3006 2 weeks ago 462 MB docker.io/nginx latest 7042885a156a 2 weeks ago 109 MB docker.io/MySQL latest 102816b1ee7d 2 weeks ago 486 MB docker.io/Redis latest 5d2989ac9711 2 weeks ago 95 MB docker.io/CentOS latest 1e1148e4cc2c 6 weeks ago 202 MB ?
REPOSITORY: 镜像所在的仓库名称
TAG: 镜像标签(相当于版本号)
IMAGE ID: 镜像 ID
CREATED: 镜像的创建日期(不是获取该镜像的日期)
SIZE: 镜像大小
这些镜像都是存储在 Docker 宿主机的 / var/lib/docker 目录下
3, 搜索镜像
docker search 镜像名称
比如
docker search tomcat ? [root@docker_c7 ~]# docker search tomcat INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/tomcat Apache Tomcat is an... 2259 [OK] docker.io docker.io/tomee Apache TomEE is an... 60 [OK] ?
NAME: 仓库名称
DESCRIPTION: 镜像描述
STARS: 用户评价, 反应一个镜像的受欢迎程度
OFFICIAL: 是否官方
AUTOMATED: 自动构建, 表示该镜像由 Docker Hub 自动构建流程创建的
4, 拉取镜像
docker pull 镜像名称: tag
比如(不加 tag: 下载最新的 latest)
docker pull MySQL
由于国内连接国外网络拉取镜像较慢, 可以修改配置改为从国内镜像提供者拉取
https://docker.mirrors.ustc.edu.cn #ustc 镜像 不需要注册 完全公共 vi /etc/docker/daemon.JSON ? { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } ?
修改完毕后, 重启 docker
systemctl restart docker
5, 删除镜像
docker rmi 镜像 id(IMAGE ID)
比如
docker rmi fce289e99eb9
四, docker 容器的操作
1, 查看容器
docker ps #正在运行中的容器 docker ps -a #所有的容器(正在运行或者停止的)
2, 创建与启动容器
1, 交互式容器
docker run -it --name mycentos01 CentOS:7 /bin/bash
命令: docker run -it -name 容器名称 镜像名称: tag /bin/bash
直接进入容器里面了, 可以使用 exit 退出
一旦退出, 这个容器就会关闭.
如果想再次登录这个容器, 可以使用如下命令:
1, 先启动这个容器
命令: docker start 容器名称
docker start mycentos01
2, 使用下面的命令登录容器
命令: docker exec -it 容器名称 /bin/bash
docker exec -it mycentos01 /bin/bash ?
这个时候, 再次退出容器, 查看容器的状态, 还是 up(运行)状态
2, 守护式容器(后台运行)
docker run -di --name mycentos02 CentOS:7
命令: docker run -di --name 容器名称 镜像名称: tag
注意: 这种方法创建的 docker 容器, 不会直接进入容器, 而是在后台运行
?
如果想进入这个后台运行的容器, 使用如下命令:
命令: docker exec -it 容器名称 /bin/bash
docker exec -it mycentos02 /bin/bash
参数说明
-i: 表示运行容器
-t: 表示容器启动后会进入其命令行. 加入这两个参数后, 容器创建就能登录进去. 即分配一个伪终端.
--name : 为创建的容器命名.
-v: 表示目录映射关系(前者是宿主机目录, 后者是映射到宿主机上的目录), 可以使用多个 - v 做多个目录或文件映射. 注意: 最好做目录映射, 在宿主机上做修改, 然后共享到容器上.
-d: 在 run 后面加上 - d 参数, 则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器, 如果只加 - i -t 两个参数, 创建后就会自动进去容器).
-p: 表示端口映射, 前者是宿主机端口, 后者是容器内的映射端口. 可以使用多个 - p 做多个端口映射
3, 停止与启动容器
docker stop mycentos01 #停止容器 docker restart mycentos01 #重启 docker start mycentos01 #启动容器
4, 文件拷贝
1, 将文件拷贝到容器内 :docker cp 需要拷贝的文件或目录 容器名称: 容器目录
本地创建准备拷贝的文件
cd /usr/local/ mkdir docker cd docker/ VIM test.txt
将文件拷贝到容器内的 / usr/local/ 目录下面
docker cp test.txt mycentos01:/usr/local/ ?
2, 将容器内的文件拷贝到宿主机上: docker cp 容器名称: 容器目录 需要拷贝的文件或目录
在容器内部创建要拷贝的文件:
VIM docker_test.txt exit
docker cp mycentos01:/usr/local/docker_test.txt ./ 拷贝容器内的文件到当前目录下面?
5, 目录挂载
我们可以在创建容器的时候, 将宿主机的目录与容器内的目录进行映射, 这样我们就可以通过修改宿主机某个目录的文件从而去影响容器.
?
1, 命令: 创建容器 添加 - v 参数 后边为 宿主机目录: 容器目录
举例:
docker run -di --name mycentos03 -v /usr/local/docker/:/usr/local/docker CentOS:7
将本地的 / usr/local/docker 目录映射到 mycentos03 容器内的 / usr/local/docker 目录下
这样, 两边可以共享文件
?
注意: 最好添加 --privileged=true
docker run -di --name mycentos03 -v /usr/local/docker/:/usr/local/docker --privileged=true CentOS:7
这是因为 CentOS7 中的安全模块 selinux 把权限禁掉了, 我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题.
6, 查看容器的 ip
1, 查看所有的数据(包含 ip)
docker inspect mycentos01
2, 仅仅查看 ip 地址:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos01?
7, 删除容器
注意: 只能删除停止运行的容器
命令: docker rm mycentos01
五, 使用 docker 部署应用
1,MySQL 部署
1, 拉取 MySQL 镜像
docker pull MySQL docker images
2, 创建 MySQL 容器
docker run -di --name c7_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 MySQL ?
-p 代表端口映射, 格式为 宿主机映射端口: 容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登陆密码
3, 进入 MySQL 容器, 登录 MySQL
docker exec -it c7_mysql /bin/bash MySQL -uroot -p
4, 查看 MySQL 容器的 ip
docker inspect c7_mysql
2,tomcat 部署
1, 拉取 tomcat 镜像
docker pull tomcat
2, 创建 tomcat 容器
docker run -di --name c7_tomcat -p 9000:8080 -v /usr/local/docker:/usr/local/tomcat/webapps --privileged=true tomcat ?
-v: 代表目录映射
3, 部署 Web 应用
将 Web 应用 web_demo 上传到:/usr/local/docker 目录下面
修改 cas 系统的配置文件(deployerConfigContext.xml), 修改数据库连接的 url,172.17.0.2 为 docker 中 MySQL 的 ip
? <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://172.17.0.2:3306/c7db?characterEncoding=utf8" p:user="root" ......
注意: 重启下 tomcat 容器: docker restart c7_tomcat
3,nginx 部署
1, 拉取 nginx 镜像
docker pull nginx
2, 创建 nginx 容器
docker run -di --name c7_nginx -p80:80 nginx
注意: 映射的端口为 80 端口
3, 测试 nginx
浏览器地址栏输入: http://xxx.xxx.xxx.xxx/
4, 配置反向代理
1, 从容器拷贝配置文件到宿主机
cd /usr/local/docker/ docker cp c7_nginx:/etc/nginx/nginx.conf ./nginx.conf
2, 编辑 nginx.conf 添加反向代理的配置
VIM nginx.conf ? upstream tomcat-cas { server 172.17.0.7:8080; } server { listen 80; server_name passport.xxx.com; location / { proxy_pass http://tomcat-web_demo; index index.html index.htm; } } ?
3, 将修改后的配置拷贝到 nginx 容器
docker cp nginx.conf c7_nginx:/etc/nginx/nginx.conf
4, 重启 nginx 容器
docker restart c7_nginx
5, 修改本机的 hosts 文件, 添加如下内容:
xxx.xxx.xxx.xxx passport.xxx.com ?
4,Redis 部署
1, 拉取 Redis 镜像
docker pull Redis
2, 创建 Redis 容器
docker run -di --name c7_redis -p 6379:6379 Redis
3, 客户端测试
1, 先在本机安装 Redis, 再通过 Redis-cli 连接 Redis 容器
yum install epel-release yum install Redis ?
2, 使用 Redis-cli 连接 Redis 容器
Redis-cli -h 192.168.44.66
六, Docker 容器的备份与迁移
1, 容器保存为镜像
docker commit c7_nginx mynginx
命令: docker commit 容器名称 新镜像的名称
2, 镜像的备份
docker save -o mynginx.tar mynginx
命令: 将本地的 mynginx 镜像备份成文件 mynginx.tar
3, 镜像的恢复及迁移
1, 先删除本地的 mynginx 镜像
docker rmi mynginx
2, 使用 docker load 恢复镜像
docker load -i mynginx.tar
七, 其他参考文章
https://blog.csdn.net/zmx729618/article/details/72930474/ https://blog.csdn.net/xiaochendefendoushi/article/details/81903980 DockerFile https://www.cnblogs.com/lighten/p/6900556.html https://blog.csdn.net/len9596/article/details/79767259 https://www.cnblogs.com/boshen-hzb/p/6400272.html
来源: http://www.bubuko.com/infodetail-2923603.html