## 前言 ### 1. Docker 是什么? Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖打包到一个可移植的容器 (container) 中。这些容器可以在任何支持 Docker 的环境中运行,确保应用程序在不同环境中的一致性。 ### 2. 为什么要使用 Docker? 回想一下我们学习编程的时候最折磨的就是环境问题,比如安装依赖、配置环境变量、兼容性等等。Docker 就是为了解决这个问题而生的,有了 Docker 之后我们就可以直接使用别人在 Dcoker Hub 仓库打包好的镜像 (image) 运行在我们的容器 (container) 中,大大地减轻了很多的人力和时间成本。 > 注:Dcoker Hub 仓库是 Docker 官方维护的镜像仓库,里面有很多开源软件的镜像,包括 MySQL、Redis、MongoDB、Nginx 等等。 ## 安装 Docker 通常我们安装提供 Docker 管理工具的软件包会帮我们把 Docker 环境安装好,常用的工具有 Docker Desktop、OrbStack。 ### 1. 安装 Docker Desktop 在官网找到对应 Mac 版本的安装包下载安装即可:[https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop/) ![Docker Desktop 安装](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749357200643-3750a7d3-9af8-4125-8930-73bdfb45f767.png?x-oss-process=image%2Fformat%2Cwebp%2Fresize%2Cw_1500%2Climit_0) ### 2. 安装 OrbStack 通过 brew 安装 OrbStack 也很简单,只需要在终端输入以下命令即可: ```bash brew install --cask orbstack ``` 或者在官网下载安装包进行安装:[https://www.orbital.io/download](https://www.orbital.io/download),我们发现 OrbStack 只有 Mac 版本,它是 Mac 下特有的一款软件。 ![OrbStack 安装](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749357481949-6d6fa12c-a955-4157-a8ec-56db318b5d9a.png?x-oss-process=image%2Fformat%2Cwebp%2Fresize%2Cw_1500%2Climit_0) ### 3. Docker Desktop VS OrbStack 1. Docker Desktop 是官方产品,功能完整,社区强大,但是内存磁盘资源占用大,启动慢。 2. OrbStack 是第三方产品,基础功能完善,界面简洁,资源占用小,启动快,面向个人开发者免费。 3. 个人使用可以尝试 OrbStack,生产环境推荐 Docker Desktop。 ### 5. 验证安装 ```bash docker --version ``` 如果安装成功,会输出 Docker 版本号。 ![docker version](https://cdn.nlark.com/yuque/0/2025/png/1863084/1744553719545-bf58887b-5241-4a9f-8a1a-75a2448ea2a5.png?x-oss-process=image%2Fformat%2Cwebp) 我最近在使用 OrbStack,下面以 OrbStack 为例进行演示。 ## 使用 Docker 运行项目 我们通过官方的一个样例项目来看一下如何在本地把它跑起来,[https://github.com/dockersamples/example-voting-app#](https://github.com/dockersamples/example-voting-app#) ### 1. 克隆项目到本地 ```bash git clone git@github.com:dockersamples/example-voting-app.git ``` ### 2. 进入项目目录 ```bash cd example-voting-app ``` ### 3. 启动容器 ```bash docker-compose up -d ``` 如果拉取镜像出现如下错误提示,大概率是网络原因 ![Docker Pull Image Error](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749362704070-a090c31e-2044-4ad9-95a4-dba126764013.png?x-oss-process=image%2Fformat%2Cwebp) 需要配置一下 Docker 镜像源,比如 OrbStack 在设置中进行配置,添加如下镜像源后点击 `Apply`,重启 OrbStack,重启才能生效: 以下镜像均已生效 ```json { "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ] } ``` 找到一个有效的镜像源,且用且珍惜吧... ```json { "registry-mirrors" : [ "https://docker.xuanyuan.me" ] } ``` ![Docker 镜像源配置](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749365062017-63a4e5a7-50f1-4e48-8023-1b1818d71e48.png?x-oss-process=image%2Fformat%2Cwebp%2Fresize%2Cw_1500%2Climit_0) 重新执行命令,拉取的内容较多,需要耐心等待一会,执行成功后,我们可以看到如下输出: ![Start success](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749366068461-e7bd49c7-0b88-4d1f-ae14-c3e1824d519c.png?x-oss-process=image%2Fformat%2Cwebp) 如果这里提示端口 `8081` 被占用,查看一下占用端口的进程 ``` lsof -i tcp:8081 ``` ![8081 port](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749367645377-730c8b92-d9c0-4b74-a927-445b755cf5cb.png?x-oss-process=image%2Fformat%2Cwebp) 我的是被 OrbStack 占用了,没法杀掉进程,所以需要修改 `docker-compose.yml` 文件中的端口映射,比如把 `8081` 改成 `8082`。 ![8081 port](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749365758462-acd9ae5e-db0e-440b-95ef-6536068b7949.png?x-oss-process=image%2Fformat%2Cwebp) 如果你的进程可以杀掉,直接 `kill -9 进程号` 即可。 > 注:这个过程还是需要我们能够定位问题解决问题,比如网络问题、端口占用等等。这个例子也是我们现实场景中的一个真实显照。 ## 查看运行效果 ### 1. OrbStack 中查看运行中的容器 这是样例工程的项目架构 ![System Architecture](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749369719919-9c5f0dc0-fa77-4c43-80e6-7a64e90c51b0.png?x-oss-process=image%2Fformat%2Cwebp) 包括 Postgres 数据库、Redis 缓存、NodeJS 后端服务、Python 前端服务、Worker 任务。 ![运行中的容器](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749366010053-3a714438-6787-4b5b-85ab-5158d56ceeed.png?x-oss-process=image%2Fformat%2Cwebp) ### 2. 访问页面 1. 投票页面,访问 [http://localhost:8080](http://localhost:8080),可以选择选项进行投票,每个客户端只能投票一次。 ![投票页面](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749365956802-629c6a5f-a5c2-4908-acfb-b19efcea200f.png?x-oss-process=image%2Fformat%2Cwebp) 2. 统计页面,访问 [http://localhost:8082](http://localhost:8082),查看投票结果。 ![统计页面](https://cdn.nlark.com/yuque/0/2025/png/1863084/1749365938197-1beee0d3-2350-4589-8cea-5f94bd98f105.png?x-oss-process=image%2Fformat%2Cwebp) ## Docker 常用命令 > 以下是之前学习的部分笔记整理,如果是初学者建议根据文章最后提供的资源进行系统性学习。 ### 1. 镜像操作 docker 仓库中的每个镜像都是由 `name:tag` - `应用名称:版本号` 构成的。 可以在 Docker 中央仓库中查找想要的镜像 [https://hub.docker.com/](https://hub.docker.com/) - `docker pull ubuntu:20.04`:拉取一个镜像 - `docker iamges`:查看本地所有的镜像 - `docker rmi ubuntu:20.04 ` :删除指定镜像,rmi - remvoe image - `docker save -o ubuntu_20_04.tar ubuntu:20.4`:将镜像 `ubuntu:20.4` 导出到本地文件 `ubuntu_20_04.tar`。 默认导出后其他用户是没有可读权限的,**需要给它加一个可读权限** `chmod +r ubuntu_20_04.tar ` - `docker load -i ubuntu_20_04.tar `:将镜像 `ubuntu:20.04` 从本地文件 `ubuntu_20_04.tar` 中加载出来。 `docker save` 和 `docker load` 配合可以实现 docker 镜像在不同服务器之间的迁移。 ### 2. 容器操作 根据一个镜像可以创建多个容器。 说明: - `[container]` 表示可选,可以不写 - `CONTAINER`:可以是容器 name 或者是容器 id 命令: - `docker [container] create -it ubuntu:20.04`:利用镜像 `ubuntu:20.04` 创建一个容器 - `docker ps -a`:查看本地所有的容器 - `docker ps`:只显示正在运行的容器 - `docker [container] start CONTAINER`:启动容器 - `docker [container] stop CONTAINER`:停止容器 - `docker [container] restart CONTAINER`:重启容器 - `docker [container] run -itd ubuntu:20.04`:创建并启动一个容器 - `docker [container] run -it ubuntu:20.04` 创建并**直接进入容器**,少了参数 `d` - `docker [container] attach CONTAINER`:进入容器 - 退出后不关闭容器(挂起容器): `Ctrl + p` + `Ctrl + q`【**推荐使用**】 - 退出后关闭容器:`Ctrl + d` - `docker [container] exec CONTAINER COMMAND`:在容器中执行命令 - **可以把 docker 容器看成一个全新的 Linux 服务器。**`ls` 查看根目录就是 linux 文件目录 - `docker [container] rm CONTAINER`:删除容器 - `docker container prune`:删除所有已停止的容器,prune - 删去 - `docker export -o xxx.tar CONTAINER`:将容器 `CONTAINER` 导出到本地文件 `xxx.tar` 中 - `docker import xxx.tar image_name:tag`:将本地文件 `xxx.tar` 导入成镜像,并将镜像重命名为 `image_name:tag` - `docker exprot/import` 和 `docker save/load` 的区别 - `export/impot` 会丢失历史记录和元数据信息,仅保存容器当时的快照状态。 - `save/load` 会保存完整记录,体积更大。 - `docker top CONTAINER`:查看某个容器内的所有进程 - `docker stats`:查看所有容器的统计信息,CPU、内存、存储、网络等信息。 - 按 `Ctrl + c` 结束查看 - `docker cp xxx CONTAINER:xxx` 或 `docker cp CONTAINER:xxx xxx`:在本地和容器之间复制文件 - `docker rename CONTAINER1 CONTAINER2`:重命名容器 - `docker update CONTAINER --memory 500M`:修改容器大小限制 ## Docker 学习资源 - 官方文档:[https://docs.docker.com/](https://docs.docker.com/) - 3 小时速通 Docker 教程:[https://www.bilibili.com/video/BV1Zn4y1X7AZ](https://www.bilibili.com/video/BV1Zn4y1X7AZ) - [https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html](https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)