Skip to content

Docker ​

配置加速器 ​

bash
# 查看Docker配置文件
sudo cat /etc/docker/daemon.json

# 如果文件存在,输出类似:
# {
#   "registry-mirrors": ["https://docker.m.daocloud.io"]
# }

#配置多个加速器(备用)

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

# 2. 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 3. 验证是否生效
docker info | grep -A 5 "Registry Mirrors"

常用国内镜像加速器列表 ​

加速器地址提供方特点
https://docker.m.daocloud.ioDaoCloud你提到的,稳定
https://dockerproxy.com社区免费,较稳定
https://docker.nju.edu.cn南京大学教育网快
https://docker.mirrors.ustc.edu.cn中科大教育网快
https://mirror.ccs.tencentyun.com腾讯云需腾讯云账号
https://<ID>.mirror.aliyuncs.com阿里云需注册获取

systemctl(主流Linux) ​

bash
# 启动Docker服务
sudo systemctl start docker

# 停止Docker服务
sudo systemctl stop docker

# 重启Docker服务(会重启所有容器,慎用)
sudo systemctl restart docker

# 查看Docker服务状态
sudo systemctl status docker

# 开机自启动
sudo systemctl enable docker

# 取消开机自启动
sudo systemctl disable docker

# 重新加载配置(修改daemon.json后使用,不重启服务)
sudo systemctl reload docker

# 查看服务日志
sudo journalctl -u docker -f
sudo journalctl -u docker --since "2026-08-14 10:00:00"

镜像管理(Image) ​

bash
# 查看本地镜像
docker images
docker image ls

# 搜索远程镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest
docker pull mysql:8.0

# 删除镜像
docker rmi <镜像ID>          # 删除指定镜像
docker rmi $(docker images -q)  # 删除所有镜像

# 构建镜像
docker build -t myapp:v1 .   # -t 指定名称和标签

# 查看镜像历史
docker history nginx:latest

容器管理(Container)- 核心命令 ​

bash
# 创建并启动容器
docker run -d --name mynginx -p 8080:80 nginx
# -d: 后台运行  --name: 容器名  -p: 端口映射

# 查看容器
docker ps                    # 查看运行中的容器
docker ps -a                 # 查看所有容器(含停止的)
docker ps -a -q              # 只显示容器ID

# 启动/停止/重启
docker start mynginx
docker stop mynginx
docker restart mynginx

# 进入容器(交互式)
docker exec -it mynginx /bin/bash   # 进入正在运行的容器
docker run -it ubuntu /bin/bash     # 创建并进入新容器

# 查看日志
docker logs mynginx
docker logs -f mynginx       # 实时跟踪日志
docker logs --tail 100 mynginx  # 查看最后100行

# 删除容器
docker rm mynginx            # 删除指定容器
docker rm -f mynginx         # 强制删除(即使运行中)
docker rm $(docker ps -a -q) # 删除所有已停止的容器

# 容器与宿主机文件拷贝
docker cp /host/file.txt mynginx:/app/
docker cp mynginx:/app/file.txt /host/

数据卷(Volume) ​

bash
# 1. 绑定挂载(Bind Mount)- 直接挂载宿主机目录
docker run -d \
  --name myapp \
  -v /host/data:/app/data \    # 宿主机路径:容器路径
  nginx

# 2. 卷挂载(Volume)- Docker管理的数据卷(推荐)
docker run -d \
  --name myapp \
  -v myvolume:/app/data \       # 卷名:容器路径
  nginx

# 3. tmpfs挂载(内存中,重启消失)
docker run -d \
  --name myapp \
  --tmpfs /app/temp \
  nginx

Volume完整操作命令 ​

bash
# 创建数据卷
docker volume create myvolume
docker volume create --driver local --opt type=none --opt device=/data --opt o=bind myvolume

# 查看所有卷
docker volume ls
docker volume ls -f dangling=true   # 查看无主卷

# 查看卷详情
docker volume inspect myvolume
# 输出: 卷名称、驱动、挂载点(宿主机实际路径)

# 删除卷
docker volume rm myvolume
docker volume rm $(docker volume ls -q)  # 删除所有卷

# 清理无用的卷(重要)
docker volume prune         # 删除所有未使用的卷
docker volume prune -f      # 强制删除,不提示

# 容器挂载卷时使用
docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql_data:/var/lib/mysql \      # 命名卷(自动创建)
  -v /host/backup:/backup \            # 绑定挂载(备份用)
  mysql:8.0

# 查看容器挂载详情
docker inspect myapp | grep -A 5 Mounts
docker inspect -f '{{.Mounts}}' myapp

卷的高级用法 ​

bash
# 共享卷(多个容器挂载同一个卷)
docker run -d --name app1 -v shared_data:/data nginx
docker run -d --name app2 -v shared_data:/data nginx

# 只读挂载
docker run -d --name myapp -v myvolume:/app/data:ro nginx

# 挂载子目录
docker run -d -v myvolume/subdir:/app/data nginx

# 从容器复制卷(数据卷容器,已过时但仍可用)
docker create -v /data --name datacontainer busybox
docker run -d --volumes-from datacontainer --name app nginx

网络管理(Network) ​

bash
# 查看网络
docker network ls

# 创建网络
docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet

# 连接容器到网络
docker network connect mynet mynginx
docker run -d --network mynet --name app nginx

# 查看网络详情
docker network inspect mynet

# 断开容器网络
docker network disconnect mynet mynginx

# 删除网络
docker network rm mynet

查看 MySQL 数据库表 ​

方法一:进入 MySQL 容器查看 ​

bash
# 1. 进入 MySQL 容器
sudo docker exec -it test bash

# 2. 登录 MySQL(密码是 123456)
mysql -uroot -p123456

# 3. 查看所有数据库
SHOW DATABASES;

# 4. 切换到 test 数据库
USE test;

# 5. 查看所有表
SHOW TABLES;

# 6. 查看 user 表结构
DESC user;

# 7. 查看 user 表数据
SELECT * FROM user;

# 8. 退出 MySQL
EXIT;

# 9. 退出容器
EXIT;

方法二:直接在宿主机执行 SQL(不进容器) ​

bash
# 查看所有数据库
sudo docker exec test mysql -uroot -p123456 -e "SHOW DATABASES;"

# 查看 test 数据库的所有表
sudo docker exec test mysql -uroot -p123456 -e "USE test; SHOW TABLES;"

# 查看 user 表结构
sudo docker exec test mysql -uroot -p123456 -e "USE test; DESC user;"

# 查看 user 表数据
sudo docker exec test mysql -uroot -p123456 -e "USE test; SELECT * FROM user;"

# 查看 user 表数据(格式化显示)
sudo docker exec test mysql -uroot -p123456 -e "USE test; SELECT * FROM user\G;"

发现的问题 ​

Docker 网络问题 ​

原因: 容器之间不在同一个 Docker 网络,无法通过容器名互相访问。

解决方案: ​
bash
# 1. 创建自定义网络
docker network create my-network

# 2. 启动容器时指定网络
docker run -d --network my-network --name mysql-container mysql:8.0
docker run -d --network my-network --name big-event big-event-app
docker run -d --network my-network --name my-frontend nginx:latest

# 3. 如果容器已存在,连接到网络
docker network connect my-network existing-container

关键点:

  • 同一个网络内的容器可以通过容器名互相访问
  • 后端连接 MySQL 用 jdbc:mysql://mysql-container:3306/dbname(不是 IP)
  • Nginx 代理后端用 proxy_pass http://big-event:8080/(不是 IP)

数据库连接配置问题 ​

问题现象:

text

bash
Communications link failure

原因: 配置文件里写的是 IP 地址或 localhost,而不是容器名。

解决方案:

application.yml 配置:

yaml

bash
spring:
  datasource:
    # ✅ 正确:使用容器名
    url: jdbc:mysql://test:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    # ❌ 错误:使用 IP 或 localhost
    # url: jdbc:mysql://192.168.154.130:3306/test
    username: root
    password: 123456

或使用环境变量覆盖:

bash

bash
docker run -d \
  --name big-event \
  --network my-network \
  -e SPRING_DATASOURCE_URL="jdbc:mysql://test:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true" \
  -e SPRING_DATASOURCE_USERNAME="root" \
  -e SPRING_DATASOURCE_PASSWORD="123456" \
  big-event-app

Nginx 配置问题 ​

问题 A:配置文件语法错误 ​

解决方案:

nginx

bash
server {
    listen 80;
    server_name localhost;
    
    root /usr/share/nginx/html;
    index index.html;
    
    # 前端 SPA 路由支持
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # 代理后端 API(解决跨域)
    location /api/ {
        proxy_pass http://big-event:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

问题 B:host not found in upstream ​

原因: Nginx 容器和后端容器不在同一个网络。

解决方案:

bash

bash
# 把 Nginx 加入后端所在的网络
docker network connect my-network my-frontend
docker restart my-frontend