Docker 开发与使用教程 - Ubuntu 24.04 完整指南
目录
容器的概念
什么是容器?
容器是一种轻量级、可移植、自包含的软件打包技术,它将应用程序及其所有依赖项(库、配置文件、运行时环境等)打包在一起,确保应用在任何环境中都能以相同的方式运行。
容器的特点
- 轻量级:共享主机操作系统内核,启动速度快,资源占用少
- 可移植性:一次构建,到处运行(Build once, run anywhere)
- 隔离性:每个容器都有独立的文件系统、进程空间和网络接口
- 标准化:通过统一的镜像格式和运行时规范
容器 vs 虚拟机
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动时间 | 秒级 | 分钟级 |
| 资源占用 | 少 | 多 |
| 系统开销 | 低 | 高 |
| 隔离级别 | 进程级隔离 | 系统级隔离 |
| 镜像大小 | MB 级别 | GB 级别 |
Docker 与 Docker Compose 安装
系统环境
- 操作系统:Ubuntu 24.04 LTS
- 架构:x86_64 或 ARM64
- 权限:具有 sudo 权限的用户
安装 Docker
1. 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 更新软件包索引
sudo apt-get update
3. 安装必要的依赖包
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
4. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
5. 设置 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
6. 更新软件包索引并安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 验证安装
# 检查 Docker 版本
docker --version
# 运行测试容器
sudo docker run hello-world
8. 配置用户权限(可选)
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 重新登录或刷新组权限
newgrp docker
安装 Docker Compose
从 Docker Compose v2 开始,它作为 Docker 插件包含在 docker-compose-plugin 包中。如果你已经按照上面的步骤安装了 Docker,那么 Docker Compose 应该已经安装好了。
验证 Docker Compose 安装
# 检查 Docker Compose 版本
docker compose version
# 或者使用旧版命令格式
docker-compose version
如果未安装,可以手动安装
# 安装 Docker Compose v2(独立二进制文件)
sudo apt-get install docker-compose-plugin
# 或者安装旧版本(不推荐)
sudo apt-get install docker-compose
配置加速镜像(中国用户推荐)
# 创建配置文件
sudo mkdir -p /etc/docker
# 编辑配置文件
sudo nano /etc/docker/daemon.json
# 添加以下内容(使用阿里云镜像加速器)
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker 常用操作
镜像操作
搜索镜像
# 搜索 nginx 镜像
docker search nginx
# 搜索指定 star 数的镜像
docker search --filter=stars=100 nginx
拉取镜像
# 拉取最新版本
docker pull nginx
# 拉取指定版本
docker pull nginx:1.25.3
# 拉取特定平台的镜像
docker pull --platform linux/amd64 nginx
列出镜像
# 列出所有镜像
docker images
# 或
docker image ls
# 列出特定镜像
docker images nginx
# 查看镜像详细信息
docker image inspect nginx
删除镜像
# 删除指定镜像
docker rmi nginx
# 强制删除
docker rmi -f nginx
# 删除所有未使用的镜像
docker image prune -a
# 强制删除所有未使用的镜像
docker image prune -a -f
导出和导入镜像
# 导出镜像为 tar 文件
docker save -o nginx.tar nginx:latest
# 从 tar 文件导入镜像
docker load -i nginx.tar
构建镜像
# 使用 Dockerfile 构建镜像
docker build -t myapp:latest .
# 指定 Dockerfile 文件名
docker build -f Dockerfile.prod -t myapp:prod .
# 带构建参数的构建
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
容器操作
创建并运行容器
# 运行容器(后台模式)
docker run -d --name my-nginx -p 80:80 nginx
# 运行容器(交互模式)
docker run -it --name my-ubuntu ubuntu:24.04 /bin/bash
# 运行容器并挂载卷
docker run -d --name my-nginx \
-v /host/path:/container/path \
-p 80:80 nginx
# 运行容器并设置环境变量
docker run -d --name my-app \
-e "ENV_VAR=value" \
-p 3000:3000 myapp
# 运行容器并链接到其他容器
docker run -d --name my-app --link redis:redis myapp
列出容器
# 列出正在运行的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 列出最近创建的容器
docker ps -l
# 只显示容器 ID
docker ps -q
启动和停止容器
# 启动容器
docker start my-nginx
# 停止容器
docker stop my-nginx
# 重启容器
docker restart my-nginx
# 暂停容器
docker pause my-nginx
# 恢复暂停的容器
docker unpause my-nginx
# 强制停止容器
docker kill my-nginx
进入容器
# 使用 exec 进入正在运行的容器
docker exec -it my-nginx /bin/bash
# 使用 nsenter(需要安装)
docker run --rm -it --pid=container:my-nginx \
--privileged nicolaka/netshoot nsenter -t 1 -m -u -i -n -p
# 使用 docker attach(不推荐)
docker attach my-nginx
查看容器信息
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时跟踪
docker logs --tail 100 my-nginx # 查看最后 100 行
# 查看容器进程
docker top my-nginx
# 查看容器资源使用情况
docker stats my-nginx
# 查看容器详细信息
docker inspect my-nginx
# 查看容器端口映射
docker port my-nginx
复制文件
# 从容器复制文件到主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从主机复制文件到容器
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf
删除容器
# 删除容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 删除所有已停止的容器
docker container prune
# 强制删除所有容器
docker rm -f $(docker ps -aq)
网络操作
列出网络
docker network ls
创建网络
# 创建桥接网络
docker network create my-network
# 创建自定义子网的网络
docker network create --subnet=172.20.0.0/16 my-network
# 创建 overlay 网络(Swarm 模式)
docker network create --driver overlay --attachable my-overlay
删除网络
docker network rm my-network
查看网络详情
docker network inspect my-network
卷操作
创建卷
docker volume create my-volume
列出卷
docker volume ls
查看卷详情
docker volume inspect my-volume
删除卷
docker volume rm my-volume
# 删除所有未使用的卷
docker volume prune
Docker-Compose 常用操作
Docker Compose 文件结构
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
networks:
- my-network
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- ./app:/app
networks:
- my-network
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- my-network
volumes:
db-data:
networks:
my-network:
driver: bridge
常用命令
启动服务
# 启动所有服务
docker compose up
# 后台启动
docker compose up -d
# 重新构建镜像后启动
docker compose up --build
# 强制重新创建容器
docker compose up --force-recreate
停止服务
# 停止所有服务
docker compose stop
# 停止并删除容器
docker compose down
# 停止并删除容器、网络和卷
docker compose down --volumes
查看服务状态
# 查看运行中的服务
docker compose ps
# 查看服务日志
docker compose logs
docker compose logs -f web
docker compose logs --tail 100 app
# 查看服务资源使用
docker compose stats
管理服务
# 启动特定服务
docker compose start web
# 停止特定服务
docker compose stop web
# 重启特定服务
docker compose restart web
# 扩展服务实例
docker compose up -d --scale web=3
执行命令
# 在服务容器中执行命令
docker compose exec web bash
# 在特定服务容器中运行一次性命令
docker compose run --rm app npm install
构建服务
# 构建所有服务
docker compose build
# 构建特定服务
docker compose build web
# 不带缓存构建
docker compose build --no-cache
拉取和推送镜像
# 拉取所有服务的镜像
docker compose pull
# 推送所有服务的镜像
docker compose push
镜像与容器管理
镜像管理最佳实践
1. 使用官方镜像
# 推荐使用官方镜像作为基础
FROM node:18-alpine
# 避免使用 latest 标签
FROM node:18.19.0-alpine
2. 优化镜像大小
# 使用多阶段构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
3. 清理不必要的文件
# 在 RUN 命令中清理缓存
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 使用 .dockerignore 文件
# .dockerignore
node_modules
.git
.env
*.log
容器管理最佳实践
1. 数据持久化
# 使用卷存储数据
docker volume create app-data
docker run -d \
-v app-data:/app/data \
--name my-app myapp
# 使用绑定挂载进行开发
docker run -d \
-v $(pwd):/app \
-v /app/node_modules \
--name my-app myapp
2. 环境配置
# 使用环境变量
docker run -d \
-e "NODE_ENV=production" \
-e "DATABASE_URL=postgresql://..." \
--name my-app myapp
# 使用 env 文件
docker run -d \
--env-file .env \
--name my-app myapp
3. 健康检查
# 在 Dockerfile 中添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
4. 资源限制
# 限制 CPU 和内存
docker run -d \
--memory="512m" \
--cpus="1.0" \
--name my-app myapp
容器编排
1. 使用 Docker Compose 管理服务
# docker-compose.yml
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
networks:
- app-network
backend:
build: ./backend
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@database:5432/myapp
depends_on:
- database
networks:
- app-network
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
volumes:
postgres-data:
networks:
app-network:
driver: bridge
2. 使用环境变量文件
# .env
POSTGRES_DB=myapp
POSTGRES_USER=user
POSTGRES_PASSWORD=changeme
NODE_ENV=production
# docker-compose.yml
version: '3.8'
services:
app:
image: myapp:${VERSION:-latest}
environment:
- NODE_ENV=${NODE_ENV}
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@database:5432/${POSTGRES_DB}
参考资源
版权声明
本文采用 CC BY-SA 4.0 许可协议,转载请注明出处。
希望这篇教程对你有所帮助!如果有任何问题或建议,欢迎在评论区留言。 🐳

浙公网安备 33010602011771号