附录A 安装并使用Docker
本书中的技巧有时候需要创建文件,以及从GitHub克隆仓库。为了避免干扰,我们建议读者在需要工作空间的时候,为每个技巧单独创建一个新的空白文件夹。
对安装和使用Docker来说,Linux用户做起来相对容易,尽管在不同的Linux发行版之间可能具体的细节有很大不同。在这里我们就不列举各种不同的可能性了,建议读者查看最新的Docker文档:https://docs.docker.com/installation/。
尽管本书假设读者在使用一个Linux发行版(容器目前是基于Linux的,所以这样事情就简单了)。很多读者对于基于Windows或者OS X的机器的Docker工作非常感兴趣,对于这些读者值得一提的是,本书中的技巧仍然有效,只要是用下述方法中的一种来设置Docker守护进程的。
Windows Server即将迎来变化 微软公司承诺要支持Docker容器范型和管理接口。Windows Server将作出一些改变以允许创建基于Windows的容器。本书未来的版本可能会涉及这些内容,但是编写本书时还不能使用。
A.1 虚拟机的方式
在Windows或者Mac上使用Docker的一种途径就是安装一个完全的Linux虚拟机。一旦完成,就可以像使用任意原生Linux机器一样使用这台虚拟机。
达到这个目标最常见的方式是安装VirtualBox。参见http://virtualbox.org以获得相关的信息和安装指导。
A.2 连接到外部Docker服务器的Docker客户端
如果读者已经有一个设置为服务器的Docker守护进程,可以在Windows或者Mac上安装一个和它通信的原生客户端。注意要暴露的端口是在外部Docker服务器上暴露的,不是在本地机器上——可能需要变换IP地址以访问暴露出来的服务。
这一高级方法的本质见技巧1,让它更安全的细节见技巧86。
A.3 原生Docker客户端和虚拟机
一个常用的方式是,安装一个运行着Linux和Docker的最小虚拟机,再安装一个和虚拟机上的Docker通信的Docker客户端。使用这个方法的标准做法是使用Boot2Docker虚拟机,它使用了一个“小内核Linux”发行版来提供Docker守护进程可以作为服务器来运行的环境。
Windows上的Docker
Windows与Mac和Linux是差异很大的操作系统,所以这里多讨论一些细节,强调一些常见的问题和解决方式。读者应该按照https://docs.docker.com/engine/installation/windows/上的Docker Toolbox官方安装文档来进行,在这里我们只强调一些重要的部分。
在安装过程中,应该确保你检查了Docker Compose for Windows(在技巧68以及其他技巧中使用)以及Git for Windows。后者能让你可以使用git clone命令克隆整本书中提到的仓库,并且可以使用bash shell和一些Linux工具,如grep、sed和curl。它甚至附带了ssh和perl。本书全书的脚本都假设你在使用bash(或者类似的shell)并且这些工具可用,所以如果跟着做的话,从安装它们的过程中退出,使用Windows内置的shell或者Windows Powershell会造成一些问题。安装Kitematic Docker图形界面与否都可以——它可以让使用镜像变成简单的点击操作,你可能会觉得试一试也挺有趣的,但是本书不会涉及有关它的内容。
在安装过程中也应该选择Add Docker Binaries to PATH,这确保了你可以在终端中随时运行docker命令。
如果没有安装Oracle Virtualbox,Docker Toolbox会为你安装——你所有的容器都会在虚拟机内运行,因为Linux容器无法在Windows上原生运行。和A.1节讨论过的虚拟机的方式不同,由Docker Toolbox创建的虚拟机是非常轻量的,因为它只运行Docker,但是如果运行资源消耗大的程序,仍然要在VirtualBox接口设置中调整虚拟机的内存。
为了检查一切准备完毕,在程序列表里打开Docker Quickstart Terminal。如果运行着Docker的虚拟机没在运行的话,Docker Quickstart Terminal会把它启动并且设置好环境以便你可以立刻开始使用Docker。如果运行docker run hello-world,Docker会自动从Docker Hub拉下来hello-world镜像并且运行它。这个镜像的输出对刚才发生的和Docker客户端以及守护进程通信有关的步骤,给出了一个简单的说明。如果看不懂的话不用担心,在第2章中有后台运行原理的更多细节。
注意在Windows上有几件不可避免的怪事。
- 在卷的开头需要双斜杠,这在https://github.com/docker/docker/issues/12751有讨论。
- 因为容器是在虚拟机内运行的,如果想要从宿主机上访问暴露的端口,就需要在shell中使用
docker-machine ip default找到虚拟的IP来访问它(这在Windows的Docker安装指南中有涉及:https://docs.docker.com/engine/installation/windows/)。 - 一些没那么流行的工具可能不是简单地通过我们在技巧中的指示“使用包管理”就能获得的(例如,
socat最好通过Cygwin来获得),其他工具(例如,与Linux强相关的工具,像strace和用于ip addr的ip命令)可能不能在Windows上直接使用。
Cygwin是什么 Cygwin,可在https://www.cygwin.com/获得,是一个在Windows上可用的LInux工具的合集。如果想要一个可以在Windows上实验的类Linux环境,Cygwin应该是首屈一指的。它自带一个包管理器,以便用户可以看一下可用软件里有哪些可用。
以下是对Window上一些命令和组件有用的替代品的简表,但是要铭记其中的一些并不是完美的替代品。本书着眼于使用Docker来运行Linux容器,所以更合理的是用一个完全的Linux发行版(不管是臃肿的虚拟机、云中的一个环境还是本地的安装)来试验Docker的完全潜力。
ip addr——我们一般在本书中使用这条命令来找到在本地网络中我们的机器的IP。Windows的等价命令是ipconfig。strace——见技巧97中讨论的“类宿主机的容器”以了解如何绕过Docker容器化来在运行Docker的虚拟机中获得类宿主机的权限。你可能想启动shell而不是运行chroot,比起BusyBox你可能更想使用如同Ubuntu那样的带有包管理的Linux发行版。然后你就可以好像在宿主机上那样安装并运行命令。这条技巧适用于很多命令,并且可以让你的Docker虚拟机几乎和功能齐全的虚拟机一样。- 向宿主机暴露端口——安装Cygwin并且从包列表中安装
socat。需要从程序列表中启动Cygwin命令行以使用这些工具。要使用socat来转发端口,为宿主机外提供访问,可以使用socat TCP-LISTEN:$PORT,reuseaddr,fork TCP:$DOCKERIP:$PORT,其中$PORT是想要转发的端口,$DOCKERIP是在Docker终端中的docker-machine ip default的输出。
Windows上的图形应用程序
在Windows上运行Linux图形工具很有挑战性——不仅需要让所有这些代码都在Windows上工作,还需要决定如何展示。Linux上使用的窗口系统(称为X Window System或者X11)并不适用于Windows。幸运的是,X允许通过网络显示应用程序窗口,所以可以使用Windows上的X实现来显示Docker容器中运行的应用程序。
Windows上有数个不同的 X 实现,我们仅介绍可以用Cygwin获得的安装版。你应该遵循http://x.cygwin.com/docs/ug/setup.html#setup-cygwin-x-installing上的官方文档。当选择要安装的包时候,必须确保xorg-server、xinit和xhost被选中。
一旦安装完成,就可以打开Cygwin终端然后运行XWin :0 -listen tcp -multiwindow。它会在你的Windows机器上启动一个X服务器,它有监听来自网络的连接(-listen tcp)以及在自己的窗口内显示每个应用程序(-multiwindow)的能力,而不是就一个显示应用程序的虚拟屏幕的单个窗口。一旦启动,读者就应该在系统的托盘区看到一个X图标。
授权问题 虽然这个X服务器可以监听网络,但目前它只信任本地机器。在目前我们见过的案例里,这允许来自Docker虚拟机的访问,但是如果有授权问题,你可以试着运行不安全的
xhost+命令来允许来自所有机器的访问。如果这么做了,一定要确保防火墙设置了拒绝来自网络的任何连接企图。
是时候试用X服务器了!使用ipconfig找到本地机器的IP地址。你想要查找VirtualBox Host-Only的网络适配器的IP地址——Docker虚拟机收到的你的宿主机IP地址。如果你有很多这样的适配器,可能要挨个试试。启动第一个图形应用程序应该就像在Docker Quickstart Terminal运行docker run -e DISPLAY=$MY_IP:0 —rm fr3nd/xeyes一样简单,$MY_IP就是之前描述的适配器的IP地址。
A.4 获得帮助
如果读者运行在一个非Linux操作系统上并且想要获得进一步的帮助或者建议,Docker文档(https://docks.docker.com/installation/)中有官方对Windows和Mac用户的最新的官方建议。
