docker命令

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管理敏感数据