一、前言
近期因为产品方案尚未确定,有些许空闲时间调研下火了挺久的容器技术 Docker
。
二、初识 Docker
如果说主机时代比拼的是单个服务器物理性能(如 CPU 主频和内存)的强弱,那么在云时代,最为看重的则是凭借虚拟化技术所构建的集群处理能力。
2.1 虚拟化及容器技术
在计算机领域,虚拟化一般指的是「计算机虚拟化」或「服务器虚拟化」。维基百科上的定义如下:
在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割障碍,使用户可以用比原本的组态更好的方式来应用这些资源。
言而简之,虚拟机的核心是对资源的抽象
,目标是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源利用率
。
其发展历程大致如下:
- 20 世纪 60 年代 IBM 推出大型主机虚拟化
- 以 Xen、KVM 为代表的虚拟机虚拟化
- 以 Docker 为代表的容器技术
传统来看,虚拟化既可以通过硬件模拟来实现,也可以通过操作系统软件来实现。而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。
2.2 Docker 在开发和运维中的优势
在开发和运维过程中,Docker 具有如下几个方面的优势:
- 更快速的交付和部署。开发人员可以使用镜像快速构建一套标准的开发环境。
- 更高效的资源利用。Docker 是内核级虚拟化,运行容器时不需要额外的虚拟化管理程序的支持,对资源的额外需求很低,性能与传统虚拟机方式相比要提高 1~2 个数量级。
- 更轻松的迁移和扩展。Docker 容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。
- 更简单的更新管理。使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作,且所有修改都以增量的方式被分发和更新。
2.3 Docker 与虚拟机比较
虚拟机方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。而 Docker 容器是在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为 MB | 一般为 GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
三、核心概念
Docker 三大核心概念:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
3.1 Docker 镜像
Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。镜像是创建 Docker 容器的基础。
3.2 Docker 容器
Docker 容器类似于一个轻量级沙箱,它是从镜像创建的应用运行实例,可以启动、开始、停止、删除。容器彼此相互隔离、互不可见。
3.3 Docker 仓库
Docker 仓库类似于代码仓库,是 Docker 集中存放镜像文件的场所。可以分为公开仓库(Public)和私有仓库(Private)两种形式。
Docker 利用仓库管理镜像的设计理念与 Git 代码仓库的概念非常相似,设计上借鉴了 Git 的很多优秀思想。
四、CentOS 环境下安装 Docker
大致了解 Docker 的核心概念后,我们先在服务器上安装 Docker 进行实操。
本文实操时以下命令均以 root 用户操作,非 root 用户需要在命令前加 sudo
① 首先,如果是新服务器,先升级下软件和系统内核1
yum update
② 随后为了方便添加软件源,以及支持 devicemapper 存储类型,安装如下软件包:1
yum install -y yum-utils device-mapper-persistant-data lvm2
③ 然后添加 Docker 稳定版本的 yum 软件源1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
④ 之后安装 Docker1
yum install -y docker-ce
⑤ 最后确认 Docker 服务启动正常,并设置成开机启动1
2
3systemctl start docker
systemctl status docker
systemctl enable docker
五、Docker 常用命令
安装完 Docker 后,我们通过创建一个 Nginx 容器来熟悉一些常用命令。
5.1 新建并启动容器
1 | docker run |
该命令等价于先执行 docker create 命令,再执行 docker start 命令。
当使用 docker run 来创建并启动容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从网桥的地址池中配置一个 IP 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
示例:1
docker run -d -p 91:80 nginx
新建并启动一个 Nginx 容器,-d 代表后台运行,-p 代表端口映射,将 Nginx 容器默认的 80 端口映射到宿主主机的 91 端口。
访问 http://宿主主机IP:91 可以看到如下界面:
5.2 列出容器
1 | docker ps |
使用 docker ps 命令即可列出运行中的容器。得到类似如下的表格。
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
该表格包含七列,各列含义如下:
- CONTAINER ID:容器 ID
- IMAGE:镜像名称
- COMMAND:启动容器时运行的命令
- CREATED:容器的创建时间
- STATUS:容器的运行状态
- PORTS:容器对外端口号
- NAMES:容器名称,默认由 Docker 自动生成
5.3 查看容器日志
1 | docker logs CONTAINER |
该命令可以查看容器的输出信息
使用 docker logs 5e2ab762027d 命令可以看到我们刚才浏览器访问 Nginx 的日志1
2
3122.224.128.14 - - [31/May/2020:08:23:43 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
122.224.128.14 - - [31/May/2020:08:23:43 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://127.0.0.1:91/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
2020/05/31 08:23:43 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 122.224.128.14, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "127.0.0.1:91", referrer: "http://127.0.0.1:91/"
5.4 进入容器
从 1.3.0 版本起,Docker 提供了一个比 attach 命令更方便的 exec
命令,可以在运行中的容器内直接执行任意命令。1
docker exec -it CONTAINER bash
该命令会进入容器并启动一个伪终端,
-it
参数用来分配一个伪终端绑定到容器的标准输入上,并保持标准输入打开。
5.5 其他
命令行 | 含义 |
---|---|
docker stop CONTAINER | 停止容器 |
docker restart CONTAINER | 重启容器 |
docker rm CONTAINER | 删除容器 |
六、结语
本篇主要介绍了 Docker 的一些核心概念以及常用命令,下一篇会介绍如何使用 Docker 运行常见的 Web 服务器(包括 Nginx、Tomcat)等,以及一些常见应用(包括 MySQL、Redis)等,并将此前 Spring Boot 系列搭建的 demo 项目也使用 Docker 部署。