Docker 实战(一)核心概念及常用命令

一、前言

近期因为产品方案尚未确定,有些许空闲时间调研下火了挺久的容器技术 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
运行密度 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移性 优秀 一般

WX20200531-180746.png


三、核心概念

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

④ 之后安装 Docker

1
yum install -y docker-ce

⑤ 最后确认 Docker 服务启动正常,并设置成开机启动

1
2
3
systemctl 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 可以看到如下界面:
WX20200531-162958@2x.png

5.2 列出容器

1
docker ps

使用 docker ps 命令即可列出运行中的容器。得到类似如下的表格。

1
2
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS                               NAMES
5e2ab762027d nginx "nginx -g 'daemon of…" 33 seconds ago Up 31 seconds 0.0.0.0:91->80/tcp gifted_cray

该表格包含七列,各列含义如下:

  • CONTAINER ID:容器 ID
  • IMAGE:镜像名称
  • COMMAND:启动容器时运行的命令
  • CREATED:容器的创建时间
  • STATUS:容器的运行状态
  • PORTS:容器对外端口号
  • NAMES:容器名称,默认由 Docker 自动生成

5.3 查看容器日志

1
docker logs CONTAINER

该命令可以查看容器的输出信息

使用 docker logs 5e2ab762027d 命令可以看到我们刚才浏览器访问 Nginx 的日志

1
2
3
122.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 部署。