Docker 启蒙教程(1)
本教程致力于以通俗易懂的方式使读者上手 Docker。
本文使用 CentOS 7 系统演示。
第一章 什么是 Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 就像一个盒子,你可以把你的软件及其需要的一切东西(像是工具、库等)都放进这个盒子里面。
这个盒子就像是一个可以装软件的盒子一样,里面的软件在不同的电脑上都能跑起来,就像你把同样的盒子搬到不同的房间,里面的东西还是一样的,不会受到外界影响。
有了 Docker,你就可以把你的软件「打包」成一个盒子,然后随意搬到其他地方,它都能照常运行,不用担心环境不一样导致的问题。这样就方便了很多,不管是在开发、测试,还是在生产环境中部署软件,都能更加轻松、稳定。
正如他们的口号:「Develop faster. Run anywhere.」
相比虚拟机,Docker 有以下优势:
- Docker 容器能在几秒内快速启动和关闭
- 对系统资源要求低,一台主机可以运行甚至上千个容器
- 高度可移植
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 版本,用户可以按需使用。
通过 <仓库名>:<标签>
的格式指定版本,不写标签默认为 latest(最新版本)。
总结一下,Docker Registry 包含了许多仓库,仓库又可以包含许多标签,一个标签对应一个镜像。
第三章 安装 Docker
实践是检验真理的唯一标准,让我们来亲自安装,感受一下。
本文使用 CentOS 7 系统演示。
官方已经给出了安装命令,我们根据官方文档执行即可。
先执行
1
2sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装最新版本的 Docker CE
CE 代表 Community Edition(社区版)
1
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动 Docker
1
sudo systemctl start docker
通过运行官方的 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 + P 和 Ctrl + Q 组合键或使用 exit
命令,或者按 Ctrl + D。
移除
使用 docker rm
删除一个处于终止状态的容器。
Docker 启蒙教程(1)