容器操作详解
嘿!长安又来了!上一章咱们聊了镜像,这章咱们深入学习容器操作。准备好了吗?🚀
🎯 容器的生命周期
容器就像一个程序,有它的生命周期:
创建 → 启动 → 运行 → 暂停 → 停止 → 删除
↓ ↓ ↓ ↓ ↓ ↓
create start up pause stop remove
让长安一个一个讲给你听!
🚀 创建和运行容器
docker run(创建+启动)
最常用的命令,一步到位:
docker run [选项] 镜像名 [命令]
常用选项详解
1. -d(后台运行)
# 前台运行(会占用终端)
docker run nginx
# 后台运行(返回容器ID)
docker run -d nginx
2. --name(指定名字)
# 不指定名字,Docker会随机生成
docker run -d nginx
# 名字可能是:silly_einstein
# 指定名字
docker run -d --name my-web nginx
# 名字就是:my-web
💡 长安建议:生产环境一定要指定名字,方便管理!
3. -p(端口映射)
# 格式:-p 宿主机端口:容器端口
docker run -d -p 8080:80 nginx
# 多个端口映射
docker run -d \
-p 8080:80 \
-p 8443:443 \
nginx
# 随机端口(Docker自动分配宿主机端口)
docker run -d -p 80 nginx
查看端口映射:
docker port <容器名>
4. -v(数据卷挂载)
# 挂载目录
docker run -d \
-v /path/on/host:/path/in/container \
nginx
# 挂载数据卷
docker run -d \
-v mydata:/data \
nginx
稍后会详细讲数据卷!
5. -e(环境变量)
# 设置一个环境变量
docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
# 设置多个环境变量
docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=mydb \
-e MYSQL_USER=myuser \
mysql
6. --rm(退出后自动删除)
# 容器退出后自动删除(临时容器)
docker run --rm -it ubuntu bash
什么时候用? 测试、一次性任务
7. -it(交互式)
# -i:保持STDIN打开
# -t:分配一个伪终端
# 交互式运行
docker run -it ubuntu bash
8. --restart(重启策略)
# 不自动重启(默认)
docker run -d --restart=no nginx
# 总是重启
docker run -d --restart=always nginx
# 失败时重启
docker run -d --restart=on-failure nginx
# 失败时重启(最多3次)
docker run -d --restart=on-failure:3 nginx
# 除非手动停止,否则总是重启
docker run -d --restart=unless-stopped nginx
💡 长安建议:生产环境用
--restart=unless-stopped
docker create(只创建不启动)
# 创建但不启动
docker create --name my-nginx nginx
# 查看状态(Created)
docker ps -a
# 手动启动
docker start my-nginx
什么时候用? 不常用,大多数时候直接用docker run
🎮 管理容器
启动和停止
# 启动容器
docker start <容器>
# 停止容器(优雅停止,给容器10秒时间清理)
docker stop <容器>
# 强制停止(立即kill)
docker kill <容器>
# 重启容器
docker restart <容器>
暂停和恢复
# 暂停容器(冻结进程)
docker pause <容器>
# 恢复容器
docker unpause <容器>
什么时候用? 临时释放资源,但不想停止容器
📊 查看容器信息
docker ps(查看运行中的容器)
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 只显示容器ID
docker ps -q
# 查看最近创建的容器
docker ps -l
# 显示容器大小
docker ps -s
docker stats(资源使用情况)
# 实时显示资源使用
docker stats
# 只显示一次
docker stats --no-stream
# 只看指定容器
docker stats my-nginx
输出:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
abc123def456 my-nginx 0.01% 2.5MiB / 7.68GiB 0.03% 1.2kB / 0B 0B / 0B
docker top(容器内的进程)
docker top my-nginx
输出:
UID PID PPID C STIME TTY TIME CMD
root 12345 12320 0 10:30 ? 00:00:00 nginx: master process
nginx 12346 12345 0 10:30 ? 00:00:00 nginx: worker process
docker inspect(详细信息)
docker inspect my-nginx
会输出一大堆JSON信息,包括:
- 容器配置
- 网络设置
- 挂载点
- 环境变量
- 等等...
查看特定字段:
# 查看IP地址
docker inspect -f '{{.NetworkSettings.IPAddress}}' my-nginx
# 查看状态
docker inspect -f '{{.State.Status}}' my-nginx
# 查看启动时间
docker inspect -f '{{.State.StartedAt}}' my-nginx
📝 查看和操作容器日志
docker logs(查看日志)
# 查看日志
docker logs my-nginx
# 实时查看日志(类似tail -f)
docker logs -f my-nginx
# 查看最后100行
docker logs --tail 100 my-nginx
# 显示时间戳
docker logs -t my-nginx
# 从某个时间开始
docker logs --since 2024-12-01T10:00:00 my-nginx
# 最近1小时
docker logs --since 1h my-nginx
实战技巧:
# 查看错误日志
docker logs my-nginx 2>&1 | grep -i error
# 导出日志到文件
docker logs my-nginx > nginx.log
🔧 进入容器
docker exec(在运行中的容器执行命令)
# 进入容器bash
docker exec -it my-nginx bash
# 执行单个命令
docker exec my-nginx ls -l /etc/nginx
# 以root用户执行
docker exec -u root my-nginx whoami
常用场景:
# 1. 查看配置文件
docker exec my-nginx cat /etc/nginx/nginx.conf
# 2. 查看日志
docker exec my-nginx tail -f /var/log/nginx/access.log
# 3. 安装工具(临时)
docker exec -it my-nginx bash
apt update && apt install vim
⚠️ 注意:在容器内安装的东西,容器重启后还在,但容器删除后就没了!
docker attach(附加到容器)
docker attach my-nginx
和exec有什么区别?
exec:新开一个进程,退出不影响容器
attach:附加到主进程,退出会停止容器
💡 长安建议:大多数情况用
exec,更安全!
📦 容器和宿主机之间传输文件
docker cp(复制文件)
# 从容器复制到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制到容器
docker cp ./index.html my-nginx:/usr/share/nginx/html/
# 复制整个目录
docker cp my-nginx:/var/log ./logs
实战场景:
# 备份容器内的数据
docker cp my-mysql:/var/lib/mysql ./mysql-backup
# 替换配置文件
docker cp ./my-config.conf my-nginx:/etc/nginx/conf.d/
docker restart my-nginx
🗑️ 删除容器
docker rm(删除容器)
# 删除已停止的容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 删除多个容器
docker rm container1 container2 container3
# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
# 删除所有容器(危险!)
docker rm -f $(docker ps -aq)
docker container prune(清理)
# 删除所有已停止的容器
docker container prune
# 不要确认,直接删
docker container prune -f
🎯 实战案例
案例1:运行一个完整的Web应用
# 运行nginx,挂载自定义网页
docker run -d \
--name my-web \
--restart=unless-stopped \
-p 80:80 \
-v /path/to/html:/usr/share/nginx/html:ro \
nginx:alpine
解释:
-d:后台运行--name my-web:容器名--restart=unless-stopped:自动重启-p 80:80:端口映射-v:挂载网页目录(:ro表示只读)nginx:alpine:使用Alpine版本(更小)
案例2:运行MySQL数据库
# 运行MySQL
docker run -d \
--name my-mysql \
--restart=unless-stopped \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=mydb \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=mypassword \
-v mysql-data:/var/lib/mysql \
mysql:8.0
解释:
-e:设置环境变量-v mysql-data:/var/lib/mysql:数据持久化
连接测试:
docker exec -it my-mysql mysql -uroot -pmy-secret-pw
案例3:一次性任务容器
# 运行一次性任务,完成后自动删除
docker run --rm \
-v $(pwd):/data \
alpine:latest \
sh -c "tar -czf /data/backup.tar.gz /data"
💡 容器操作最佳实践
1. 命名规范
# ✅ 好的命名
docker run --name web-nginx-prod nginx
docker run --name db-mysql-dev mysql
docker run --name cache-redis-test redis
# ❌ 不好的命名
docker run --name container1 nginx
docker run --name test nginx
2. 使用标签管理容器
# 添加标签
docker run -d \
--name web1 \
--label env=prod \
--label team=backend \
nginx
# 根据标签查找
docker ps --filter "label=env=prod"
3. 资源限制
# 限制内存
docker run -d --memory="512m" nginx
# 限制CPU
docker run -d --cpus="1.5" nginx
# 限制内存+CPU
docker run -d \
--memory="1g" \
--memory-swap="2g" \
--cpus="2" \
nginx
4. 健康检查
# 添加健康检查
docker run -d \
--name web \
--health-cmd="curl -f http://localhost/ || exit 1" \
--health-interval=30s \
--health-timeout=3s \
--health-retries=3 \
nginx
# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' web
5. 日志管理
# 限制日志大小
docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
🎨 容器命令速查表
# 生命周期管理
docker run # 创建并运行容器
docker create # 创建容器(不启动)
docker start # 启动容器
docker stop # 停止容器
docker restart # 重启容器
docker rm # 删除容器
docker kill # 强制停止容器
docker pause # 暂停容器
docker unpause # 恢复容器
# 信息查看
docker ps # 列出容器
docker stats # 资源使用情况
docker top # 容器内进程
docker inspect # 详细信息
docker logs # 查看日志
# 容器操作
docker exec # 在容器内执行命令
docker attach # 附加到容器
docker cp # 复制文件
# 批量操作
docker ps -aq # 所有容器ID
docker stop $(docker ps -q) # 停止所有运行中的容器
docker rm $(docker ps -aq) # 删除所有容器
docker container prune # 清理已停止的容器
💡 小结
今天长安教你精通了容器操作:
核心知识点
- 生命周期:创建→启动→运行→停止→删除
- 常用选项:-d、-p、-v、-e、--name、--restart
- 日志管理:docker logs
- 进入容器:docker exec
- 资源监控:docker stats
- 文件传输:docker cp
记住这些命令
docker run -d --name <名字> -p <端口> <镜像> # 运行容器
docker ps -a # 查看容器
docker logs -f <容器> # 查看日志
docker exec -it <容器> bash # 进入容器
docker stop/start/restart <容器> # 控制容器
docker rm <容器> # 删除容器
🚀 下一步
容器操作搞定了!但是你可能在想:
"我怎么制作自己的镜像?"
别急,下一章长安教你 编写Dockerfile,打造专属镜像!
💬 长安的实战经验:
刚开始用Docker的时候,我经常忘记加
-d参数,然后终端就被占用了😂还有一次,我忘了加
--restart=always,服务器重启后所有容器都没了,老板差点把我炒了...所以记住:生产环境一定要加--restart参数!
还有,定期清理停止的容器,不然会占用很多空间。
docker container prune这个命令,我每周都会运行一次!下一章见!💪
