Docker入门教程
Docker入门教程
Docker入门教程
Docker 入门教程
作者: 阮一峰
日期: 2018年2月 9日
一、环境配置的难题
软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的
软件,能在那些机器跑起来?
用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运
行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可
能还要配置环境变量。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 1/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以
跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解
决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
二、虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行
另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为
虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要
了就删掉,对其他部分毫无影响。
虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕
虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运
行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
三、Linux 容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux
Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外
面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与
底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 2/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器
相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避
免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件
要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
四、Docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的
Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚
拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就
不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容
器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
五、Docker 的用途
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建
的环境。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 3/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
六、Docker 的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和
企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用
不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
Mac
Windows
Ubuntu
Debian
CentOS
Fedora
其他 Linux 发行版
安装完成后,运行下面的命令,验证是否安装成功。
$ docker version
# 或者
$ docker info
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 4/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
六、image 文件
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成
Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实
例。同一个 image 文件,可以生成多个同时运行的容器实例。
# 删除 image 文件
$ docker image rm [imageName]
七、实例:hello world
下面,我们通过最简单的 image 文件"hello world",感受一下 Docker。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 5/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
$ docker image ls
如果运行成功,你会在屏幕上读到下面的输出。
... ...
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 6/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
八、容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生
成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,
只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
九、Dockerfile 文件
学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?如果你要推广自
己的软件,势必要自己制作 image 文件。
十、实例:制作自己的 Docker 容器
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 7/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
作为准备工作,请先下载源码。
10.1 编写 Dockerfile 文件
.git
node_modules
npm-debug.log
然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容。
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
上面代码一共五行,含义如下。
进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 8/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
10.2 创建 image 文件
$ docker image ls
10.3 生成容器
上面命令的各个参数含义如下:
会传入容器。
koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是
latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可
以使用 Shell。
如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 9/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
root@66d80f4aaf1e:/app#
# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls
# 停止指定的容器运行
$ docker container kill [containerID]
容器停止运行之后,并不会消失,用下面的命令删除容器文件。
# 查出容器的 ID
$ docker container ls --all
# 删除指定的容器文件
$ docker container rm [containerID]
10.4 CMD 命令
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 10/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
10.5 发布 image 文件
$ docker login
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 11/16
2018/8/9 Docker 入门教程 - 阮一峰的网络日志
十一、其他有用的命令
docker 的主要用法就是上面这些,此外还有几个命令,也非常有用。
(5)docker container cp
docker container cp 命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。
下面是拷贝到当前目录的写法。
(完)
文档信息
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
发表日期: 2018年2月 9日
更多内容: 档案 » 开发者手册
文集:《前方的路》,《未来世界的幸存者》
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 13/16