Docker 开发与使用教程 - Ubuntu 24.04 完整指南

目录

  1. 容器的概念
  2. Docker 与 Docker Compose 安装
  3. Docker 常用操作
  4. Docker-Compose 常用操作
  5. 镜像与容器管理
  6. 实用示例
  7. 最佳实践
  8. 常见问题

容器的概念

什么是容器?

容器是一种轻量级、可移植、自包含的软件打包技术,它将应用程序及其所有依赖项(库、配置文件、运行时环境等)打包在一起,确保应用在任何环境中都能以相同的方式运行。

容器的特点

  • 轻量级:共享主机操作系统内核,启动速度快,资源占用少
  • 可移植性:一次构建,到处运行(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 许可协议,转载请注明出处。


希望这篇教程对你有所帮助!如果有任何问题或建议,欢迎在评论区留言。 🐳

posted @ 2025-12-17 09:57  adgk07  阅读(3)  评论(0)    收藏  举报