Docker容器使用手册——进阶篇(下)

目录

  • [1. 简介](#1. 简介)
  • [2. 基本概念](#2. 基本概念)
  • [3. 安装与配置](#3. 安装与配置)
  • [4. 容器管理](#4. 容器管理)
  • [5. 镜像管理](#5. 镜像管理)
  • [6. 网络配置](#6. 网络配置)
  • [7. 存储管理](#7. 存储管理)
  • [8. Docker Compose](#8. Docker Compose)
  • [9. 常见问题与解决方案](#9. 常见问题与解决方案)
  • [10. 最佳实践](#10. 最佳实践)
  • 附录:常用命令速查表

Docker容器使用手册------入门篇(上)

6. 网络配置

6.1 Docker网络类型

  1. bridge网络:默认网络模式,容器连接到docker0网桥
  2. host网络:容器直接使用宿主机网络,不进行网络隔离
  3. none网络:容器没有网络接口
  4. overlay网络:用于Docker Swarm模式下的跨主机通信
  5. macvlan网络:为容器分配MAC地址,使容器看起来像物理设备

6.2 网络管理

  1. 查看网络

    bash 复制代码
    docker network ls
    docker network inspect 网络名
  2. 创建网络

    bash 复制代码
    docker network create --driver bridge 网络名
  3. 连接容器到网络

    bash 复制代码
    docker network connect 网络名 容器名
  4. 断开容器与网络的连接

    bash 复制代码
    docker network disconnect 网络名 容器名
  5. 删除网络

    bash 复制代码
    docker network rm 网络名
    docker network prune  # 删除所有未使用的网络

6.3 容器间通信

  1. 通过网络别名通信

    bash 复制代码
    # 创建网络
    docker network create app-network
    
    # 启动MySQL容器并指定别名
    docker run -d --name mysql --network app-network --network-alias db mysql:5.7
    
    # 启动Web应用容器,可以通过db别名访问MySQL
    docker run -d --name web-app --network app-network myapp
  2. 通过--link参数(旧方式)

    bash 复制代码
    docker run -d --name mysql mysql:5.7
    docker run -d --name web-app --link mysql:db myapp

7. 存储管理

7.1 卷(Volumes)

  1. 创建卷

    bash 复制代码
    docker volume create 卷名
  2. 查看卷

    bash 复制代码
    docker volume ls
    docker volume inspect 卷名
  3. 删除卷

    bash 复制代码
    docker volume rm 卷名
    docker volume prune  # 删除所有未使用的卷
  4. 使用卷

    bash 复制代码
    docker run -d -v 卷名:容器路径 镜像名

7.2 绑定挂载(Bind Mounts)

  1. 基本语法

    bash 复制代码
    docker run -d -v 主机路径:容器路径 镜像名
  2. 示例

    bash 复制代码
    # 挂载当前目录到容器的/app目录
    docker run -d -v $(pwd):/app nginx

7.3 tmpfs挂载

  1. 基本语法

    bash 复制代码
    docker run -d --tmpfs 容器路径 镜像名
  2. 示例

    bash 复制代码
    # 在容器中创建临时文件系统
    docker run -d --tmpfs /tmp/data nginx

8. Docker Compose

8.1 什么是Docker Compose

Docker Compose是Docker官方提供的工具,用于定义和运行多容器Docker应用程序。通过YAML文件配置应用程序的服务、网络和卷。

8.2 安装Docker Compose

  1. 在Windows/macOS上:Docker Desktop已包含Docker Compose

  2. 在Linux上安装

    bash 复制代码
    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose --version

8.3 使用Docker Compose

  1. 创建docker-compose.yml文件

    yaml 复制代码
    version: '3'
    services:
      web:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./html:/usr/share/nginx/html
          - ./nginx.conf:/etc/nginx/nginx.conf
        depends_on:
          - app
      app:
        build: .
        ports:
          - "5000:5000"
        environment:
          - DB_HOST=db
          - DB_PORT=5432
        depends_on:
          - db
      db:
        image: postgres:13
        environment:
          - POSTGRES_USER=user
          - POSTGRES_PASSWORD=password
          - POSTGRES_DB=mydb
        volumes:
          - db-data:/var/lib/postgresql/data
    volumes:
      db-data:
  2. 启动服务

    bash 复制代码
    docker-compose up -d
  3. 查看服务状态

    bash 复制代码
    docker-compose ps
  4. 停止服务

    bash 复制代码
    docker-compose down
  5. 其他常用命令

    bash 复制代码
    # 构建或重新构建服务
    docker-compose build
    
    # 查看日志
    docker-compose logs
    
    # 进入容器
    docker-compose exec 服务名 /bin/bash

9. 常见问题与解决方案

9.1 镜像拉取失败

问题:无法拉取Docker镜像或拉取速度慢

解决方案

  • 配置国内镜像源(如阿里云、网易云等)
  • 检查网络连接和代理设置
  • 尝试使用不同的镜像仓库

9.2 端口冲突

问题:启动容器时提示端口已被占用

解决方案

  • 使用不同的主机端口映射:-p 8080:80
  • 停止占用端口的其他服务
  • 检查是否有其他容器在使用相同端口

9.3 容器启动失败

问题:容器启动后立即退出或启动失败

解决方案

  • 查看容器日志:docker logs 容器名
  • 检查应用配置和环境变量设置
  • 确保挂载的卷路径正确

9.4 权限问题

问题:容器内操作文件时遇到权限错误

解决方案

  • 使用-u参数指定用户ID:docker run -u $(id -u):$(id -g) 镜像名
  • 在Dockerfile中调整文件权限
  • 确保宿主机挂载目录有正确的权限

9.5 资源限制问题

问题:容器占用过多资源或性能不佳

解决方案

  • 设置资源限制:docker run --memory=1g --cpus=1 镜像名
  • 优化应用程序代码
  • 使用更轻量级的基础镜像

10. 最佳实践

10.1 镜像最佳实践

  • 使用多阶段构建:减小最终镜像体积

    dockerfile 复制代码
    FROM golang:1.16 AS builder
    WORKDIR /app
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
    
    FROM alpine:latest
    WORKDIR /root/
    COPY --from=builder /app/app .
    CMD ["./app"]
  • 使用固定版本标签:避免使用latest标签

  • 最小化镜像层数:合并RUN指令,清理临时文件

  • 使用.dockerignore文件:排除不需要的文件

  • 选择合适的基础镜像:优先选择Alpine等轻量级镜像

10.2 容器最佳实践

  • 一个容器只运行一个进程:遵循单一职责原则
  • 使用非root用户:增强安全性
  • 设置健康检查:监控容器状态
  • 使用环境变量配置应用:便于部署和维护
  • 正确处理信号:确保容器优雅退出

10.3 安全性最佳实践

  • 定期更新基础镜像:修复安全漏洞
  • 扫描镜像漏洞:使用工具如Trivy、Clair等
  • 限制容器资源:防止DoS攻击
  • 使用只读文件系统docker run --read-only 镜像名
  • 禁止容器访问敏感挂载点

10.4 性能优化

  • 使用适当的存储驱动:根据需求选择overlay2、aufs等
  • 优化卷使用:减少卷的使用或使用更快的存储
  • 合理设置容器资源限制
  • 使用缓存层:在Dockerfile中合理安排指令顺序

附录:常用命令速查表

容器操作

命令 描述
docker run [选项] 镜像名 创建并运行容器
docker ps 列出运行中的容器
docker ps -a 列出所有容器
docker start/stop/restart 容器名 启动/停止/重启容器
docker rm 容器名 删除容器
docker exec -it 容器名 命令 在运行的容器中执行命令
docker logs 容器名 查看容器日志
docker inspect 容器名 查看容器详细信息

镜像操作

命令 描述
docker pull 镜像名 拉取镜像
docker push 镜像名 推送镜像
docker build -t 镜像名 路径 构建镜像
docker images 列出本地镜像
docker rmi 镜像名 删除镜像
docker tag 源镜像 目标镜像 标记镜像
docker history 镜像名 查看镜像历史

网络操作

命令 描述
docker network ls 列出所有网络
docker network create 网络名 创建网络
docker network connect 网络名 容器名 连接容器到网络
docker network disconnect 网络名 容器名 断开容器与网络的连接
docker network inspect 网络名 查看网络详情

存储操作

命令 描述
docker volume ls 列出所有卷
docker volume create 卷名 创建卷
docker volume inspect 卷名 查看卷详情
docker volume rm 卷名 删除卷
docker volume prune 删除未使用的卷

Docker Compose操作

命令 描述
docker-compose up -d 启动服务
docker-compose down 停止并删除服务
docker-compose ps 列出服务
docker-compose logs 查看服务日志
docker-compose build 构建服务镜像
docker-compose exec 服务名 命令 在服务容器中执行命令
docker-compose restart 重启服务
相关推荐
HIT_Weston1 小时前
32、【Ubuntu】【远程开发】内网穿透:远程主机连接
linux·运维·ubuntu
_abcdef2 小时前
Kubernetes K8s
云原生·容器·kubernetes
java_logo2 小时前
Kubernetes Dashboard Docker 容器化部署指南
运维·mysql·docker·云原生·容器·kubernetes·php
编织幻境的妖2 小时前
Docker底层工作原理
运维·docker·容器
TDengine (老段)3 小时前
TDengine IDMP 赋能新能源:光伏电站智能运维实践
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
gcfer3 小时前
Docker 介绍和常用命令
运维·docker·容器
j***63083 小时前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
i***48614 小时前
Nginx中$http_host、$host、$proxy_host的区别
运维·nginx·http
chen_note5 小时前
K8s的配置存储与实战
java·容器·kubernetes·volume·k8s存储