1.简介
1.1 什么是Docker?
我们首先来看维基百科对Docker的定义:
- 一个开源项目,能够自动的在容器部署应用。
- 通过在Linux上提供额外的抽象层和操作系统级别的虚拟化来实现。
哇!Docker 是这样的一个工具,能够使开发者、系统管理员方便的在类似于沙盒的装置中运行程序。这个沙盒也叫做容器,能够运行在本地的操作系统上,比如Linux等。Docker最大的好处呢,就是可以让用户能够将应用程序以及应用程序的依赖打包成一个标准的格式。与虚拟机不同的是,容器的开销小,因此能够高效的的使用底层系统和资源。
1.2 什么是容器?
如今的工业标准是使用虚拟机器来运行应用程序,虚拟机器在客户端操作系统运行应用程序。客户端操作系统运行在服务端操作系统提供的虚拟硬件上。
总的来,虚拟机器为应用程序提供了进程间的隔离,但同时带来了较大开销。而容器采取了不同的措施,通过利用低级别的主机操作系统资源实现了大多数的隔离。
1.3 为什么使用容器?
- 容器提供了逻辑上的打包机制,使得应用程序从运行环境中分离出来。这样就能够方便的在不同的运行环境中运行。
- 容器可以实现对资源更加精细的控制,从而提高基础架构的效率,提高计算资源的利用率。
得益于容器的上述优点,容器大规模的应用。如图是Docker的Google 趋势。
1.4 这篇文章能教会你什么?
这篇文章是Docker的一个入门指南。你将会学习:
* 揭开Docker神秘的面纱
* 构建以及发布你的第一个Docker
* 使用Amazon Web Service 发布一个静态网站。
* 发布两个动态网站(涉及到Elastic Search的使用)
2. 开始上手吧
所有的代码,你都可以在 Github repo找到。
这篇文章用到的是 Docker 18.05.0-ce
2.1 首先要知道的
这篇文章不需要任何先修知识,如果你了解以下这些就再好不过了。
- Amzon Web Service
- Docker Hub
2.2 准备你的电脑
- 首先安装好环境。Docker提供了简易的安装方式,你可以选择喜欢的操作系统进行安装。
- Mac
- Linux
- Windows
安装结束之后,当然是运行以下最熟悉的hello world 了。
$ docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
3. 从Hello World 开始
3.1 和BusyBox愉快的玩耍吧
准备工作做好了之后呢,现在我们要在系统中运行一个BusyBox的容器了。
首先我们先在终端中运行下面的命令。
$ docker pull busybox
或许你会碰到 permission denied,如果是在Mac OS 上,确保你的Docker 已经正在运行。如果是在Linux上,你在docker命令前添加 sudo。
pull命令将会从Docker registry中拿到busybox的镜像,然后保存本地系统中。你可以使用 docker images 命令来查看本地的所有镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest c51f86c28340 4 weeks ago 1.109 MB
3.2 让你的的Docker跑起来
现在可以运行在上面镜像的基础上运行一个容器。
$ docker run busybox
$
你将不会看到任何输出,这会不会是一个bug呢? 其实不是呢,在运行run命令的后面有一系列的操作。
* 首先Docker 客户端找到busybox这个镜像。
* 加载容器,在容器中运行命令。
我们运行 docker run busybox 的时候,并没有提供额外的命令,所以容器启动后,运行一个空命令就退出了。下面我们来试试不同的玩法。
$ docker run busybox echo "hello from busybox"
hello from busybox
这次我们终于看到输出了,Docker 客户端在busybox容器中运行了echo命令然后就退出了。如你所见,上述操作的执行很快,假设上述操作是在虚拟机中执行的话,可想而知会有多慢。
现在我们来运行以下 docker ps 命令,来查看正在运行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
我们看到没有正在运行的容器,我们再试一个命令, docker ps -a。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305297d7a235 busybox "uptime" 11 minutes ago Exited (0) 11 minutes ago distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 minutes ago Exited (0) 12 minutes ago elated_ramanujan
14e5bd11d164 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago thirsty_euclid
我们可以看到曾经运行过的所有容器,这次的运行结果多了一个STATUS 列,显示这些容器在几分钟前退出了。
你也许想知道如何怎样才能够运行多个命令。
$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
在run命令之后加上-it参数,使得我们能够在容器中使用交互式的tty。这样我们就可以在容器中运行更多的命令了。
危险地带。当你想要在容器中运行 rm -rf bin 的时候,请确保是在容器中运行上述命令而不是在你的电脑或者笔记本上。不然的话,会带来很严重的后果哦��。
如果你想要知道docker run 的更多用法,请使用 docker run –help 查看更多的参数。
在继续进行之前,我们快速的学习一下,如何删除容器。你可以使用 docker rm {容器的Id} 来删除指定的容器。你可以使用 docker ps -a 来获取 容器的id。
$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9
容器删除成功之后,会显示被删除的容器的id。
如果想要删除所有的容器呢,使用下面的命令。
$ docker rm $(docker ps -a -q -f status=exited)
-q 表示只返回容器的IDS, -f 表示筛选条件,这里用到了status=exited,表示只删除已经退出的容器。
在最新版的Docker中,你可以使用docker container prune 实现同样的效果。
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360
Total reclaimed space: 212 B
你也可以使用docker rmi 删除不再使用的镜像。
3.3 Docker里面专门的术语
- Images 镜像 - 构建容器基础的蓝图。在文章中我们使用docker pull 命令去下载busybox镜像。
- Containers 容器 - 从Docker镜像中诞生,运行应用程序。我们使用docker run 命令来生成一个容器,使用docker ps 命令查看正在运行的容器。
- Docker Daemon Docker守护进程 - 运行在主机上的后台服务,用于构建,运行,分发Docker容器。Docker Daemon是运行在操作系统上的进程,Docker客户端与之进行交互。
- Docker Client Docker 客户端 - 命令行工具,使得用户能够和daemon进行交互。也有其他GUI形式的客户端,例如Kitematic。
- Docker Hub - Docker镜像的注册中心。你可以把它想像成存放许多镜像的一个目录。如果需要的话,你可以构建自己的私有镜像注册中心。