Docker 简易使用指南
2023-03-18 09:31:04 # Docker

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
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
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
sudo apt-get install ca-certificates curl gnupg lsb-release

添加 Docker 官方 GPG key

sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

使用如下命令添加仓库源

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
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
2
3
4
5
6
7
8
9
10
输出结果如下
Unable to find image 'neosmemo/memos:latest' locally
latest: Pulling from neosmemo/memos
ef5531b6e74e: Pull complete
767611351930: Pull complete
7122d5f66710: Pull complete
50847f640a75: Pull complete
Digest: sha256:6a5605594b712f5c47d146ef690c92f3adfd1ab3b90b9ff431d8417058a1553a
Status: Downloaded newer image for neosmemo/memos:latest
9fd70a7e8e6a80cd3d62be9c69337c2fe4a01bd2518c27d14fe2fae97a114490

完成后,打开服务器防火墙 5230 端口,外部访问服务器ip:5230 即可打开 memos,后续绑定域名或配置 nginx 反向代理后即可拥有一个属于自己的备忘录系统,随时随地访问,并且支持注册登录。

image-20230318211452449

Docker 基本操作命令

在学习 Docker 操作命令前,我们先简单了解一下 Docker 中的 imagecontainer

image 是应用镜像,这是由开发者构建完成的,里面包含了开发者的应用以及依赖环境,需要注意的是 image 是只读的,用户无法写入到 image 中。

container 叫做容器,逻辑上处于 image 上层,它是可读写的,更像是 image 程序的启动命令,上面的 memos 部署命令便是创建一个 container 容器,启动 image 中的 memos。

一个 image 可以对应多个 container,也就是说,你可以使用 memos 的 image 镜像创建多个 container 容器,这些 memos 应用独立运行,互不干扰。当然,为了区分各个 memos 应用,container 的命名不能相同。

了解了 imagecontainer 后我们便可以学习 Docker 的基本操作命令了。

该命令是将 image 镜像拉取到本地,便于后续部署。

上面说到通过开发者提供的 image 镜像,我们便可以快速部署应用。那这些镜像如何获取?Docker 官方提供了应用仓库 Docker Hub,任何开发者都可以将自己制作的 image 镜像上传到 Docker Hub 中,供用户下载使用,当然 GitHub 开发者项目中肯定也会提供获取方式。

以 memos 为例,在 Docker Hub 中搜索 memos 即可找到该镜像。

image-20230318220444579

每个镜像 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 官方文档。后续有时间的话,我也会写一篇简单使用方法。