docker

1 什么是 Docker

Windows10 Docker安装详细教程Win10安装DockerDocker教程

img

1.1 简介

  • Docker是一个开源的应用容器引擎
  • Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

1.2 应用场景

  • Web应用的自动化打包和发布。
  • 动化测试和持续集成、发布。
  • 服务型环境中部署和调整数据库或其他的后台应用。

1.3 Docker 的优势

1、简化程序:
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

3 Docker 架构

img

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。

主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

仓库(Registry):仓库用来保存镜像,可以理解为代码控制中的代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine:用于简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

4 Docker 原理

Docker的实现原理:是利用 Namespace 做资源隔离、用 Cgroup 做资源限制、利用 Union FS 做轻量级虚拟化技术。

4.1 Namespace

  • Docker利用 Linux 内核的 Namespace 功能,实现了容器之间的隔离。
  • 个容器拥有自己独立的命名空间,包括:进程、网络、用户等,使得容器内的进程看起来就像在一个独立的环境中运行一样。

4.2 Cgroup

  • Cgroup(Control Groups),是 Linux 内核提供的一种机制,用于限制、和管理进程组的资源使用。
  • Docker使用 Cgroup 功能限制源,比如:CPU、内存、磁盘 I/O… 等,都可以限制。
  • 过 Cgroup,防止某个容器耗尽系统资源,影响其他容器或主机系统的正常运行。

4.3 Union FS

  • UnionFS(联合文件系统):是一种文件系统技术,允许将多个文件系统挂载到同一个目录下,并将它们合并成一个文件系统。
  • 创建一个新的容器时,Docker 会在基础镜像的基础上添加一个读写层,这个读写层包含了:容器中新增的文件、和修改过的文件。
  • 样,容器的文件系统实际上是由多个层组成的,每个层都代表了对原始镜像的修改,从而实现了文件系统的共享和高效利用。
  • 过 Union FS 技术,还节省了存储空间,因为相同的文件只需要在底层镜像中存储一次,而不是每个容器都复制一份。

5 Docker命令

5.1 命令格式

1
docker 命令名 [选项] [镜像名 or 容器id] [容器内部命令]

5.2 常用命令

命令 说明
docker pull 拉取镜像
docker push 推送镜像到DockerRegistry
docker images 查看本地镜像
docker rmi 删除本地镜像
docker run 创建并运行容器(不能重复创建)
docker stop 停止指定容器
docker start 启动指定容器
docker restart 重新启动容器
docker rm 删除指定容器
docker ps 查看容器
docker logs 查看容器运行日志
docker exec 进入容器
docker save 保存镜像到本地压缩文件
docker load 加载本地压缩文件到镜像
docker inspect 查看容器详细信息

Docker文档Docker Docs

部分操作图解

6 案例

6.2 运行MySQL

6.2.1 拉取 mysql 镜像

docker pull mysql:5.7

6.2.2 启动 mysql

示例代码:映射可以实现数据持久性

1
2
3
4
5
6
7
8
9
docker run 
--name mysql8
-p 3308:3306
--restart unless-stopped
-v /e/Docker/mysql/logs:/var/log/mysql
-v /e/Docker/mysql/data:/var/lib/mysql
-v /e/Docker/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
mysql

6.2.2.1 说明

空目录映射

初始数据目录映射, 必须确保是空目录

Win7选项

最后追加 –innodb-use-native-aio=0

非必须映射

日志文件目录与配置文件目录映射是可选的

–restart 选项说明

–restart=always表示容器退出时,docker会总是自动重启这个容器–restart=on-failure:3表示容器的退出状态码非0(非正常退出),自动重启容器,3是自动重启的次数。超过3此则不重启–restart=no默认值,容器退出时,docker不自动重启容器–restart=unless-stopped表示容器退出时总是重启,但是不考虑docker守护进程运行时就已经停止的容器