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.io | DaoCloud | 你提到的,稳定 |
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 \
nginxVolume完整操作命令
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-appNginx 配置问题
问题 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