Docker是一个用于开发,交付和运行应用程序的开放平台。它让你能够将应用程序与基础架构分离,从而可以快速交付软件。借助Docker,你可以以与管理应用程序相同的方式来管理基础架构。正如它的logo所展示的,鲸鱼/货轮代表了操作系统,而集装箱就是那些需要一个个部署的应用。在一艘货轮上,集装箱的作用就是将各种货物进行标准化摆放,并且使它们相互之间不受到影响。有了集装箱,我们就不需要专门运输某种特定货品的船了。我们可以把各种货品通过集装箱打包,然后统一放到一艘船上运输。Docker 要做的就是把各种软件打包成一个集装箱(镜像),然后发布到任何流行的Linux机器或Windows 机器上(也可以实现虚拟化),并且其内部的沙箱机制可以确保软件在运行的时候可以相互隔离。
安装 Docker
Docker支持在当前各大主流平台上安装使用,包括CentOS、Debian、Fedora、Ubuntu等Linux平台以及macOS、Windows等非Linux平台。因为 Linux 是 Docker 的原生支持平台,所以推荐你在 Linux 上使用 Docker。由于在生产环境中 CentOS 使用的较多,下文主要介绍在 CentOS 平台下安装和使用 Docker。
前置条件
操作系统要求
安装 Docker,需要 CentOS 7或8的维护版本。存档版本不支持或未经过测试。
必须启用 centos-extras 存储库。 该存储库默认情况下处于启用状态,但是如果你禁用了它,则需要重新启用。
建议使用 overlay2 存储驱动程序。
卸载旧版本
如果你已经安装过旧版的 Docker,可以先执行以下命令卸载旧版 Docker 以及它的依赖项。
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
如果yum报告没有安装这些软件包,那就可以了。
/var/lib/docker/中的内容(包括镜像,容器,卷和网络)将被保留。Docker Engine 软件包现在名为 docker-ce。
安装方法
Docker 官方提供了三种安装方法:
- 设置 Docker 仓库并从中进行安装,以简化安装和升级过程。这是官方推荐的安装方法。
- 下载RPM软件包手动进行安装,并完全手动管理升级。 这在无法访问互联网的空白系统上安装Docker的情况下很有用。
- 在测试和开发环境中,你还可以选择使用自动化脚本来安装Docker。
本文介绍通过设置 Docker 仓库来进行安装的方法。
设置仓库
使用以下命令安装yum-utils软件包(提供yum-config-manager程序)并设置稳定的仓库:
sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
如果在下面的安装过程中遇到”没有可用软件包“错误,可以将仓库地址设置为阿里云的镜像仓库:
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine
- 安装最新版本的 Docker Engine 和容器:
sudo yum install docker-ce docker-ce-cli containerd.io
在安装过程中如果提示你接受GPG密钥,需要验证指纹是否与060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35匹配,如果是,选择接受。
- 如果你想要安装指定版本的 Docker,可以使用以下命令列出当前仓库中所以可用的版本,然后选择一个版本进行安装:
yum list docker-ce --showduplicates | sort-r已加载插件:fastestmirror 可安装的软件包 * updates: mirrors.ustc.edu.cn Loading mirror speeds from cached hostfile * extras: mirrors.ustc.edu.cn * epel: d2lzkl7pfhq30w.cloudfront.net docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.1-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.0-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable
通过一个完全限定的软件包名称来(即软件包名称(docker-ce)加上版本字符串(第2列),从第一个冒号(:)开始,一直到第一个连字符(-)结束)安装特定版本。例如,docker-ce-20.10.5。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
Docker 安装完成后不会自动启动。此时 docker 的组已经创建了,但是还没有用户添加到组中去。
启动 Docker
使用如下命令启动 Docker
sudo systemctl start docker
通过运行 hello world 镜像来验证 Docker 是否正确:
sudo docker run hello-world
这个命令会下载一个测试镜像并在容器中运行。当容器运行时,它会打印如下消息然后退出:
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
安装完成后 docker 命令默认只能以 root 用户执行,如果想允许普通用户执行 docker 命令,需要执行以下命令 sudo groupadd docker && sudo gpasswd -a ${USER} docker && sudo systemctl restart docker ,执行完命令后,退出当前命令行窗口并打开新的窗口即可。
卸载 Docker
- 使用以下命令卸载 Docker:
sudo yum remove docker-ce docker-ce-cli containerd.io
- 上述卸载命令不会删除主机上的镜像、容器、卷或自定义配置文件。要删除所有镜像、容器和卷,可以执行以下操作:
sudorm-rf /var/lib/docker sudorm-rf /var/lib/containerd
容器技术的雏形—chroot
chroot 是最早的容器雏形,它意味着切换根目录,有了 chroot 就意味着我们可以把任何目录更改为当前进程的根目录,这与容器非常相似,那么什么是 chroot 呢?下面是维基百科中对 chroot 的定义:
chroot 是在 Unix 和 Linux 系统的一个操作,针对正在运作的软件进程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由 chroot 设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,包括读取,以及更改它的内容。
简单来说 ,chroot 就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录,仿佛置身于一个独立的文件系统中一样。下面我们通过一个实例来演示一下 chroot。
首先我们创建一个 rootfs 目录:
[root@node01 local]# mkdir rootfs
然后使用 busybox 镜像来创建一个系统,下面的操作你可以理解为在 rootfs 下创建了一些目录和放置了一些二进制文件。
[root@node01 local]# cd rootfs[root@node01 rootfs]# docker export $(docker create busybox) -o busybox.tar[root@node01 rootfs]# tar -xf busybox.tar
执行完上面的命令后,在 rootfs 目录下,我们会得到以下目录和文件:
[root@node01 rootfs]# lsbin busybox.tar dev etc home proc root sys tmp usr var
接下来我们通过 chroot 命令启动一个 sh 进程,并且把 /usr/local/rootfs 作为 sh 进程的根目录。
[root@node01 rootfs]# chroot /usr/local/rootfs/ /bin/sh/ #
此时,我们的命令行窗口已经处于上述命令启动的 sh 进程中了。在当前 sh 命令行窗口下,我们使用 ls 命令查看一下当前进程根目录下的内容:
/ # /bin/ls /bin busybox.tar dev etc home proc root sys tmp usr var
可以看到当前进程的根目录已经变成了主机上的 /usr/local/rootfs 目录。这样就实现了当前进程与主机的隔离。至此,一个目录隔离的容器就完成了。
但是,此时还不能称之为一个容器,为什么呢?你可以执行以下命令,查看一下路由信息:
/ # /bin/ip routedefault via 192.168.188.2 dev ens33 metric 100172.17.0.0/16 dev docker0 scope link src 172.17.0.1 192.168.188.0/24 dev ens33 scope link src 192.168.188.130 metric 100
然后新打开一个命令行,使用如下命令查看一下主机的路由信息:
[root@node01 ~]# ip routedefault via 192.168.188.2 dev ens33 proto static metric 100172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 192.168.188.0/24 dev ens33 proto kernel scope link src 192.168.188.130 metric 100
可以看到网络信息并没有隔离,实际上进程等信息此时也并未隔离。