无题
在 Windows 和 Mac 中使用 Docker对于开发来说,Windows 和 macOS 是更为常见和常用的系统,所以也很有必要了解在 Windows 和 macOS 中使用 Docker 的方法。很幸运的是,Docker 的官方对这两个系统提供了强有力的支持,我们可以很轻松的在这两个系统中运行 Docker。在这一小节中,我们就来了解一下 Docker 在 Windows 和 macOS 中安装的方式以及运行的原理。
Docker Desktop在大多数情况下,我们的开发工作是在 Windows 或 macOS 这两个操作系统中进行的,既然 Docker 是我们用来解决开发、测试到运维整条产品线的工具,自然支持这两个系统是不可或缺的功能。
如同封装 Docker 为我们提供了轻松的虚拟化运行环境一样,Docker 在 Windows 和 macOS 中的安装也是极易完成的。Docker 官方为 Windows 和 macOS 系统单独开辟了一条产品线,名为 Docker Desktop,其定位是快速为开发者提供在 Windows 和 macOS 中运行 Docker 环境的工 ...
无题
搭建 Docker 运行环境既然 Docker 是一款实用软件,我们就不得不先从它的安装说起,只有让 Docker 运行在我们的计算机上,才能更方便我们对 Docker 相关知识和使用方式的学习。得益于与商业性的优雅结合,Docker 背后拥有大量的优秀开发者为其提供技术支持,而这个优势所造就的结果之一,就是 Docker 拥有丰富且完善的安装体系,我们可以很轻松的通过多种方式安装和运行 Docker。
安装前的准备由于 Docker 容器实现本身就采用了 Linux 内核中很多的特性,所以它自然与 Linux 系统亲密性很高,所以我们可以很轻松的将 Docker Engine 安装在 Linux 系统中。
不过,在安装之前,我还得不厌其烦的啰嗦一些基本概念,让大家在安装 Docker 时能够更好的进行选择。掌握这些概念,能够帮助大家理解一些安装流程中操作的目的,不至于总是一味的进行“下一步”式安装。
Docker Engine 的版本在安装 Docker 之前,我们先来了解一下 Docker 的版本定义,这有利于我们在之后的开发中选择和使用合适的 Docker 版本。
对于 Dock ...
无题
在开发环境中使用服务发现服务发现应用是很多服务化系统的组成部分,所以在开发、测试环境中也就有必要配备一套服务发现体系来配合我们的开发、测试工作。在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发现应用。
使用 Docker Compose 模拟 Zookeeper 集群实现服务发现的方法有很多种,其中较为常见的一种是利用分布式注册中心,解决服务之间协调的问题。
在众多注册中心应用中,Zookeeper 是较为常见和常用的一款程序,这里我们就以 Zookeeper 为例,介绍如何使用 Docker 搭建 Zookeeper 的运行环境。
设计目录结构由于 Zookeeper 的运行并不需要太多的关注配置和调整,这里我们就以最基础的形式来设计 Docker Compose 项目的结构。
123456└─ project ├─ bin │ └─ compose.sh └─ compose └─ docker-compose.yml
为了方便日常操作,我们依然编写了 compose.sh 这个脚本来辅助我们控制 Docker Compose 项目。
编写 ...
无题
搭建 Java Web 项目运行环境Java Web 泛指以 Java 程序为基础向外提供 Web 服务的技术及相关工具,狭义上来说,我们也可以说 Java Web 是由 Servlet 程序提供的 Web 服务。 对我们而言,Tomcat 无疑是最常见的 Servlet 容器,所以在这个小节里,我们来搭建一个以 Tomcat 为核心的 Web 应用运行环境。 在这个环境中,我们还要组合进 MySQL 作为数据存储,Redis 作为 KV 存储。
定义项目结构与之前我们提及的一样,要搭建这样的由多个程序所协作组成的开发环境,使用 Docker Compose 是最佳的选择。
建立 Docker Compose 项目之前,我们先来规划一下项目的目录结构。 在开发过程中,我们倾向于将与项目有关的内容集合到同一个文件夹下,这样的做有几点好处:
项目内容清晰明确,复制、迁移和与他人共享的过程中,不会发生遗漏的情况;
在定义 Docker Compose 项目时可以使用相对路径,让共享、迁移后整个项目可以不需要额外操作就能运行。
在这些的基础上,我给出一个建议性的目录结构,供大家参考。
12 ...
无题
使用 Docker Hub 中的镜像自己编写 Dockerfile 能够很好的实现我们想要的程序运行环境,不过如果装有我们想要环境的镜像已经由热心的开发者构建好并共享在 Docker Hub 上,直接使用它们就会远比自己编写 Dockerfile 并进行构建要来的简单的多了。事实上,在开发过程中我们用到的镜像大部分还是直接采用 Docker Hub 中已经存在的镜像的,即使自己编写 Dockerfile,也只是对已有镜像进行简单的改动,很少会从零开始搭建镜像。在这一节中,我们要来看看如何更好地使用 Docker Hub 上由其他开发者共享的镜像。
选择镜像与程序版本由于 Docker 的容器设计是程序即容器的,所以组成我们服务系统的多个程序一般会搭建在多个容器里,互相之间协作提供服务。例如一套最简单的 Web 服务,我们可能会需要 Java 容器来运行基于 Spring Boot 的程序,需要 MySQL 容器来提供数据库支持,需要 Redis 容器来作为高速 KV 存储等等。装有这些程序的镜像我们都可以很容易的在 Docker Hub 上找到并直接使用,但在我们使用前,光选择镜像还是 ...
无题
保存和共享镜像让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用。通过将容器打包成镜像,再利用体积远小于其他虚拟化软件的 Docker 镜像,我们可以更快的将它们复制到其他的机器上。在这一节中,我们就专门来谈谈如何进行这样的迁移。
提交容器更改之前我们已经介绍过了,Docker 镜像的本质是多个基于 UnionFS 的镜像层依次挂载的结果,而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。
基于这样的结构,Docker 中为我们提供了将容器中的这个可读可写的沙盒环境持久化为一个镜像层的方法。更浅显的说,就是我们能够很轻松的在 Docker 里将容器内的修改记录下来,保存为一个新的镜像。
将容器修改的内容保存为镜像的命令是 docker commit,由于镜像的结构很像代码仓库里的修改记录,而记录容器修改的过程又像是在提交代码,所以这里我们更形象的称之为提交容器的更改。
123$ sudo docker commit webappsha256:0bc42f7ff218029 ...
无题
常见 Dockerfile 使用技巧在掌握 Dockerfile 的基本使用方法后,我们再来了解一些在开发中使用 Dockerfile 的技巧。这一小节的展现方式与之前的略有不同,其主要来自阅读收集和我自身在使用中的最佳实践。也许这里面介绍的不是最为标准或是合乎规范的方式,但一定是能够直接帮助大家在开发中使用 Docker 提升生产力的方式。下面就让我们来看看这些关于 Dockerfile 的使用技巧吧。
构建中使用变量在实际编写 Dockerfile 时,与搭建环境相关的指令会是其中占有大部分比例的指令。在搭建程序所需运行环境时,难免涉及到一些可变量,例如依赖软件的版本,编译的参数等等。我们可以直接将这些数据写入到 Dockerfile 中完全没有问题,有问题的是这些可变量我们会经常调整,在调整时就需要我们到 Dockerfile 中找到它们并进行更改,如果只是简单的 Dockerfile 文件尚且好说,但如果是相对复杂或是存在多处变量的 Dockerfile 文件,这个工作就变得繁琐而让人烦躁了。
在 Dockerfile 里,我们可以用 ARG 指令来建立一个参数变量,我们可以在 ...
无题
通过 Dockerfile 创建镜像由于 Docker 镜像的结构优势,使它的占用空间远小于普通的虚拟机镜像,而这就大幅减少了 Docker 镜像在网络或者其他介质中转移所花费的时间,进而提高了我们进行迁移部署的效率。不过,你要是以为这就是 Docker 能够快速部署的终极大招那就大错特错了。在这一小节里,我们将谈到 Docker 特有的镜像构建定义文件,也就是 Dockerfile。通过了解它,你能真正体验一种进行秒级镜像迁移的乐趣。
关于 DockerfileDockerfile 是 Docker 中用于定义镜像自动化构建流程的配置文件,在 Dockerfile 中,包含了构建镜像过程中需要执行的命令和其他操作。通过 Dockerfile 我们可以更加清晰、明确的给定 Docker 镜像的制作过程,而由于其仅是简单、小体积的文件,在网络等其他介质中传递的速度极快,能够更快的帮助我们实现容器迁移和集群部署。
通常来说,我们对 Dockerfile 的定义就是针对一个名为 Dockerfile 的文件,其虽然没有扩展名,但本质就是一个文本文件,所以我们可以通过常见的文本编辑器或者 I ...
无题
百尺竿头,更进一步在这本小册里,我们从 Docker 最基础的知识谈起,介绍了 Docker 的核心组成部分以及操作这些功能的命令与方法,其后又讲解了开发中最常用的 Docker Compose,并完整的展示了通过它们搭建开发环境的过程。
然而 Docker 的生态太过丰富,不仅是 Docker 相关的知识浩如烟海,就连开发中所能使用到的技巧也不可胜数。虽然我尽心总结,但这本小册里肯定还存在许多欠缺和匮乏之处。
好在小册的结构经过我精心编排,形成了一条有逻辑的脉络,这能够帮助大家由浅入深的逐步掌握 Docker 及其与它相关的知识。
大家可以在阅读每一小节后,对其中仍有疑惑之处,可以直接加入到这本小册的微信群中,直接向大家提问并参与我们的交流。同时,如果你在开发中还有对工作效率或其他方面有提高的 Docker 使用经验技巧,也欢迎加入到微信群中,与大家分享。
另外,大家可以通过留言或在微信群中提问的方式,说出你还想了解的知识点或使用技巧,在这本小册后面,我会选择大家比较关注的一些知识或问题专门开辟篇幅进行讲解。
知识延伸在小册里我们谈到了很多关于 docker 命令和 docker-c ...
无题
使用 Docker Compose 管理容器通过之前的介绍,我们已经基本掌握了构建、运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能组成的。虽然我们之前提到了容器间互相连接、交换数据的各种方法,通过这些方法足以搭建起完整的用于应用系统运行的容器群,但是这显然还不够,这个容器群的搭建需要执行太多命令,更重要的是需要考虑太多应用和容器间的依赖关系处理,是一波令人头大的操作。在这一节中,我们就来介绍如何解决这些问题。
解决容器管理问题拿任何一个相对完整的应用系统来说,都不可能是由一个程序独立支撑的,而对于使用 Docker 来部署的分布式计算服务更是这样。随着时代的发展和技术演进,我们越来越推崇将大型服务拆分成较小的微服务,分别部署到独立的机器或容器中。也就是说,我们的应用系统往往由数十个甚至上百个应用程序或微服务组成。即使是一个小的微服务模块,通常都需要多个应用协作完成工作。
我们编写一个小型的微服务模块,虽然我们编写代码主要针对的是其中的应用部分,但如果我们要完整的进行开发、测试,与应用相关的 ...
