第5课:Docker 容器操作

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

容器生命周期

Docker容器有以下几个状态:

  • Created:已创建但未启动
  • Running:正在运行
  • Paused:已暂停
  • Stopped:已停止
  • Deleted:已删除

创建和运行容器

docker run 命令

基本语法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用选项

基础选项

# 后台运行
docker run -d nginx

# 交互式运行
docker run -it ubuntu /bin/bash

# 指定容器名称
docker run --name my-nginx nginx

# 自动删除容器(退出时)
docker run --rm ubuntu echo "Hello World"

端口映射

# 映射端口
docker run -p 8080:80 nginx

# 映射所有端口
docker run -P nginx

# 指定IP和端口
docker run -p 127.0.0.1:8080:80 nginx

# 映射多个端口
docker run -p 8080:80 -p 8443:443 nginx

环境变量

# 设置环境变量
docker run -e NODE_ENV=production node

# 从文件读取环境变量
docker run --env-file .env node

# 传递主机环境变量
docker run -e USER node

数据卷挂载

# 挂载主机目录
docker run -v /host/path:/container/path nginx

# 挂载命名卷
docker run -v my-volume:/data nginx

# 只读挂载
docker run -v /host/path:/container/path:ro nginx

容器管理命令

查看容器

# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 查看最近创建的容器
docker ps -l

# 只显示容器ID
docker ps -q

# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"

启动和停止容器

# 启动已停止的容器
docker start container_name

# 重启容器
docker restart container_name

# 停止容器(优雅停止)
docker stop container_name

# 强制停止容器
docker kill container_name

# 暂停容器
docker pause container_name

# 恢复暂停的容器
docker unpause container_name

删除容器

# 删除已停止的容器
docker rm container_name

# 强制删除运行中的容器
docker rm -f container_name

# 删除多个容器
docker rm container1 container2

# 删除所有已停止的容器
docker container prune

容器交互

进入容器

# 在运行中的容器执行命令
docker exec -it container_name /bin/bash

# 执行单个命令
docker exec container_name ls -la

# 以root用户身份进入
docker exec -it --user root container_name /bin/bash

文件操作

# 从容器复制文件到主机
docker cp container_name:/path/to/file /host/path/

# 从主机复制文件到容器
docker cp /host/path/file container_name:/path/to/

# 复制目录
docker cp /host/directory container_name:/path/to/

容器监控

查看容器信息

# 查看容器详细信息
docker inspect container_name

# 查看容器日志
docker logs container_name

# 实时查看日志
docker logs -f container_name

# 查看最近的日志
docker logs --tail 100 container_name

# 带时间戳的日志
docker logs -t container_name

资源监控

# 查看容器资源使用情况
docker stats

# 查看指定容器的资源使用
docker stats container_name

# 只显示一次统计信息
docker stats --no-stream

进程监控

# 查看容器内运行的进程
docker top container_name

# 查看容器内的进程树
docker exec container_name ps aux

容器网络

网络模式

# 默认桥接网络
docker run nginx

# 主机网络模式
docker run --network host nginx

# 无网络模式
docker run --network none nginx

# 连接到指定网络
docker run --network my-network nginx

网络管理

# 创建网络
docker network create my-network

# 查看网络列表
docker network ls

# 查看网络详情
docker network inspect my-network

# 连接容器到网络
docker network connect my-network container_name

# 断开容器网络连接
docker network disconnect my-network container_name

实践示例

示例1:运行Web服务器

# 运行nginx服务器
docker run -d \
  --name my-web \
  -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:alpine

# 查看运行状态
docker ps

# 访问服务
curl http://localhost:8080

示例2:运行数据库

# 运行MySQL数据库
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=myapp \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 连接到数据库
docker exec -it my-mysql mysql -u root -p

示例3:开发环境

# 运行Node.js开发环境
docker run -it \
  --name node-dev \
  -v $(pwd):/app \
  -w /app \
  -p 3000:3000 \
  node:16-alpine \
  sh

# 在容器内
npm install
npm start

容器最佳实践

1. 单一职责原则

每个容器只运行一个主要进程:

# 好的做法:分离Web服务器和数据库
docker run -d --name web nginx
docker run -d --name db mysql

# 不好的做法:在一个容器中运行多个服务

2. 使用非root用户

FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs

3. 健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost/ || exit 1

4. 资源限制

# 限制内存和CPU
docker run -d \
  --memory=512m \
  --cpus=0.5 \
  nginx

故障排除

常见问题

容器无法启动

# 查看容器日志
docker logs container_name

# 查看容器详细信息
docker inspect container_name

端口冲突

# 查看端口使用情况
netstat -tulpn | grep :8080

# 使用不同端口
docker run -p 8081:80 nginx

权限问题

# 以特权模式运行
docker run --privileged nginx

# 添加特定权限
docker run --cap-add=SYS_ADMIN nginx

小结

在这一课中,我们学习了:

  • Docker容器的生命周期和状态
  • 容器的创建、运行和管理
  • 容器监控和故障排除
  • 容器网络配置
  • 容器最佳实践

实践作业

  1. 创建一个Web应用容器,配置端口映射和数据卷
  2. 练习容器的启动、停止、重启操作
  3. 监控容器的资源使用情况
  4. 尝试进入容器并执行命令

思考题

  1. 什么时候使用docker run,什么时候使用docker start
  2. 如何确保容器数据的持久化?
  3. 容器间如何进行通信?

下一课我们将学习Docker网络配置的高级用法。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议