1. Docker安装方案全解析
作为容器化技术的核心工具,Docker的安装是每个开发者必须掌握的技能。不同操作系统下的安装方式各有特点,我们需要根据实际环境选择最适合的方案。
1.1 Linux系统安装
在Linux系统中,官方推荐通过仓库安装的方式。以Ubuntu为例,以下是标准安装流程:
bash复制# 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新apt索引
sudo apt-get update
# 安装依赖包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
注意:如果遇到"couldn't create the interface used for talking to the container runtime"错误,通常是因为containerd服务未正确启动,可以尝试
sudo systemctl restart containerd解决。
1.2 Windows系统安装
Windows用户需要区分不同情况:
-
Windows 10/11专业版/企业版:
- 启用Hyper-V虚拟化功能
- 下载Docker Desktop安装包
- 安装后可能需要重启系统
-
Windows家庭版:
- 需要先安装WSL2(Windows Subsystem for Linux)
- 然后安装Docker Desktop for Windows
常见问题解决方案:
- "Virtualization support not detected"错误:需在BIOS中启用VT-x/AMD-v虚拟化支持
- 安装后无法启动:尝试以管理员身份运行,或检查防火墙设置
1.3 macOS安装方案
Mac用户安装相对简单:
- 下载Docker.dmg安装包
- 拖拽应用图标到Applications文件夹
- 首次运行需要授权各种权限
优化建议:
bash复制# 增加Docker资源分配(针对开发环境)
docker-machine create --driver virtualbox \
--virtualbox-cpu-count 4 \
--virtualbox-memory 8192 \
default
2. run与exec命令深度对比
2.1 docker run命令详解
docker run是创建并启动新容器的核心命令,其典型用法:
bash复制docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
关键选项解析:
--name:为容器指定名称--rm:容器退出时自动删除-v:挂载主机目录到容器-p:端口映射-e:设置环境变量
实际案例:
bash复制# 运行Nginx容器并映射端口
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 运行交互式Ubuntu容器
docker run -it ubuntu:20.04 /bin/bash
2.2 docker exec命令剖析
docker exec用于在运行中的容器内执行命令:
bash复制docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
典型使用场景:
- 调试运行中的容器
- 执行维护任务
- 与后台服务交互
对比示例:
bash复制# 在已运行的容器中启动新shell
docker exec -it my-container /bin/bash
# 在MySQL容器中执行查询
docker exec mysql-container mysql -uroot -p -e "SHOW DATABASES;"
2.3 run vs exec核心区别
| 特性 | docker run | docker exec |
|---|---|---|
| 容器状态 | 创建新容器 | 操作已有容器 |
| 资源消耗 | 分配新资源 | 复用现有资源 |
| 使用场景 | 初始部署 | 运维调试 |
| 进程关系 | 启动主进程 | 附加子进程 |
| 生命周期 | 影响容器生命周期 | 不影响容器生命周期 |
3. 参数-itd的妙用
3.1 参数组合解析
这三个参数经常组合使用,但各自有独特作用:
-i(interactive):保持STDIN打开-t(tty):分配伪终端-d(detach):后台运行容器
3.2 典型使用场景
3.2.1 交互式容器 (-it)
bash复制# 启动交互式Python环境
docker run -it python:3.9 /bin/bash
# 进入后可以执行:
>>> import sys
>>> print(sys.version)
经验:使用
-it时,退出shell会导致容器停止(除非主进程仍在运行),这是常见误区。
3.2.2 后台服务 (-d)
bash复制# 后台运行Redis服务
docker run -d --name my-redis -p 6379:6379 redis:alpine
# 查看日志
docker logs -f my-redis
3.2.3 组合使用 (-itd)
bash复制# 启动可随时附加的长期服务
docker run -itd --name my-service ubuntu:20.04
# 需要时进入容器
docker exec -it my-service /bin/bash
3.3 常见问题排查
-
终端显示问题:
bash复制# 如果遇到终端显示异常,尝试重置TERM环境变量 docker exec -it my-container env TERM=xterm /bin/bash -
输入无响应:
- 确保同时使用
-i和-t参数 - 检查容器内是否安装了bash/sh
- 确保同时使用
-
后台容器管理:
bash复制# 查看运行中的容器 docker ps # 查看所有容器(包括停止的) docker ps -a # 启动/停止容器 docker start/stop my-container
4. 高级应用与最佳实践
4.1 容器网络配置
端口映射的进阶用法:
bash复制# 随机映射主机端口
docker run -d -p 80 nginx
# 指定IP和端口
docker run -d -p 192.168.1.100:8080:80 nginx
# 查看端口映射
docker port my-container 80
4.2 数据持久化方案
三种主要数据管理方式:
-
Bind Mount:
bash复制
docker run -v /host/path:/container/path nginx -
Volume:
bash复制
docker volume create my-vol docker run -v my-vol:/container/path nginx -
tmpfs Mount:
bash复制
docker run --tmpfs /app/tmp nginx
4.3 资源限制与监控
bash复制# 限制CPU和内存
docker run -it --cpus="1.5" --memory="512m" ubuntu
# 监控资源使用
docker stats my-container
# 查看详细配置
docker inspect my-container
4.4 容器编排入门
单机环境下可以使用docker-compose:
yaml复制version: '3'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
启动命令:
bash复制docker-compose up -d
5. 实战经验分享
5.1 镜像优化技巧
- 多阶段构建:
dockerfile复制# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 运行阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
- 减少层数:
dockerfile复制RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
5.2 安全最佳实践
- 避免使用root用户:
dockerfile复制RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
- 定期更新基础镜像:
bash复制docker pull nginx:latest
docker image prune # 清理旧镜像
5.3 调试技巧
- 检查容器日志:
bash复制docker logs --tail 50 --follow --timestamps my-container
- 分析容器文件系统:
bash复制# 导出容器文件系统
docker export my-container > mycontainer.tar
# 检查运行中容器的变化
docker diff my-container
- 网络诊断:
bash复制# 在容器内执行网络检查
docker exec -it my-container curl http://localhost:8080
