Docker容器入门
Docker容器中已经包含了内置应用的所有以来,所以用户不必再去考虑需要什么版本的Java、Apache或其他什么东西,因为这些东西已经被镜像的制作者打包进去了。除此之外,容器通常是不包括应用相关的配置文件的,这主要是因为容器的内部是“无状态”和“一成不变”的。换句话说,容器创建后最好不要修改容器内的文件。
[!NOTE]
其实确切来说并非是容器内的文件不能修改,而是改了也没用。即使进入容器内部修改了某个文件,当想要修改环境变量、卷、端口等设置时,容器就会恢复到最初镜像里的内容,导致修改了也没用。除非这个容器一直能良好运行,但这个谁又能保证呢?
如果真的需要修改容器内的某个依赖或者配置,可以使用
docker commit
重新提交成镜像,或者干脆用Dockerfile重新构建一个新的镜像。
我都需要了解哪些内容?
如果仅是上手,不需要了解太多。只要了解一些用于执行复杂操作和排除故障的术语和概念就行了,但如果要入门就没这么简单了。
docker run hello-world
就这简单的一句命令,你便已经运行了你的第一个容器(当然前提是你已经安装了docker)。Docker容器最大的优势就是,您不必知道容器内的程序是如何运行的只要这么一句命令就可以运行它。虽然 hello-world
只是一个很简单的样例,但试想一下如果你需要在同一台服务器上,完美运行两个依赖于不同版本的Java、Python的应用。这将是一件多么让人头大的事儿,如果没丰富的经验很可能就玩脱了。幸运的是,在容器的世界里这两个应用即使依赖再冲突,他们也是相互隔绝的、互不干扰的。
[!TIP]
下面的内容也可以通过查看 关于Docker的几点常识 这篇文章来理解。
关键术语
了解下面这些术语可能会有助于你是用容器:
- docker - 第一也是最流行的容器runtime
- container - 运行在内存中的隔离沙盒,是镜像的运行状态
- image - 可以理解为可以被docker运行的预先构建的系统镜像
- volume - 用于在容器隔离沙盒外保存数据的地方
- environment - 可用于配置容器隔离沙盒内环境变量的方法
关键概念
容器是完全由Linux内核创建的隔离沙盒环境。你也可以理解为这是虚拟机(虽然实际上他们两者并不相同)。Linux内核通过控制组(cgroups)控制对各种系统资源的访问。而我们则依靠docker来将这些复杂的概念转换为用户可以理解和使用的简单概念。
在默认情况下,正在运行的容器和系统环境是完全隔离的,如果你在容器内运行了一个web服务器,外界是无法访问容器内80和443的端口。除非我们使用 -p
来把容器内的端口映射到宿主机上。
[!WARNING]
例子中使用的 linuxserver/letsencrypt 镜像已经被 linuxserver/swag 替代,但不影响演示。
docker run -d --name=letsencrypt -p 80:80 -p 443:443 linuxserver/letsencrypt
了解上面这些关于端口(ports)、卷(volumes)、环境变量(environment)等概念将有助于通过docker部署一个可以运行的应用。对于我们开发者来说,这也能让有问题的容器与你的系统隔绝开来,不影响系统上的其他应用程式,这个容器出问题了,我们换下一个就可以。
容器是一个通过隔离沙盒安全地运行程序的绝妙方式。