Docker是虚拟化容器引擎中非常重要的一员。现在让我们开始学习Docker。
1.1 为什么需要容器技术
1、面临的问题
在项目迭代开发和部署过程中,运维人员不可避免会遇到这些情况:同样的代码需要被部署到不同的运行环境中;由于运行环境不同导致项目部署失败,无法正常运行。
导致上述问题的原因可能不同。下面列举几种比较典型的原因。
- 运行环境发生了变化。例如,在开发阶段,代码是运行在程序员的本地环境或测试环境中的;而在生产环境中,代码则被切换到集群环境或云平台上了。
- 代码的依赖发生了变化。例如,在开发阶段使用的是 JDK 1.7,而在生产环境中使用的是JDK 1.8。
- 操作系统发生了变化。例如:在开发阶段使用的是Redhat Linux,而在生产环境中使用的是CentOS。
- 随着系统架构不断变复杂,微服务架构得到了广泛的应用,这就要求每个功能模块需要单独进行部署。图1-1展示了一个典型的微服务架构。
图 1-1
这些问题都会对参与项目的人员造成以下影响。
- 对于开发人员而言,除需要关注业务代码本身的实现外,还需要额外花费精力去处理这种底层执行环境的问题。
- 对于运维人员而言,需要考虑如何将开发人员新开发的业务代码不断集成与发布。
有没有一种办法能使得开发人员和运维人员只要关注他们需要关注的问题,而不需要关注其他的问题呢?答案是有的——使用虚拟化容器技术。
有了虚拟化容器技术,开发人员在业务开发过程中只需要关注业务代码的实现;而运维人员也可以很方便地实现项目的持续集成与持续发布( CI/CD)。Docker是虚拟化容器技术中的典型代表,也是云计算中的重点。
2. Docker虚拟化容器的价值
Docker 虚拟化容器有以下两方面的价值。
- 从系统的架构层面上看:Docker 可以方便地支持并实现微服务架构,从而更方便灵活地实现架构的变化和系统的扩展。同时,Docker虚拟化容器有助于DevOps的落地,可以大大提升开发效率,加速迭代。
- 从底层基础层面上看:利用Docker 虚拟化容器技术可以方便地实现系统的移植,,帮助实现企业应用上云,让应用在自有数据中心和云端之间实现动态迁移。
随着云计算技术的不断发展,在产生Docker 虚拟化容器技术后,一批相关的虚拟化容器管理技术也随之诞生,例如Kubernetes ( K8s)等。这样的工具极大地推动了技术的分工,也极大地促进了技术和业务的创新。
1.2 Docker介绍
Docker是一个开源的虚拟化容器引擎,让开发者可以打包他们的应用及依赖到一个可移植的容器中,然后发布到Linux环境中以实现虚拟化的管理。这些 Linux环境包括CentOS、Redhat、Ubuntu等。在Windows上也可以部署Docker,但不推荐。
Docker 中的虚拟化容器完全使用“沙箱”机制,相互之间不会有任何接口。可以把这些容器理解为是逻辑隔离的。
一个完整的 Docker 由以下几部分组成:
- Docker客户端。
- Docker守护进程(Daemon)。
- Docker 镜像(lmage)。
- Docker容器(Container)。
- 镜像仓库(Repository)。
Docker 实现了应用代码与底层运行环境之间的耦合。它可以将一个复杂系统中的各个模块进行容器化,同时提供了负载均衡和失败迁移功能。应用的容器化,满足了敏捷开发、动态迁移、标准化的要求,从而大大提高了效率。
1.3 Docker的体系架构与基本概念
Docker是一个客户端服务器(Client-Server)架构。Docker 客户端和Docker守护进程交流,而Docker守护进程是运作Docker 的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。
我们在使用Docker 创建容器时需要有镜像。镜像是一个只读的模板。而存放镜像的地方叫作“镜像仓库”。镜像仓库,可以是公有镜像仓库(例如官方提供的公有镜像仓库Docker Hub),也可以是私有镜像仓库(例如 Harbor)。
图 1-2 展示了Docker的体系架构
图 1-2
表1-1列出了Docker体系架构中的组成部分及其功能特性。
表 1-1
组成部分 | 功能特性 |
Docker客户端 | 通常指Docker 提供的命令行工具,是Docker 最基本的用户接口。用户通过Docker 客户端提交Docker指令,Docker守护进程接收并执行该指令。Docker也有图形化的客户端工具 |
Docker守护进程 | 在Docker宿主机上运行Docker,实际上运行的是 Docker守护进程。用户并不直接和Docker守护进程交互,而是通过 Docker客户端的命令来和它进行交互 |
Docker镜像 | 一个Docker镜像是一个只读的模板。例如,一个Docker镜像可以包含一个CentOS的操作系统、一个MySQL的数据库和一个Tomcat的应用服务器。Docker镜像被用来创建Docker容器.Docker提供了一个简单的方式来构建一个新的镜像或更新一个已经存在的镜像。用户也可以从镜像仓库下载其他人已经创建好的Docker 镜像 |
Docker容器 | 通过Docker镜像可以创建Docker容器。Docker的容器可以保存任何东西,而这些东西是运行一个应用所必需的。可以把.Docker 容器看成是一个虚拟机。Docker容器可以被运行、开启、停止、移动和删除。每一个容器都是一个分离的、安全的应用平台。Docker容器是Docker的运行组件 |
镜像仓库 | Docker的镜像仓库用于保存Docker镜像,它可以是公共的存储地方,也可以是私有的存储地方。 1、公共的镜像仓库由Docker Hub提供,它提供了一个用户可以使用的已有镜像的集合。这些集合中的镜像可以是你自己创建的,也可以是别人创建的。 2、私有的镜像仓库需要自己在私有环境中搭建,例如在企业内网中自行搭建。Harbor是一个典型的私有的镜像仓库 |
1.4 安装Docker
Docker 实现虚拟化的本质是:在已经运行的Linux中创建了一个逻辑隔离的运行环境。因此,其执行效率几乎等同于宿主机的 Linux主机。
Docker必须部署在Linux系统上。如果想在其他系统(如Windows)上部署Docker,则需要先安装一个虚拟 Linux环境。表1-2列举了本书所使用的实验环境。
表1-2
所需软件 | 软件说明 |
CentOS-7-x86_64-Everything-1810.iso | CentOS Linux 7 64位安装文件,将作为运行Docker的宿主机 |
VMware Workstation Pro | 虚拟机管理器,用于部署CentOS环境 |
Xshell 7 | 远程SSH登录工具,用于使用命令行方式登录 CentOS |
1.4.1 安装Linux操作系统
略
1.4.2 使用YUM方式安装Docker
YUM的全称是Yellow dogUpdater Modified。利用YUM方式可以很方便地添加、删除和更新Linux系统的程序包,并且能够自动解决包的依赖性问题。使用 YUM也能够方便地管理大量的系统更新问题。一般使用YUM方式需要连接外部的网络。
(1)为了验证虚拟机是否可以访问外部的网络,这里输入以下的命令访问百度主页,如图1-38所示。
[root@node0 ~]# ping www.163.com
图 1-38
(2)执行以下命令使用YUM方式安装Docker。
[root@node0 ~]# yum -y install docker
(3)安装完成后的界面图1-39所示。
(4)执行以下命令启动Docker的服务。
[root@node0 ~]# systemctl start docker.service [root@node0 ~]# systemctl enable docker.service
(5)执行以下命令确定Docker的版本,如图1-40所示。
[root@node0 ~]# docker version
图1-40
从图1-40可以看到,Docker分为Client 端和 Server端,当前安装的Docker是1.13.1版本。
1.4.3 使用二进制包方式安装Docker
使用YUM方式安装Docker非常简单,但需要连接外部的网络。而在实际的企业生产环境中,通常不能直接访问外部的网络。这时可以使用Docker 官方提供的二进制包进行Docker 的离线安装。图1-41展示的是Docker官方提供的二进制包下载网页。
(1)安装wget下载工具。
[root@node0 ~]# yum -y install wget
(2)下载Docker安装包。(https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz)
[root@node0 ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz
(3)使用tar命令解压缩Docker二进制安装包。
[root@node0 ~]# tar -zxvf docker-20.10.9.tgz
(4)查看Docker二进制包提供的执行命令,如图1-42所示
[root@node0 ~]# ls docker
图 1-42
(5)将Docker的可执行命令复制到“/usr/bin”目录下。
[root@node0 ~]# cp docker/* /usr/bin/
(6)执行以下命令启动Docker服务。启动成功后输出日志信息如图1-43所示。
[root@node0 ~]# /usr/bin/dockerd
图 1-43
(7)新开启一个命令窗口,执行以下语句查看 Docker 的版本信息(包括 Docker 客户端与Docker服务器端的版本),可以看到Docker的版本为20.10.9,如图1-44所示。
[root@node0 ~]# /usr/bin/docker version
以上命令除将Docker运行在后台外,还会保存Docker的日志到“/tmp/docker.log”文件中。
图 1-44
(8)在“/etc/systemd/system/docker.service”文件中输入以下内容:
[root@node0 ~]# vim /etc/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target
(9)在创建“/etc/systemd/system/docker.service”文件后,需要给该文件添加可执行权限。
[root@node5 ~]# chmod +x /etc/systemd/system/docker.service
(10)启动Docker,并设置Docker为开机自启模式,如图1-45所示。
[root@node5 ~]# systemctl start docker.service [root@node5 ~]# systemctl enable docker.service
图 1-45
至此,通过使用二进制包完成了Docker安装。不管使用YUM方式还是二进制包方式,在安装完成后,Docker的使用方式是完全一样的。但在使用之前,最好验证一下Docker的环境。
1.4.4 验证Docker环境
在命令行工具Xshell 中,使用“docker info”命令可以查看Docker运行状态的详细信息,如图1-46所示。
[root@node5 ~]# docker info
图 1-46
在图1-46的Server端配置参数中,Registry表示镜像仓库的地址。可以看出这里使用的是官方提供的Docker Hub镜像仓库。
通过使用系统服务命令可以查看Docker 的运行状态。执行以下命令,可以查看Docker 服务的状态,如图1-47所示。
[root@node5 ~]# systemctl status docker.service
图 1-47
1.5 【实战】在Docker中部署第一个应用
在成功安装 Docker后,就可以通过镜像来创建容器,从而运行应用。下面将演示如何在 Docker中,通过使用Nginx镜像来部署第一个应用,并在浏览器中访问它。图1-48展示了最终在浏览器中访问的效果。
图 1-48
下面是具体的步骤。
(1)在镜像仓库中搜索Nginx的镜像,如图1-49所示。其中,OFFICAL列中标有[OK]的镜像是 Docker官方提供的镜像。
[root@node5 ~]# docker search nginx
图 1-49
(2)通过以下命令从镜像仓库拉取 Nginx的镜像到本地,这里拉取了docker.io/library/nginx镜像,即官方提供的Nginx镜像,如图1-50所示。
[root@node5 ~]# docker pull nginx
图 1-50
(3)使用“docker images”命令查看本地的镜像信息,如图1-51所示。
[root@node5 ~]# docker images
图 1-51
(4)执行以下的命令将使用镜像来创建 Nginx的容器。
[root@node5 ~]# docker run -d -p 1234:80 nginx
其中的参数说明如下。
- -d:启动容器的守护进程。
- -p:将容器内的80端口映射到宿主机的1234端口。这样就可以通过宿主机访问容器内部了。
(5)在容器创建并启动成功后,可以查看Docker的容器信息,如图1-52所示。
[root@node5 ~]# docker ps
图 1-52
alias myps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Ports}}"'
alias myimages='docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"'
图 1-53
(6)打开浏览器访问“http://192.168.8.105:1234/",将打开 Nginx的首页。
(7)如果要终止和销毁容器,则执行以下命令。
[root@node5 ~]# docker rm -f 73091253be26
(8)再次查看容器信息,可以看到没有任何运行的容器信息,如图
1-54所示。
图 1-54
(9)可以通过“docker help”命令查看命令的帮助信息,在后续章节中会陆续介绍这些命令的使用方法。