Docker 启蒙教程(1)

本教程致力于以通俗易懂的方式使读者上手 Docker。

本文使用 CentOS 7 系统演示。

第一章 什么是 Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 就像一个盒子,你可以把你的软件及其需要的一切东西(像是工具、库等)都放进这个盒子里面。

这个盒子就像是一个可以装软件的盒子一样,里面的软件在不同的电脑上都能跑起来,就像你把同样的盒子搬到不同的房间,里面的东西还是一样的,不会受到外界影响。

有了 Docker,你就可以把你的软件「打包」成一个盒子,然后随意搬到其他地方,它都能照常运行,不用担心环境不一样导致的问题。这样就方便了很多,不管是在开发、测试,还是在生产环境中部署软件,都能更加轻松、稳定。

正如他们的口号:「Develop faster. Run anywhere.」

相比虚拟机,Docker 有以下优势:

  1. Docker 容器能在几秒内快速启动和关闭
  2. 对系统资源要求低,一台主机可以运行甚至上千个容器
  3. 高度可移植

Docker 有三个基本的概念:容器(Container)、镜像(Image)、仓库(Repository),本教程将为你介绍这几个概念。

第二章 三大基本概念和 Docker Registry

容器

容器是代码的隔离环境。容器就是上一章我们比作的「盒子」。容器拥有代码运行所需的一切环境,甚至可以是基本操作系统。

镜像

镜像类似于虚拟机中的镜像,是一个特殊的文件系统,提供容器运行时需要的程序、库等文件。不包含动态数据。

Docker Registry

很多时候我们要站在巨人的肩膀上,使用他人提供的服务,如 MySQL,这个时候就需要一个集中存储、分发镜像的系统,我们可以从这个系统中下载需要的服务,这个系统的名字叫 Docker Registry。

可以把 Docker Registry 的作用与 GitHub 的作用类比。

官方的 Docker Hub 就是最常用的 Docker Registry。如果在国内访问速度慢也可以使用阿里云等第三方的镜像服务。

此处提到的阿里云等第三方镜像并非属于三大基本概念的镜像(Image),而是针对国内网络环境提供下载速度优化的镜像(Mirror)。

仓库

仓库是集中存放镜像文件的地方,就像 Docker Registry 是集中存放仓库的地方一样。

Docker Registry 中可以包含多个仓库,就像一个 GitHub 账号可以创建很多仓库一样;一个仓库可以包含许多标签,一个标签对应一个镜像,就像一个 GitHub 仓库可以包含许多分支一样。我们以 MySQL 的 Docker 仓库举例。

MySQL 的 Docker 仓库

如图所示,标签代表了不同的 MySQL 版本,用户可以按需使用。

通过 <仓库名>:<标签> 的格式指定版本,不写标签默认为 latest(最新版本)。

总结一下,Docker Registry 包含了许多仓库,仓库又可以包含许多标签,一个标签对应一个镜像。

第三章 安装 Docker

实践是检验真理的唯一标准,让我们来亲自安装,感受一下。

本文使用 CentOS 7 系统演示。

官方已经给出了安装命令,我们根据官方文档执行即可。

  1. 先执行

    1
    2
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  2. 安装最新版本的 Docker CE

    CE 代表 Community Edition(社区版)

    1
    sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  3. 启动 Docker

    1
    sudo systemctl start docker
  4. 通过运行官方的 Hello World 镜像来确定是否安装成功

    1
    sudo docker run hello-world

安装成功。

第四章 镜像

前面已经讲到,镜像提供容器运行时需要的程序、库等文件。

让我们使用 docker pull 命令亲自获取一个镜像吧!

手动获取第一个镜像

以获取 MySQL 镜像为例。

1
docker pull mysql:latest

在这里,我们就用到了 <仓库名>:<标签> 的格式,mysql 为仓库名,latest 为标签。

为什么这么多条信息?!

你可能会好奇:「我只是下载了一个镜像,为什么终端的提示似乎在告诉我,服务器在下载多个文件?」

其实,Docker 有一个重要概念叫「镜像分层」,我们会在后面的教程里了解。

列出镜像

下载完成后,可以使用 docker images 命令列出它们。

移除

如果要移除本地镜像,可以使用 docker rmi 命令移除。

删除镜像之前要使用 docker rm 命令删除所有依赖此镜像的容器。

第五章 容器

新建容器

我们可以使用 docker run 命令新建并启动一个容器,就像我们安装时运行官方 Hello World 一样。

1
sudo docker run hello-world

运行结束后或通过 exit 命令退出后,容器会自动终止,我们可以使用 docker ps -a 查看所有容器。如果只执行 docker ps,则会显示正在运行的容器。每个容器都会有一个唯一的 ID。

启动停止与一气呵成

如果要启动已经终止的容器,应使用 docker start <id> 命令。

如果要停止一个容器,可以使用 docker stop <id>;如果要停止再启动一气呵成,则使用 docker restart <id> 命令。

很多时候需要让容器在后台以守护态运行(Daemonized),则需要添加 -d 参数。

1
sudo docker run -d mysql:latest

我要查看输出信息

执行带 -d 参数的命令后,我们无法看到容器输出的消息。此时可以使用 docker logs <id> 命令查看。

容器 ID 也太长了吧!!!

容器的 ID 太长了,我们可以仅输入容器 ID 的前 3 个字母,甚至只输入第一个字母,只要不重复即可,一般不建议只输入一个字母。

也可以在创建容器时添加 --name 参数为容器指定一个名字。

1
sudo docker run -d --name MyDatabase mysql:latest

这样,操作时就可以使用你指定的名字代替容器 ID 了。

和容器交互

默认不加参数的情况下,你是无法在容器内部执行命令的。所以创建容器时我们要使用 -i-t 参数。

-i 表示以交互模式运行容器,-t 表示为容器分配一个伪终端,你现在只需要记住这两个参数要同时用就可以。加参数的时候写到一起就可以,不用分开。

1
sudo docker run -itd ubuntu:latest

进入容器内部操作

要进入容器内部操作,使用 docker attach <id> 命令即可,退出则可以按 Ctrl + PCtrl + Q 组合键或使用 exit 命令,或者按 Ctrl + D

移除

使用 docker rm 删除一个处于终止状态的容器。

作者

晓夜

发布于

2024-02-19

更新于

2024-02-19

许可协议