Docker

这篇 Docker 攻略会从基础概念讲到实战操作,覆盖安装、命令、自定义镜像和多容器管理,新手跟着走就能上手,实用性拉满。

一、先搞懂 Docker 核心概念(别被术语吓住!)

首先得明确 Docker 不是虚拟机,它是更轻量的 "容器化工具",核心就 3 个东西:

  • 镜像(Image):相当于应用的 "安装包 + 配置",是只读的模板,比如 "nginx 镜像""mysql 镜像"。
  • 容器(Container):镜像跑起来的实例,是可操作的动态环境,一个镜像能开多个容器。
  • 仓库(Repository):存镜像的地方,官方的叫 Docker Hub,就像手机的应用商店。

跟虚拟机比的话,Docker 优势很明显:启动只要几秒(虚拟机要几分钟)、占内存少(MB 级 vs GB 级),还能做到 "一次打包,到处运行",不用再担心 "我这能跑,你那跑不了" 的环境问题。

二、全系统安装指南(一步一步来)

1. Windows(Win10/11)
  • 前提:Win10 专业版 / 企业版要开 "Hyper-V";家庭版得先装 WSL2(微软官网搜 "WSL2 安装",跟着输命令就行)。
  • 步骤:
    1. 去 Docker 官网下 "Docker Desktop" 安装包;
    2. 双击安装,勾选 "Use WSL 2 instead of Hyper-V"(家庭版必选);
    3. 装完启动,右下角出现 Docker 图标,等它变绿就成了。
2. macOS
  • 前提:Intel 芯片要 macOS 10.15+,M1/M2 芯片要 macOS 11+。
  • 步骤:
    1. 官网下对应芯片的 Docker Desktop;
    2. 拖到 "应用程序" 文件夹,启动时输系统密码授权,等图标变绿就好。
3. Linux(以 Ubuntu 为例,最常用)
  • 步骤:
    1. 先卸载旧版本(没装过也没事):sudo apt-get remove docker docker-engine docker.io containerd runc
    2. 装依赖:sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release
    3. 加 Docker 官方密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    4. 配置仓库:echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    5. 装 Docker Engine:sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    6. 验证:输sudo docker run hello-world,出现 "Hello from Docker!" 就成功了;想免 sudo(不用每次输密码),再输两句:sudo usermod -aG docker $USERnewgrp docker,重启终端就生效。

三、必背的基础命令(用熟这些就够日常用)

1. 镜像操作(管 "安装包" 的)
命令 作用 例子
docker pull 镜像名:标签 下镜像(标签默认 latest) docker pull nginx:1.23
docker images 看本地所有镜像 docker images -q(只显 ID)
docker rmi 镜像 ID / 名 删除镜像(先停容器) docker rmi nginx:1.23
docker save -o 文件名 镜像 导出镜像到本地 docker save -o nginx.tar nginx:1.23
2. 容器操作(管 "运行实例" 的,最常用!)

重点记docker run,参数特别关键:

  • -d:后台运行(别占着终端);
  • -p 宿主端口:容器端口:端口映射(比如-p 8080:80,浏览器输localhost:8080就能访问容器的 80 端口);
  • -v 宿主目录:容器目录:挂载目录(数据持久化,比如把本地文件夹挂到 mysql 容器,删了容器数据也在);
  • --name:给容器起名字(别用默认的随机名,不好记)。

常用命令例子:

  • 启动 nginx 容器(后台运行,80 端口映射):docker run -d -p 80:80 --name mynginx nginx
  • 看运行中的容器:docker ps(加-a看所有,包括停了的);
  • 进容器操作(比如进 nginx 容器改配置):docker exec -it mynginx /bin/bash-it是交互模式);
  • 停容器:docker stop mynginx;删容器:docker rm mynginx(删运行中的加-f);
  • 看容器日志(比如看 mysql 报错):docker logs -f mynginx-f实时刷新)。

四、进阶:自定义镜像(用 Dockerfile)

如果官方镜像满足不了需求(比如要装个带特定插件的 nginx),就自己写 Dockerfile 构建镜像。

1. Dockerfile 核心指令(记 5 个够用)
  • FROM:指定基础镜像(必须放第一行),比如FROM nginx:1.23
  • WORKDIR:设容器工作目录,后续命令都在这目录下,比如WORKDIR /app
  • COPY:把本地文件复制到镜像里,比如COPY index.html /usr/share/nginx/html/
  • RUN:构建镜像时执行命令(比如装依赖),比如RUN apt-get install -y vim
  • CMD:容器启动时执行的命令(只能有一条),比如CMD ["nginx", "-g", "daemon off;"]
2. 实战:做个带自定义页面的 nginx 镜像
  1. 新建个文件夹,里面放两个文件:Dockerfileindex.html(自己写个简单的 HTML 页面);
  2. Dockerfile 内容:

dockerfile

复制代码
FROM nginx:1.23  # 基础镜像
WORKDIR /usr/share/nginx/html  # 切换到nginx的默认页面目录
COPY index.html ./  # 把本地index.html复制过来
EXPOSE 80  # 声明端口(只是说明,不是真映射)
  1. 构建镜像(-t给镜像起名,.表示当前目录找 Dockerfile):docker build -t my-custom-nginx:v1 .
  2. 启动镜像验证:docker run -d -p 80:80 --name my-custom-nginx my-custom-nginx:v1,浏览器输localhost就能看到自己的页面。

五、多容器管理(Docker Compose,不用一个个启动了)

如果你的应用需要多个容器(比如前端 nginx + 后端 node + 数据库 mysql),用 Docker Compose 能一键启动所有容器,还能管理依赖(比如让 mysql 先启动,再启 node)。

1. 安装(Windows/macOS 装 Docker Desktop 时自带,Linux 要手动装)

Linux 装命令:

bash

复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证:docker-compose --version,出版本号就成。

2. 实战:nginx+node+mysql 组合
  1. 新建个文件夹,结构如下:

plaintext

复制代码
my-project/
├── docker-compose.yml  # Compose配置文件(核心)
├── node-app/           # node后端项目
│   ├── app.js
│   ├── package.json
│   └── Dockerfile      # node镜像的Dockerfile
└── nginx/
    └── conf.d/
        └── default.conf  # nginx配置(反向代理node)
  1. docker-compose.yml内容(重点看services,每个服务对应一个容器):

yaml

复制代码
version: '3.8'  # Compose版本,别太旧

services:
  # mysql服务
  mysql:
    image: mysql:8.0  # 用官方mysql镜像
    ports:
      - "3306:3306"
    environment:  # 环境变量(设mysql密码、默认数据库)
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: test_db
    volumes:
      - mysql-data:/var/lib/mysql  # 数据持久化(卷名mysql-data)
    restart: always  # 容器挂了自动重启

  # node服务(依赖mysql)
  node-app:
    build: ./node-app  # 用node-app文件夹里的Dockerfile构建镜像
    ports:
      - "3000:3000"
    environment:
      DB_HOST: mysql  # 连接mysql的主机名,直接写服务名"mysql"(Compose会自动配网络)
      DB_PASSWORD: 123456
    depends_on:  # 依赖mysql,确保mysql先启动
      - mysql
    restart: always

  # nginx服务(反向代理node)
  nginx:
    image: nginx:1.23
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d  # 挂载nginx配置
    depends_on:
      - node-app
    restart: always

volumes:  # 定义卷(mysql-data会自动创建)
  mysql-data:
  1. 启动所有服务:在my-project目录下输docker-compose up -d-d后台运行);
  2. 停服务:docker-compose down(加-v会删卷,数据就没了,慎用)。

六、新手常踩的坑(解决方法直接给)

  1. 端口被占用 :启动容器时提示 "port is already allocated",换个宿主端口,比如把-p 80:80改成-p 8080:80
  2. 镜像拉得慢 :国内访问 Docker Hub 慢,配阿里云镜像加速器:
    • 去阿里云搜 "容器镜像服务",找 "镜像加速器",复制自己的加速地址;
    • Linux:新建/etc/docker/daemon.json,写{"registry-mirrors": ["你的加速地址"]},然后sudo systemctl restart docker
    • Windows/macOS:打开 Docker Desktop,Settings→Docker Engine,加同样的配置,重启 Docker。
  3. 挂载目录后看不到文件 :确保宿主目录用绝对路径(比如/home/user/data,别用./data),Windows/macOS 还要在 Docker Desktop 里授权访问这个目录。

最后,要不要我帮你整理一份Docker 常用命令速查表?把镜像、容器、Dockerfile 的核心命令按场景分类,打印出来或存手机,用到时直接查,比翻攻略快多了。

相关推荐
a3158238063 小时前
Android13隐藏某个App需要关注的源码文件
android·java·framework·launcher3·隐藏app
悟空码字3 小时前
SpringBoot实现消息推送:让服务器学会“主动搭讪”
java·spring boot·后端
蒟蒻小袁3 小时前
Hot100--找到字符串中所有字母异位词
java·算法·leetcode·面试
+VX:Fegn08953 小时前
人力资源管理|基于springboot + vue人力资源管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
即随本心0.o3 小时前
SSE服务搭建
java·spring boot
MarkHD3 小时前
车辆TBOX科普 第56次 从模块拼接到可靠交付的实战指南
java·开发语言
灰什么鱼3 小时前
OkHttp + Retrofit2 调用第三方接口完整教程(以nomad为例)
java·spring boot·okhttp·retrofit
wadesir3 小时前
Debian容器存储管理(Docker中实现数据持久化的完整指南)
运维·docker·debian