深浅模式
Docker
字数: 0 字 时长: 0 分钟
第 1 章 Docker 介绍
我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境


1.1 Docker 概念
Docker 是一个开源的应用容器引擎
Docker 可以让开发者打包它们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上
容器是完全使用沙箱机制,相互隔离,容器性能开销极低
Docker 是一种容器技术,解决软件跨环境迁移的问题
1.2 Docker 架构

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统,比如官方镜像 ubuntu:16.0.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像
第 2 章 Docker 命令
2.1 Docker 服务相关命令
2.1.1 操作 daemon 相关命令
- 启动 Docker 服务
- 停止 Docker 服务
- 重启 Docker 服务
- 查看 Docker 服务状态
- 开机启动 Docker 服务
2.1.2 操作镜像相关命令
- 查看镜像,查看本地所有的镜像
docker images
docker images -q # 查看所用镜像的 id- 搜索镜像,从网络中查找需要的镜像
docker search 镜像名称- 拉取镜像,从 Docker 仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本,如果不知道镜像版本,可以去 docker hub 搜索对应镜像查看
docker pull 镜像名称- 删除镜像,删除本地镜像
docker rmi 镜像id # 删除指定本地镜像
docker rmi `docker images -q` # 删除所有本地镜像2.1.3 操作容器相关命令
- 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器- 创建并启动容器
docker run 参数
- 进入容器
docker exec 参数 # 退出容器,容器不会关闭- 停止容器
docker stop 容器名称- 启动容器
docker start 容器名称- 删除容器,如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称- 查看容器信息
docker inspect 容器名称第 3 章 Docker 容器数据卷
3.1 数据卷概念及作用
思考问题:
- Docker 容器删除后,在容器中产生的数据还在吗?

比如在宿主机中安装了一个 MySQL 容器,往 MySQL 里插入了数据,当我删除 MySQL 容器后里面的数据还在吗,答案是不在了
- Docker 容器和外部机器可以直接交换文件吗?
答案是不能

- 容器之间怎么进行数据交互呢?

引出数据卷
数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷

数据卷作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
3.2 配置数据卷
创建启动容器时,使用 -v 参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
3.3 配置数据卷容器
多容器进行数据交换:
- 多个容器挂载同一个数据卷
- 创建一个容器,挂载一个目录,让其它容器继承自该容器(--volume-from)

- 创建启动 c3 数据卷容器,使用
-v 参数设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash- 创建启动 c1 c2 容器,使用
--volumes-from 参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name-c2 --volumes-from c3 centos:7 /bin/bash第 4 章 Docker 应用部署
4.1 MySQL 部署
- 搜索 MySQL 镜像
- 拉取 MySQL 镜像
- 创建容器
- 操作容器中的 MySQL
怎么访问容器内的 MySQL?
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机的该端口,从而间接访问容器的服务,这种操作称为端口映射

4.2 Tomcat 部署
- 搜索 Tomcat 镜像
- 拉取 Tomcat 镜像
- 创建容器
- 部署项目
- 测试访问
4.3 Nginx 部署
4.4 Redis 部署
第 5 章 备份与迁移
第 6 章 Dockerfile
6.1 Docker 镜像原理
问题思考:
- Docker 镜像本质是什么?
答案:是一个分层文件系统
- Docker 中一个 Centos 镜像为什么只有 200MB,而一个 Centos 操作系统的 iso 文件要几个 G?
答案:Centos 的 iso 镜像文件包含 bootfs 和 rootfs,而 Docker 的 centos 镜像复用操作系统的 bootfs,只有 rootfs 和其它镜像层
- Docker 中一个 Tomcat 镜像为什么有 500MB,而一个 Tomcat 安装包只有 70 多 MB?
答案:由于 Docker 中镜像是分层的,Tomcat 虽然只有 70 多 MB,但它需要依赖于父镜像和基础镜像,所有整个对外暴露的 Tomcat 镜像大小 500 多 MB
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
其中 Linux 的文件管理子系统由 bootfs 和 rootfs 两部分组成:
- bootfs:包含 bootloader(引导加载程序)和 kernel(内核)
- rootfs:root 文件系统,包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件
- 不同的 Linux 发行版,bootfs 基本一样,而 rootfs 不同,如 Ubuntu,centos 等

Docker 镜像原理
Docker 镜像是由特殊的文件系统叠加而成,最底端是 bootfs,并使用宿主机的 bootfs(即复用 Linux 的 bootfs),第二层是 root 文件系统 rootfs,称为 base image,然后再往上可以叠加其它的镜像文件

这种技术就是统一文件系统(Union File System)技术,能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像成为基础镜像
当从一个镜像启动容器时,Docker 会在最顶层加载一个读写文件系统作为容器

6.2 Dockerfile 概念及作用
镜像制作
- 容器转为镜像(了解即可)

docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称- Dockerfile
Dockerfile 是一个文本文件,它包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝移植
6.3 Dockerfile 关键字


6.4 案例
需求:定义 Dockerfile,发布 SpringBoot 项目
实现步骤:
- 定义父镜像:
FROM java:8 - 定义作者信息:
MAINTAINER yusi <yusi@qq.com> - 将 jar 包添加到容器:
ADD springboot.jar app.jar - 定义容器启动执行的命令:
CMD java -jar app.jar - 通过 dockerfile 构建镜像:
docker bulid -f dockerfile文件路径 -t 镜像名称:版本
第 7 章 Docker 相关概念
7.1 Docker 容器虚拟化与传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署
- 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置
- 容器化软件在任何环境中都能够始终如一的运行
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突

相同之处:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同之处:
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统


第 8 章 Docker 服务编排
8.1 服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大:
- 要从 Dockerfile build image 或者去 dockerhub 拉取 image
- 要创建多个 container
- 要管理这些 container(启动停止删除)
服务编排:按照一定的业务规则批量管理容器
8.2 Docker Compose 概述
Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止,使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用

8.3 案例
第 9 章 Docker 私有仓库
9.1 搭建私有仓库
Docker 官方的 Docker hub 是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去,但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像
