容器生命周期
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容器的生命周期和状态
- 容器的创建、运行和管理
- 容器监控和故障排除
- 容器网络配置
- 容器最佳实践
实践作业
- 创建一个Web应用容器,配置端口映射和数据卷
- 练习容器的启动、停止、重启操作
- 监控容器的资源使用情况
- 尝试进入容器并执行命令
思考题
- 什么时候使用
docker run
,什么时候使用docker start
? - 如何确保容器数据的持久化?
- 容器间如何进行通信?
下一课我们将学习Docker网络配置的高级用法。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议