Docker 命令详细使用教程
一、Docker 概述
Docker 是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上。
二、镜像管理命令
1. 搜索镜像
1 2 3 4 5 6
| docker search nginx
docker search --filter stars=1000 nginx docker search --filter is-official=true nginx
|
2. 拉取镜像
1 2 3 4 5 6 7 8
| docker pull nginx
docker pull nginx:1.21
docker pull --platform linux/amd64 nginx
|
3. 列出镜像
1 2 3 4 5 6 7 8 9 10 11
| docker images
docker images -a
docker images -q
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
|
4. 删除镜像
1 2 3 4 5 6 7 8 9 10 11
| docker rmi nginx
docker rmi -f nginx
docker rmi $(docker images -q)
docker image prune
|
5. 镜像历史
6. 镜像标签
1 2
| docker tag nginx my-nginx:v1
|
7. 保存和加载镜像
1 2 3 4 5 6 7 8
| docker save -o nginx.tar nginx
docker load -i nginx.tar
docker save -o images.tar nginx redis
|
三、容器管理命令
1. 运行容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker run nginx
docker run -d nginx
docker run --name my-nginx -d nginx
docker run -p 8080:80 -d nginx
docker run -v /host/path:/container/path -d nginx
docker run -e MY_VAR=value -d nginx
docker run --restart always -d nginx
docker run -m 512m --cpus=1 -d nginx
|
2. 列出容器
1 2 3 4 5 6 7 8 9 10 11
| docker ps
docker ps -a
docker ps -l
docker ps -s
|
3. 启动/停止/重启容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker start container_name
docker stop container_name
docker kill container_name
docker restart container_name
docker pause container_name
docker unpause container_name
|
4. 进入容器
1 2 3 4 5 6 7 8
| docker exec -it container_name /bin/bash
docker exec container_name ls /app
docker attach container_name
|
5. 查看容器信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker logs container_name
docker logs -f container_name
docker logs --tail 10 container_name
docker inspect container_name
docker top container_name
docker stats container_name
docker stats --all
|
6. 文件操作
1 2 3 4 5
| docker cp container_name:/path/to/file /host/path
docker cp /host/path container_name:/path/to/file
|
7. 删除容器
1 2 3 4 5 6 7 8 9 10 11
| docker rm container_name
docker rm -f container_name
docker container prune
docker rm -f $(docker ps -aq)
|
四、网络管理命令
1. 网络操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker network ls
docker network create my-network
docker network inspect my-network
docker network connect my-network container_name
docker network disconnect my-network container_name
docker network rm my-network
|
2. 端口映射
1 2
| docker port container_name
|
五、数据卷管理命令
1. 数据卷操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker volume create my-volume
docker volume ls
docker volume inspect my-volume
docker volume rm my-volume
docker volume prune
|
六、Docker Compose 命令
1. 基本命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| docker-compose up
docker-compose up -d
docker-compose -f docker-compose.prod.yml up
docker-compose down
docker-compose ps
docker-compose logs
docker-compose logs -f
docker-compose build
docker-compose restart
docker-compose up --scale web=3
|
七、系统管理命令
1. 系统信息
1 2 3 4 5 6 7 8 9 10 11
| docker info
docker version
docker system df
docker system df -v
|
2. 清理资源
1 2 3 4 5 6 7 8
| docker system prune
docker system prune -a
docker image prune -a
|
八、构建镜像命令
1. Dockerfile 构建
1 2 3 4 5 6 7 8 9 10 11
| docker build -t my-image:latest .
docker build -f Dockerfile.dev -t my-image:dev .
docker build --no-cache -t my-image .
docker build --build-arg APP_VERSION=1.0 -t my-image .
|
九、实战示例
1. 运行 WordPress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker network create wordpress-network
docker run -d \ --name mysql \ --network wordpress-network \ -e MYSQL_ROOT_PASSWORD=rootpass \ -e MYSQL_DATABASE=wordpress \ -e MYSQL_USER=wordpress \ -e MYSQL_PASSWORD=wordpresspass \ mysql:5.7
docker run -d \ --name wordpress \ --network wordpress-network \ -p 8080:80 \ -e WORDPRESS_DB_HOST=mysql \ -e WORDPRESS_DB_USER=wordpress \ -e WORDPRESS_DB_PASSWORD=wordpresspass \ -e WORDPRESS_DB_NAME=wordpress \ wordpress
|
2. 使用 Docker Compose
创建 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12
| version: '3' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example
|
运行:
十、常用命令总结
| 命令 |
描述 |
示例 |
docker run |
运行容器 |
docker run -d nginx |
docker ps |
列出容器 |
docker ps -a |
docker stop |
停止容器 |
docker stop container |
docker rm |
删除容器 |
docker rm container |
docker images |
列出镜像 |
docker images |
docker rmi |
删除镜像 |
docker rmi nginx |
docker pull |
拉取镜像 |
docker pull nginx |
docker exec |
执行命令 |
docker exec -it container bash |
docker logs |
查看日志 |
docker logs container |
docker build |
构建镜像 |
docker build -t myimage . |
十一、注意事项
- 权限问题:某些命令可能需要 sudo 权限或在 Docker 用户组中
- 数据持久化:重要数据要使用数据卷或绑定挂载
- 资源限制:生产环境要设置适当的内存和 CPU 限制
- 网络安全:注意端口暴露和网络配置的安全性
- 镜像来源:尽量使用官方镜像或可信来源的镜像
这个教程涵盖了 Docker 的大部分常用命令,建议在实际环境中多加练习以熟悉这些命令的使用。
我们以一个典型的Web项目为例,该项目包含:
- Nginx:作为反向代理和静态文件服务器
- Spring Boot Jar包:作为后端应用(需要JDK运行环境)
- MySQL:作为数据库
- 文件目录:用于存储上传的文件和配置文件
我将详细讲解如何为每个组件编写Dockerfile,以及如何使用docker run命令和docker-compose来运行整个系统。
一、项目结构规划
假设项目目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| /my-app ├── docker-compose.yml # 编排所有服务 ├── nginx/ │ ├── Dockerfile # Nginx的Dockerfile │ ├── nginx.conf # Nginx配置文件 │ └── conf.d/ │ └── app.conf # 站点配置 ├── backend/ │ ├── Dockerfile # 后端应用的Dockerfile │ ├── app.jar # Spring Boot打包的jar文件 │ └── config/ │ └── application.yml # 应用配置文件 ├── mysql/ │ └── init.sql # 数据库初始化脚本 └── data/ # 挂载的数据卷目录 ├── uploads/ # 文件上传目录 └── mysql/ # MySQL数据目录
|
二、详细Dockerfile编写
1. 后端应用(Spring Boot + JDK)的Dockerfile
/my-app/backend/Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
FROM openjdk:17-jdk-slim
LABEL maintainer="your-email@example.com"
ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app
COPY app.jar app.jar
COPY config/ /app/config/
RUN groupadd -r appgroup && useradd -r -g appgroup appuser RUN chown -R appuser:appgroup /app USER appuser
EXPOSE 8080
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Dspring.profiles.active=prod"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
关键指令解析:
FROM:基于官方JDK镜像
WORKDIR:设置工作目录
COPY:复制文件到镜像中
RUN:执行命令(创建用户、设置权限)
ENV:设置环境变量
EXPOSE:声明暴露端口
ENTRYPOINT:容器启动时执行的命令
2. Nginx的Dockerfile
/my-app/nginx/Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| FROM nginx:1.23-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf COPY conf.d/app.conf /etc/nginx/conf.d/app.conf
RUN mkdir -p /var/log/nginx && \ chown -R nginx:nginx /var/log/nginx
EXPOSE 80 443
USER nginx
CMD ["nginx", "-g", "daemon off;"]
|
配套的Nginx配置文件:
/my-app/nginx/conf.d/app.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| upstream backend { server backend:8080; }
server { listen 80; server_name localhost; location /static/ { alias /data/uploads/; expires 30d; } location /api/ { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
三、使用Docker命令运行
1. 构建镜像
1 2 3 4 5
| docker build -t my-app-backend:1.0.0 ./backend/
docker build -t my-app-nginx:1.0.0 ./nginx/
|
2. 创建网络
1
| docker network create app-network
|
3. 运行MySQL容器
1 2 3 4 5 6 7 8 9 10
| docker run -d \ --name mysql \ --network app-network \ -e MYSQL_ROOT_PASSWORD=rootpassword123 \ -e MYSQL_DATABASE=myapp \ -e MYSQL_USER=myappuser \ -e MYSQL_PASSWORD=myapppass123 \ -v /my-app/data/mysql:/var/lib/mysql \ -v /my-app/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql \ mysql:8.0
|
参数详解:
-d:后台运行
--name:容器名称
--network:加入的网络
-e:环境变量(数据库配置)
-v:挂载数据卷(数据持久化和初始化脚本)
4. 运行后端应用
1 2 3 4 5 6 7 8 9
| docker run -d \ --name backend \ --network app-network \ -p 8080:8080 \ -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/myapp \ -e SPRING_DATASOURCE_USERNAME=myappuser \ -e SPRING_DATASOURCE_PASSWORD=myapppass123 \ -v /my-app/data/uploads:/app/uploads \ my-app-backend:1.0.0
|
5. 运行Nginx
1 2 3 4 5 6 7
| docker run -d \ --name nginx \ --network app-network \ -p 80:80 \ -p 443:443 \ -v /my-app/data/uploads:/data/uploads \ my-app-nginx:1.0.0
|
四、使用Docker Compose编排(推荐)
/my-app/docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| version: '3.8'
services: mysql: image: mysql:8.0 container_name: mysql environment: MYSQL_ROOT_PASSWORD: rootpassword123 MYSQL_DATABASE: myapp MYSQL_USER: myappuser MYSQL_PASSWORD: myapppass123 volumes: - ./data/mysql:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - app-network restart: unless-stopped
backend: build: ./backend container_name: backend environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/myapp SPRING_DATASOURCE_USERNAME: myappuser SPRING_DATASOURCE_PASSWORD: myapppass123 JAVA_OPTS: "-Xms512m -Xmx1024m" volumes: - ./data/uploads:/app/uploads networks: - app-network depends_on: - mysql restart: unless-stopped
nginx: build: ./nginx container_name: nginx ports: - "80:80" - "443:443" volumes: - ./data/uploads:/data/uploads networks: - app-network depends_on: - backend restart: unless-stopped
networks: app-network: driver: bridge
volumes: mysql-data: driver: local uploads: driver: local
|
运行命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down
docker-compose up -d --build
|
五、重要参数和参考文档
1. Docker run 常用参数参考
| 参数 |
说明 |
示例 |
-d |
后台运行 |
-d |
-p |
端口映射 |
-p 80:80 |
-v |
数据卷挂载 |
-v /host:/container |
-e |
环境变量 |
-e KEY=VALUE |
--name |
容器名称 |
--name my-container |
--network |
加入网络 |
--network my-network |
--restart |
重启策略 |
--restart unless-stopped |
-m |
内存限制 |
-m 512m |
--cpus |
CPU限制 |
--cpus 1.5 |
2. 官方文档参考
3. 最佳实践建议
- 使用
.dockerignore:避免将不必要的文件复制到镜像中
- 多阶段构建:减少最终镜像大小
- 使用特定标签:避免使用
latest标签
- 非root用户:提高安全性
- 健康检查:添加健康检查机制
- 资源限制:生产环境必须设置资源限制
这样的架构和配置可以满足大多数Web应用的需求,并且具有良好的可维护性和扩展性。
后期使用
🧭 一、查看 Docker 容器资源占用情况
1️⃣ 查看总体资源消耗
这条命令类似于 Linux 的 top,会实时显示各容器的:
- 容器 ID / 名称
- CPU 使用率
- 内存占用量
- 网络流量
- 磁盘 I/O
按 Ctrl + C 退出。
如果你只想查看内存占用前几名:
1
| sudo docker stats --no-stream | sort -k4 -h
|
2️⃣ 查看单个容器资源详情
例如查看 Nextcloud 主容器:
1
| sudo docker inspect nextcloud-aio-mastercontainer
|
可以获取:
- 容器挂载卷、网络、IP 地址
- 资源限制(CPU/内存)
- 启动参数等信息
也可配合 grep:
1
| sudo docker inspect nextcloud-aio-mastercontainer | grep -i memory
|
3️⃣ 查看 Docker 系统整体资源使用
显示:
- 镜像占用空间
- 容器占用空间
- 卷(volumes)
- 构建缓存大小
🧰 二、Docker 容器生命周期管理
🚀 1️⃣ 创建容器
最常见两种方式:
a. 使用 docker run
例如运行一个测试容器:
1
| sudo docker run -d --name my-nginx -p 8080:80 nginx
|
b. 使用 docker compose
在有 docker-compose.yml 的目录执行:
1
| sudo docker compose up -d
|
⏸️ 2️⃣ 停止容器
1
| sudo docker stop <容器名或ID>
|
例如:
1
| sudo docker stop nextcloud-aio-apache
|
一次性停止所有容器:
1
| sudo docker stop $(sudo docker ps -q)
|
▶️ 3️⃣ 启动容器
例如:
1
| sudo docker start rocketchat-compose-rocketchat-1
|
🔄 4️⃣ 重启容器
1
| sudo docker restart <容器名>
|
🧹 5️⃣ 删除容器
先停止再删除:
1 2
| sudo docker stop <容器名> sudo docker rm <容器名>
|
一次性删除所有已停止的容器:
1
| sudo docker container prune
|
(确认后会清理所有停止的容器)
🧱 6️⃣ 删除镜像
查看镜像:
删除镜像:
1
| sudo docker rmi <镜像名:tag>
|
清理未使用镜像:
1
| sudo docker image prune -a
|
🪣 7️⃣ 删除卷(Volumes)
查看卷:
删除单个卷:
1
| sudo docker volume rm <卷名>
|
清理未使用卷:
1
| sudo docker volume prune
|
🧩 三、系统级管理命令
| 命令 |
说明 |
sudo docker ps -a |
查看所有容器(包括停止的) |
sudo docker logs <容器名> |
查看容器日志 |
sudo docker exec -it <容器名> bash |
进入容器交互终端 |
sudo docker update --restart=always <容器名> |
设置容器自动重启策略 |
sudo docker network ls |
查看网络 |
sudo docker system prune -a |
清理未使用的镜像、容器、网络、缓存 |
📊 四、图形化监控方式(可选)
如果你想要更直观地查看资源使用,可选择以下工具:
Portainer
1 2 3
| sudo docker run -d -p 9000:9000 --name portainer \ -v /var/run/docker.sock:/var/run/docker.sock \ portainer/portainer-ce
|
浏览器访问 http://localhost:9000。
LazyDocker
终端交互式管理工具:
1 2
| sudo apt install lazydocker lazydocker
|
类似 htop 的 Docker 管理界面。
⚙️ 五、实践建议(针对你的情况)
你当前运行的容器多且繁杂,建议:
定期执行:
1 2
| sudo docker system df sudo docker stats --no-stream
|
来检查资源占用。
给重要容器设置自动重启:
1
| sudo docker update --restart=always <容器名>
|
每月清理无用镜像与卷:
1
| sudo docker system prune -a
|