docker 命令 #
docker
是一个用于开发、发布和运行应用程序的开放平台。它使用容器化技术将应用程序及其依赖项打包在一个独立的容器中,确保应用程序在任何环境中都能一致地运行。
语法 #
docker [选项] 命令 [参数]
常用命令分类 #
容器生命周期管理 #
命令 | 描述 |
---|---|
create |
创建一个新容器 |
start |
启动一个或多个已停止的容器 |
run |
创建并启动一个新容器 |
stop |
停止一个或多个运行中的容器 |
restart |
重启一个或多个容器 |
kill |
强制停止一个或多个运行中的容器 |
rm |
删除一个或多个容器 |
pause |
暂停一个或多个容器中的所有进程 |
unpause |
恢复一个或多个容器中已暂停的进程 |
容器操作 #
命令 | 描述 |
---|---|
ps |
列出容器 |
inspect |
显示一个或多个容器的详细信息 |
top |
显示容器中运行的进程 |
attach |
连接到正在运行的容器 |
exec |
在运行的容器中执行命令 |
logs |
获取容器的日志 |
cp |
在容器和本地文件系统之间复制文件/文件夹 |
stats |
显示容器资源使用统计信息 |
diff |
检查容器文件系统上的更改 |
port |
列出容器的端口映射 |
update |
更新一个或多个容器的配置 |
rename |
重命名容器 |
wait |
阻塞直到一个或多个容器停止,然后打印退出代码 |
镜像管理 #
命令 | 描述 |
---|---|
images |
列出镜像 |
build |
从Dockerfile构建镜像 |
pull |
从注册表拉取镜像 |
push |
将镜像推送到注册表 |
rmi |
删除一个或多个镜像 |
tag |
为镜像创建一个标签引用 |
save |
将一个或多个镜像保存为tar归档文件 |
load |
从tar归档文件加载镜像 |
import |
从tarball导入内容以创建文件系统镜像 |
history |
显示镜像的历史 |
commit |
从容器的更改创建新镜像 |
系统和数据管理 #
命令 | 描述 |
---|---|
info |
显示系统范围的信息 |
version |
显示Docker版本信息 |
system |
管理Docker系统 |
volume |
管理卷 |
network |
管理网络 |
plugin |
管理插件 |
login |
登录到Docker注册表 |
logout |
从Docker注册表注销 |
search |
在Docker Hub中搜索镜像 |
events |
获取服务器的实时事件 |
context |
管理上下文 |
prune |
删除未使用的数据 |
常见用法 #
容器管理 #
1. 运行容器 #
docker run [选项] 镜像 [命令] [参数]
常用选项:
-d, --detach
:在后台运行容器-p, --publish 主机端口:容器端口
:发布容器端口到主机-v, --volume 主机路径:容器路径
:绑定挂载卷-e, --env 环境变量=值
:设置环境变量--name 容器名称
:为容器指定名称--network 网络
:连接容器到网络--restart 策略
:容器退出时的重启策略-it
:交互式终端--rm
:容器退出时自动删除
示例:
# 运行Nginx容器,将主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 --name my-nginx nginx
# 运行交互式Ubuntu容器
docker run -it --name my-ubuntu ubuntu bash
# 运行MySQL容器,设置环境变量和卷
docker run -d --name my-mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
2. 管理容器 #
# 列出运行中的容器
docker ps
# 列出所有容器(包括已停止的)
docker ps -a
# 启动已停止的容器
docker start 容器ID或名称
# 停止运行中的容器
docker stop 容器ID或名称
# 重启容器
docker restart 容器ID或名称
# 删除容器
docker rm 容器ID或名称
# 强制删除运行中的容器
docker rm -f 容器ID或名称
# 删除所有已停止的容器
docker container prune
3. 容器操作 #
# 在运行中的容器中执行命令
docker exec -it 容器ID或名称 命令
# 查看容器日志
docker logs 容器ID或名称
# 实时查看容器日志
docker logs -f 容器ID或名称
# 查看容器详细信息
docker inspect 容器ID或名称
# 查看容器资源使用情况
docker stats 容器ID或名称
# 在容器和主机之间复制文件
docker cp 容器ID或名称:容器内路径 主机路径
docker cp 主机路径 容器ID或名称:容器内路径
# 查看容器中运行的进程
docker top 容器ID或名称
镜像管理 #
1. 镜像操作 #
# 列出本地镜像
docker images
# 拉取镜像
docker pull 镜像名称[:标签]
# 删除镜像
docker rmi 镜像ID或名称
# 为镜像添加标签
docker tag 源镜像[:标签] 目标镜像[:标签]
# 查看镜像历史
docker history 镜像ID或名称
# 保存镜像到文件
docker save -o 文件名.tar 镜像名称[:标签]
# 从文件加载镜像
docker load -i 文件名.tar
# 删除未使用的镜像
docker image prune
2. 构建镜像 #
# 从Dockerfile构建镜像
docker build -t 镜像名称[:标签] 路径
# 从容器创建镜像
docker commit 容器ID或名称 新镜像名称[:标签]
数据管理 #
1. 卷管理 #
# 创建卷
docker volume create 卷名称
# 列出卷
docker volume ls
# 查看卷详细信息
docker volume inspect 卷名称
# 删除卷
docker volume rm 卷名称
# 删除未使用的卷
docker volume prune
2. 网络管理 #
# 创建网络
docker network create 网络名称
# 列出网络
docker network ls
# 查看网络详细信息
docker network inspect 网络名称
# 将容器连接到网络
docker network connect 网络名称 容器ID或名称
# 将容器从网络断开
docker network disconnect 网络名称 容器ID或名称
# 删除网络
docker network rm 网络名称
# 删除未使用的网络
docker network prune
系统管理 #
# 显示Docker系统信息
docker info
# 显示Docker版本
docker version
# 查看Docker磁盘使用情况
docker system df
# 清理未使用的Docker对象(容器、镜像、卷、网络)
docker system prune
# 清理所有未使用的Docker对象,包括未使用的镜像
docker system prune -a
# 查看Docker事件
docker events
高级用法 #
1. 使用Docker Compose #
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用YAML文件配置应用程序的服务,然后使用单个命令创建和启动所有服务。
# 启动服务
docker-compose up
# 在后台启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 在服务中执行命令
docker-compose exec 服务名 命令
2. 使用Docker Swarm #
Docker Swarm是Docker的集群管理和编排工具。
# 初始化Swarm
docker swarm init
# 将节点加入Swarm
docker swarm join --token TOKEN IP:PORT
# 列出节点
docker node ls
# 部署服务
docker service create --name 服务名称 --replicas 3 镜像名称
# 列出服务
docker service ls
# 查看服务详情
docker service inspect 服务名称
# 扩展服务
docker service scale 服务名称=5
# 更新服务
docker service update --image 新镜像 服务名称
# 删除服务
docker service rm 服务名称
3. 使用Docker Registry #
Docker Registry是存储和分发Docker镜像的服务。
# 登录到Registry
docker login [服务器]
# 从Registry拉取镜像
docker pull [服务器]/用户名/镜像名称[:标签]
# 为镜像添加Registry标签
docker tag 本地镜像[:标签] [服务器]/用户名/镜像名称[:标签]
# 推送镜像到Registry
docker push [服务器]/用户名/镜像名称[:标签]
# 注销Registry
docker logout [服务器]
实用示例 #
1. 运行Web应用程序 #
# 运行Nginx服务器
docker run -d -p 8080:80 --name my-nginx -v $(pwd)/html:/usr/share/nginx/html nginx
# 运行带有环境变量的Node.js应用
docker run -d -p 3000:3000 --name my-node-app \
-e NODE_ENV=production \
-e DATABASE_URL=mongodb://db:27017/myapp \
my-node-app
2. 运行数据库 #
# 运行PostgreSQL
docker run -d --name my-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-v postgres-data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres
# 运行MongoDB
docker run -d --name my-mongo \
-v mongo-data:/data/db \
-p 27017:27017 \
mongo
3. 创建自定义网络并连接容器 #
# 创建网络
docker network create my-network
# 运行MySQL容器并连接到网络
docker run -d --name mysql \
--network my-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
# 运行WordPress容器并连接到同一网络
docker run -d --name wordpress \
--network my-network \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_PASSWORD=secret \
-p 8080:80 \
wordpress
4. 使用Docker Compose部署多容器应用 #
创建docker-compose.yml
文件:
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app
environment:
- NODE_ENV=production
- DATABASE_URL=mongodb://db:27017/myapp
depends_on:
- db
db:
image: mongo
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
启动应用:
docker-compose up -d
常见问题排查 #
1. 容器无法启动 #
# 查看容器日志
docker logs 容器ID或名称
# 检查容器详细信息
docker inspect 容器ID或名称
# 检查容器退出代码
docker inspect 容器ID或名称 --format='{{.State.ExitCode}}'
2. 网络连接问题 #
# 检查容器网络设置
docker inspect 容器ID或名称 --format='{{json .NetworkSettings.Networks}}'
# 检查容器IP地址
docker inspect 容器ID或名称 --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
# 在容器内执行网络诊断
docker exec 容器ID或名称 ping -c 3 google.com
3. 磁盘空间问题 #
# 检查Docker磁盘使用情况
docker system df
# 清理未使用的资源
docker system prune -a --volumes
4. 性能问题 #
# 查看容器资源使用情况
docker stats
# 限制容器资源使用
docker update --cpus 0.5 --memory 512M 容器ID或名称
Docker与虚拟机的比较 #
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动时间 | 秒级 | 分钟级 |
磁盘占用 | MB级 | GB级 |
性能 | 接近原生 | 有一定损耗 |
隔离级别 | 进程级隔离 | 完全隔离 |
操作系统 | 共享主机内核 | 完整的客户机OS |
可移植性 | 非常高 | 较低 |
安全性 | 较低 | 较高 |
提示 #
- 使用
docker-compose
管理多容器应用 - 为容器设置资源限制,避免单个容器消耗过多资源
- 使用命名卷而不是绑定挂载,以获得更好的性能和可移植性
- 构建尽可能小的镜像,使用多阶段构建和Alpine基础镜像
- 不要在容器中存储持久数据,使用卷或外部存储服务
- 使用健康检查确保容器中的应用程序正常运行
- 定期更新基础镜像以获取安全补丁
- 使用非root用户运行容器内的应用程序
- 使用Docker内置的日志驱动程序管理容器日志
- 使用Docker Compose或Swarm的secrets管理敏感数据