1. 什么是 Docker
docker / ˈdäkər n. 码头工人
假如有一天你头脑发热,突然想使用 Wordpress 搭建博客了,于是你查看 Wordpress 官方文档了解到 Wordpress 是基于 php 环境运行,使用 Mysql 存储数据。这时你又花了两个小时了解 php 和 Mysql 的安装与配置,费劲九牛二虎之力搭建成功后,你兴致勃勃的打开 Wordpress 后台,忽然发现似乎没什么意思,很快便又卸载了。
回想整个流程,你发现半天时间全花在了安装上,体验只有 5 分钟,卸载后还留下一堆残留文件。如何简化安装流程,将主要精力放在应用体验上?
Docker 完美解决了这一问题,与虚拟机相似,Docker 的沙箱机制将各个应用隔离开来,开发者预先将依赖环境打包到容器中,用户部署容器即可使用。像是 Wordpress 应用,容器里面已经包含了 php 和依赖环境,无需配置即可快速运行。但 Docker 与虚拟机还是有所不同的,具体如下:
特性 | Docker | 虚拟机 |
---|---|---|
启动时间 | 秒级 | 分钟级 |
磁盘占用 | MB | GB |
资源占用 | 较少 | 较多 |
隔离性 | 进程隔离 | 系统级隔离 |
安全性 | 弱 | 强 |
关于 Docker 的更多详细介绍可前往 [Docker 官方文档],本文也是基于 Docker 官方文档介绍其基本操作,实现快速入门,满足日常使用。强烈推荐后续查看 Docker 官方文档进一步了解 Docker。
2. 安装 Docker
本文主要介绍在 CentOS 和 Ubuntu 上安装 Docker,其他系统或详细安装方法请查阅 [Docker 官方安装文档]
在 CentOS 上安装 Docker
1. 系统要求
- CentOS 7
- CentOS 8 (stream)
- CentOS 9 (stream)
2. 配置 Docker 仓库源
安装 yum-utils(提供 yum-config-manager 功能),并添加 Docker 仓库源
sudo yum install -y yum-utils |
3. 安装 Docker
添加 Docker 源后可直接使用 yum install 命令安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
如果提示需要 GPG key
,输入 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
4. 启动 Docker
启动 Dcoker 查看是否安装成功,输入以下命令,若没有任何显示则为安装成功
sudo systemctl start docker |
输入 docker -v
查看版本情况
Docker version 23.0.1, build a5ee5b1 |
5. 卸载 Docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
在 Ubuntu 上安装 Docker
1. 系统要求
- Ubuntu Kinetic 22.10
- Ubuntu Jammy 22.04 (LTS)
- Ubuntu Focal 20.04 (LTS)
- Ubuntu Bionic 18.04 (LTS)
2. 配置 Docker 仓库源
更新软件源并安装如下软件使 apt
支持通过 https 安装软件
sudo apt-get update |
添加 Docker 官方 GPG key
sudo mkdir -m 0755 -p /etc/apt/keyrings |
使用如下命令添加仓库源
echo \ |
3. 安装 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
4. 启动 Docker
同样使用 docker -v
查看版本情况
Docker version 23.0.1, build a5ee5b1 |
5. 卸载 Docker
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras |
3. 使用 Docker
本教程所使用系统为 CentOS Stream 9
Docker 启停命令
1. 启动 Docker
sudo systemctl start docker |
2. 停止 Docker
sudo systemctl stop docker |
3. 重启 Docker
sudo systemctl restart docker |
4. 设置 Docker 开机自启动
docker 安装后并没有设置为开机自启动,若需要请通过以下命令开启
sudo systemctl enable docker |
5. 关闭 Docker 开机自启动
sudo systemctl disable docker |
快速开始部署一个 Docker 应用
我们首先通过部署一个比较轻量的应用,快速体验 Docker。
memos
是一个开源且免费的备忘录网站,占用资源非常小,通过 Docker 一键部署即可使用。
GitHub 项目链接:https://github.com/usememos/memos
通过如下命令即可实现部署:
docker run -d --name memos -p 5230:5230 -e TZ=Asia/Shanghai -v memos:/var/opt/memos neosmemo/memos:latest |
1 | 输出结果如下 |
完成后,打开服务器防火墙 5230 端口,外部访问服务器ip:5230
即可打开 memos,后续绑定域名或配置 nginx 反向代理后即可拥有一个属于自己的备忘录系统,随时随地访问,并且支持注册登录。
Docker 基本操作命令
在学习 Docker 操作命令前,我们先简单了解一下 Docker 中的 image
和 container
。
image
是应用镜像,这是由开发者构建完成的,里面包含了开发者的应用以及依赖环境,需要注意的是 image
是只读的,用户无法写入到 image 中。
container
叫做容器,逻辑上处于 image 上层,它是可读写的,更像是 image
程序的启动命令,上面的 memos 部署命令便是创建一个 container 容器,启动 image 中的 memos。
一个 image 可以对应多个 container,也就是说,你可以使用 memos 的 image 镜像创建多个 container 容器,这些 memos 应用独立运行,互不干扰。当然,为了区分各个 memos 应用,container 的命名不能相同。
了解了 image
和 container
后我们便可以学习 Docker 的基本操作命令了。
该命令是将 image 镜像拉取到本地,便于后续部署。
上面说到通过开发者提供的 image 镜像,我们便可以快速部署应用。那这些镜像如何获取?Docker 官方提供了应用仓库 Docker Hub,任何开发者都可以将自己制作的 image 镜像上传到 Docker Hub 中,供用户下载使用,当然 GitHub 开发者项目中肯定也会提供获取方式。
以 memos 为例,在 Docker Hub 中搜索 memos 即可找到该镜像。
每个镜像 Docker 提供了获取方式,位于右侧 Docker Pull Command
docker pull neosmemo/memos:latest |
命令最后的:latest
是获取最新的镜像,当然也可以指定镜像的更新版本,通过页面中 Tags
即可查询版本,不加:latest
则默认指定最新版。
不过实际上 docker pull
命令是可以省略的,因为在接下来的 docker run
部署命令中,若 docker 检查到指定的 image 不存在,会自动从 Docker Hub 中拉取镜像,不需要先使用 docker pull
获取镜像然后再部署。
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
这是部署应用最常用的命令,还是以 memos 为例,通过最简单的命令 docker run neosmemo/memos
便可创建新 container 容器。
docker run -d --name memos -p 5230:5230 -e TZ=Asia/Shanghai -v memos:/var/opt/memos neosmemo/memos:latest |
docker run 有很多参数,上述部署 memos 的命令所用到的便是最常使用的参数,接下来一一讲解。
-d
-d
参数代表后台运行 memos,如果不加-d
参数,memos 将在控制台运行,无法再使用命令。–name
--name
参数是对该 container 进行命名,用于区分各个 container。-p
-p
参数是指定应用对外开放的端口,如 memos 的5230:5230
,前者表示服务器真实端口,后者表示 image 镜像中使用的端口,前后映射,当然你也可以更改映射的端口,如80:5230
,即可通过外部 80 端口访问。实际上5230:5230
等同于0.0.0.0:5230:5230
,即对外开放端口,你也可以使用127.0.0.1:5230:5230
仅提供内网使用。-e
-e
参数是设置环境变量,开发者在制作镜像前,会提前将可以更改的配置项设为环境变量,通过-e
参数即可实现对应用的配置,部署 memos 中的TZ=Asia/Shanghai
便是将应用环境时区改为东八区。其余可以配置的变量应当到对应开发者的项目文档中查阅。-v
-v
参数可以将容器内部文件映射到外部,实现对内部文件访问和修改。主要有两种映射方式:
映射方式 Volume 数据卷映射 指定文件夹映射 介绍 Volume 是 Docker 程序提供的存储数据功能 将容器内部文件映射到指定文件夹 储存位置 保存在 Docker 程序所在目录中 保存到用户指定文件夹 使用方法 -v xxx:/var/opt/memos
-v /xxx:/var/opt/memos
说明 将容器内部文件夹 /var/opt/memos 映射到名为 xxx 的 volume 中 将容器内部文件夹 /var/opt/memos 映射到根目录 /xxx 中 区分 xxx 前没有 /
,仅代表数据卷的名称xxx 前有 /
,如 /root 即为保存到 root 文件夹中注意 需要使用命令 docker volume create xxx
创建 volume,再进行映射不需要提前创建文件夹,若指定目录不存再会自动创建 –restart
--restart
命令是设置应用的自启动策略,主要有四个值可选:策略 说明 no
容器退出后不自动重启 on-failure[:max-retries]
仅当容器运行出错后重启,[:max-retries] 可以限制重新启动重试次数(可选) unless-stopped
除非手动停止容器,不然则自动重启 always
总是自启动
像是 - p 中的内部端口,-e 中的环境变量,-v 中的内部数据文件夹,你应该查阅应用项目的文档来获取,并且这些参数都是可选的,需要根据实际情况来写。
了解完 Docker run 命令后,就可以开始部署你想使用的应用了。通常,开发者会在项目文档中提供部署命令,你可以根据需要进行更改。
docker start [OPTIONS] CONTAINER [CONTAINER…]
这个命令简单且常用,启动指定容器,如 docker start memos
docker stop [OPTIONS] CONTAINER [CONTAINER…]
同样,这是停止指定容器运行,如 docker stop memos
docker restart [OPTIONS] CONTAINER [CONTAINER…]
重启指定容器,如 docker restart memos
docker kill [OPTIONS] CONTAINER [CONTAINER…]
强制杀死指定容器进程,如 docker kill memos
docker ps [OPTIONS]
查看正在运行的容器信息, -a
参数可以包含停止的容器信息
docker rm [OPTIONS] CONTAINER [CONTAINER…]
移除指定容器, 如 docker rm memos
管理镜像,含有多个子命令
docker image ls
显示已安装镜像列表
docker image rm xxx
移除指定镜像,如
docker image rm neosmemo/memos
管理 volume, 含有多个子命令
docker volume create xxx
创建名为 xxx 的 volume 数据卷,如
docker volume create memos
docker volume ls
显示已创建的数据卷
docker volume rm xxx
移除指定数据卷,如
docker volume rm memos
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
在容器与外部文件之间相互拷贝
docker cp ./some_file CONTAINER:/work
拷贝本地文件到容器中
docker cp CONTAINER:/var/logs/ /tmp/app_logs
拷贝容器内部文件到本地文件
以上命令基本上可以满足日常使用,更为详细的命令文档,请参考 Docker 官方命令文档
4. 后续
除了这些基本操作外,Docker 还有许多更为强大的功能,比如指定网络类型、顺序启动容器、限制容器性能等等等等。
这次没写是因为使用 Docker Compose
可以更方便的对这些功能进行操作,Docker Compose 类似 Linux 的 shell 脚本,编写好脚本后,可以快速部署并配置多个 container 容器,如果你感兴趣的话可以查看 Docker Compose 官方文档。后续有时间的话,我也会写一篇简单使用方法。