该文会根据Saurabh Dhingra的项目指导和谷歌云课程进行博文的编写,其中也会加入个人的一些见解。
项目环境
- Ubuntu 20.04 LTS
- 已经装好的Docker环境(这个可以看Docker官网教程安装,也可以看国内某些大佬的安装教程)
为什么我们要用Docker?
一如往常,先抛出疑问,为什么要用这技术?
当我们在我们机器上部署某些应用程序的时候,比如MySql, ANSIBLE或者Tomcat,你可能要为他们安装一些库或者依赖,有一些应用程序还会对操作系统或者服务器配置也有要求。不同程序的依赖有些时候是会产生冲突的,比如Web应用程序可能会要求某个版本的依赖,而数据库可能又要求你安装另一个版本的依赖,这时候我们就会感觉到有点头疼了,因为这可能意味着我们没法在同一台机器上安装多个被需要的应用程序。
所以解决方案有没有呢?
对于以上问题的一个解决方案可能是创建多个虚拟机,然后每个虚拟机上分别安装一个应用程序。是的,这个方案可行,但是可能会付出挺大的代价,因为每个虚拟机可能会要求不同的操作系统,所以你最后可能需要维护多个操作系统。你可能还会有许可证书管理之类的麻烦。
另一个方案是我们今天的主角,容器!所以什么是容器呢?容器是操作系统里的一片独立的区域,在这片区域里安装着一个应有程序运行所需的的依赖和库。每个容器里可以运行着不同的应用程序以及它们各自的依赖和库且运行环境可以做到互不干扰。容器里不会安装一个操作系统,实际上所有的容器可以用同一个操作系统。所以你可以想象你有一台服务器,服务器上运行着一个操作系统,操作系统里安装着Docker engine,而Docker engine可以用来创建多个容器。当然这些容器也是有资源使用限制的,比如CPU的使用率和内存的使用量。
Docker的架构是什么样的呢?
首先这个架构里有三个主要部分,Docker CLI, Rest API和 Docker Daemon。Docker Daemon是实际可用于创建和管理某些主机里的对象如images, 容器,网络和卷的服务器或者说进程。Rest API则是提供一个接口去管理Docker中的对象。而Docker CLI则是一个命令行接口,可以允许我们运行命令管理Docker Objects。
它们的关系如下:
一个目前的高级别的架构图是下图这样的:
从上图里可以看出,Docker Daemon被分解成了更小的可重用的组件。
卷起袖子,开始实践吧
先看看我们的Docker版本
docker --version
我的输出是:
Docker version 20.10.7, build f0df350
截至当前发文的时间,这个版本应该算是最新的。
我们可以接着查看docker服务当前在我们机器上的状态,输入下列命令:
systemctl status docker
输出应该类似于下列信息:
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor >
Active: active (running) since Wed 2021-08-04 11:51:06 PDT; 1h 4min >
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 1162 (dockerd)
Tasks: 86
Memory: 128.1M
CGroup: /system.slice/docker.service
└─1162 /usr/bin/dockerd -H fd:// --containerd=/run/container>
我们可以看到我们的docker是处于正常运行的状态。
想停止服务的时候使用下列命令:
systemctl stop docker
如果docker服务或者应用程序崩溃了,你也可以用下列命令重启服务:
sudo dockerd
如果你想看到调试信息,比如错误日志或者失败信息,可以用下列命令进入调试模式:
sudo dockerd --debug