安装Docker
Docker
软件包已经包括在默认的 CentOS-Extras
软件源里。因此想要安装 docker
,只需要运行下面的 yum
命令
$ sudo yum install docker
当然在测试或开发环境中 Docker
官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS
系统上可以使用这套脚本安装:
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh
具体可以参看 docker-install
的脚本:
https://github.com/docker/docker-install
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE
的 Edge
版本安装在系统中。
安装完成后,运行下面的命令,验证是否安装成功:
docker version or docker info
返回docker的版本相关信息,证明 docker
安装成功
启动Docker-CE
$ sudo systemctl enable docker $ sudo systemctl start docker
Docker的简单运用---Hello World
由于服务器日常崩溃了, docker
出了点问题,所以以下案例的演示是基于 Kali Linux
环境下进行的。
我们通过最简单的 image
文件 hello world
,感受一下 Docker
的魅力吧!
我们直接运行下面的命令,将名为 hello-world
的 image
文件从仓库抓取到本地。
docker pull library/hello-world
docker pull images
是抓取 image
文件, library/hello-world
是 image
文件在仓库里面的位置,其中 library
是 image
文件所在的组, hello-world
是 image
文件的名字。
抓取成功以后,就可以在本机看到这个 image
文件了。
docker images
我们可以看到如下结果:
现在,我们可以运行 hello-world
这个 image
文件
docker run hello-world
我们可以看到如下结果:
输出这段提示以后,hello world
就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。
是不是很 easy
呢?我们从上面可以看出, docker
的功能是十分强大的,除此之外,我们还可以拉去一些 Ubuntu
, Apache
等镜像,在未来的教程中我们将会一一提到。
Docker
提供了一套简单实用的命令来创建和更新镜像,我们可以通过网络直接下载一个已经创建好了的应用镜像,并通过 Docker RUN
命令就可以直接使用。当镜像通过 RUN
命令运行成功后,这个运行的镜像就是一个 Docker
容器啦,容器可以理解为一个轻量级的沙箱, Docker
利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker
镜像。
我们可以看看下面这幅图:
Docker
客户端是 Docker
用户与 Docker
交互的主要方式。当您使用 docker
命令行运行命令时, Docker
客户端将这些命令发送给服务器端,服务端将执行这些命令。 docker
命令使用 docker API
。 Docker
客户端可以与多个服务端进行通信。
我们将剖析一下 Docker
容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了。
Docker架构
在上面的学习中,我们简单地讲解了Docker的基本架构。了解到了Docker
使用的是 C/S
结构,即客户端/服务器体系结构。明白了 Docker
客户端与 Docker
服务器进行交互时, Docker
服务端负责构建、运行和分发 Docker
镜像。 也知道了Docker
客户端和服务端可以运行在一台机器上,可以通过 RESTful
、 stock
或网络接口与远程 Docker
服务端进行通信。
我们从下图可以很直观的了解到Docker的架构:
Docker
的核心组件包括:
- Docker Client
- Docker daemon
- Docker Image
- Docker Registry
- Docker Container
Docker
采用的是 Client/Server
架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host
上,客户端也可以通过 socket
或 REST API
与远程的服务器通信。可能很多朋友暂时不太理解一些东西,比如 REST API
是什么东西等,不过没关系,在后面的文章中会一一给大家讲解清楚。
Docker Client
Docker Client
,也称 Docker
客户端。它其实就是 Docker
提供命令行界面 (CLI)
工具,是许多 Docker
用户与 Docker
进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host
进行交互。最常用的 Docker
客户端就是 docker
命令,我们可以通过 docker
命令很方便地在 host
上构建和运行 docker
容器。
Docker daemon
Docker daemon
是服务器组件,以 Linux
后台服务的方式运行,是 Docker
最核心的后台进程,我们也把它称为守护进程。它负责响应来自 Docker Client
的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server
,负责接收由 Docker Client
发送的请求,接收到的请求将通过Docker daemon
内部的一个路由分发调度,由具体的函数来执行请求。
我们大致可以将其分为以下三部分:
- Docker Server
- Engine
- Job
Docker Daemon的架构如下所示:
Docker Daemon
可以认为是通过 Docker Server
模块接受 Docker Client
的请求,并在 Engine
中处理请求,然后根据请求类型,创建出指定的 Job
并运行。 Docker Daemon
运行在 Docker host
上,负责创建、运行、监控容器,构建、存储镜像。
运行过程的作用有以下几种可能:
- 向
Docker Registry
获取镜像 - 通过
graphdriver
执行容器镜像的本地化操作 - 通过
networkdriver
执行容器网络环境的配置 - 通过
execdriver
执行容器内部运行的执行工作
由于 Docker Daemon
和 Docker Client
的启动都是通过可执行文件 docker
来完成的,因此两者的启动流程非常相似。 Docker
可执行文件运行时,运行代码通过不同的命令行 flag
参数,区分两者,并最终运行两者各自相应的部分。
启动 Docker Daemon
时,一般可以使用以下命令来完成
docker --daemon = true docker –d docker –d = true
再由 docker
的 main()
函数来解析以上命令的相应 flag
参数,并最终完成 Docker Daemon
的启动。
下图可以很直观地看到 Docker Daemon
的启动流程:
默认配置下, Docker daemon
只能响应来自本地 Host
的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP
监听。我们可以照着如下步骤进行配置:
1、编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service
,在环境变量 ExecStart
后面添加 -H tcp://0.0.0.0
,允许来自任意 IP 的客户端连接。
2、重启 Docker daemon
systemctl daemon-reload systemctl restart docker.service
3、我们通过以下命令即可实现与远程服务器通信
docker -H 服务器IP地址 info
-H
是用来指定服务器主机, info
子命令用于查看 Docker
服务器的信息
Docker Image
Docker
镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker
镜像看成只读模板,通过它可以创建 Docker
容器。
镜像有多种生成方法:
- 从无到有开始创建镜像
- 下载并使用别人创建好的现成的镜像
- 在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile
,通过执行 docker build <docker-file>
命令可以构建出 Docker 镜像,在后续的教程中,我们会用一篇专门讨论这个问题。
Docker Registry
Docker registry
是存储 docker image
的仓库,它在 docker
生态环境中的位置如下图所示:
运行docker push
、docker pull
、docker search
时,实际上是通过 docker daemon
与 docker registry
通信。
Docker Container
Docker
容器就是 Docker
镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。 Docker Container
提供了系统硬件环境,我们可以使用 Docker Images
这些制作好的系统盘,再加上我们所编写好的项目代码, run
一下就可以提供服务啦。
Docker组件是如何协作运行容器
看到这里,我相信各位读者朋友们应该已经对Docker基础架构已经熟悉的差不多了,我们还记得运行的第一个容器吗?现在我们再通过hello-world这个例子来体会一下 Docker
各个组件是如何协作的。
容器启动过程如下:
Docker
客户端执行docker run
命令Docker daemon
发现本地没有hello-world
镜像daemon
从Docker Hub
下载镜像- 下载完成,镜像
hello-world
被保存到本地 Docker daemon
启动容器
具体过程可以看如下这幅演示图:
我们可以通过docker images
可以查看到 hello-world
已经下载到本地
我们可以通过docker ps
或者 docker container ls
显示正在运行的容器,我们可以看到, hello-world
在输出提示信息以后就会停止运行,容器自动终止,所以我们在查看的时候没有发现有容器在运行。
我们把 Docker
容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker
组件协作运行容器可以分为以下几个过程:
Docker
客户端执行docker run
命令Docker daemon
发现本地没有我们需要的镜像daemon
从Docker Hub
下载镜像- 下载完成后,镜像被保存到本地
Docker daemon
启动容器
了解了这些过程以后,我们再来理解这些命令就不会觉得很突兀了,下面我来给大家讲讲 Docker
常用的一些命令操作吧。