Docker基础实践与应用举例

Docker 是一个轻量级容器化平台,通过将应用及其依赖打包到容器中,实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例,结合具体操作步骤:


一、基础实践

1. 快速启动一个容器
bash 复制代码
# 运行一个Nginx容器,映射宿主机80端口到容器80端口
docker run -d -p 80:80 --name my-nginx nginx
  • -d: 后台运行
  • -p: 端口映射
  • --name: 容器名称
2. 查看容器状态
bash 复制代码
docker ps -a  # 查看所有容器
docker logs my-nginx  # 查看容器日志
3. 进入容器内部
bash 复制代码
docker exec -it my-nginx /bin/bash

二、应用场景举例

1. Web 服务部署

场景 :部署一个 Python Flask 应用
步骤

  1. 编写 Dockerfile

    dockerfile 复制代码
    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY . .
    CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
  2. 构建镜像:

    bash 复制代码
    docker build -t my-flask-app .
  3. 运行容器:

    bash 复制代码
    docker run -d -p 5000:5000 my-flask-app

2. 数据库容器化

场景:运行 MySQL 数据库并持久化数据

bash 复制代码
# 创建数据卷
docker volume create mysql_data

# 启动MySQL容器
docker run -d \
  --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -v mysql_data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0
  • -v: 将容器内的 /var/lib/mysql 挂载到宿主机卷 mysql_data,实现数据持久化。

3. 多容器协作(Docker Compose)

场景:部署一个包含 Web 应用、Redis 缓存的完整服务

  1. 编写 docker-compose.yml

    yaml 复制代码
    version: '3'
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        depends_on:
          - redis
      redis:
        image: redis:alpine
        volumes:
          - redis_data:/data
    volumes:
      redis_data:
  2. 启动服务:

    bash 复制代码
    docker-compose up -d

4. 持续集成(CI/CD)

场景 :在 GitLab CI 中运行测试

示例 .gitlab-ci.yml

yaml 复制代码
test:
  image: node:16
  script:
    - npm install
    - npm test

三、进阶实践

1. 自定义网络
bash 复制代码
# 创建自定义网络
docker network create my-network

# 将容器连接到网络
docker run -d --network my-network --name app1 my-app
docker run -d --network my-network --name app2 my-app
  • 同一网络内的容器可通过容器名直接通信(如 app1 可直接访问 app2:8080)。
2. 镜像优化
  • 使用多阶段构建减少镜像体积:

    dockerfile 复制代码
    # 构建阶段
    FROM golang:1.18 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp
    
    # 运行阶段
    FROM alpine:latest
    COPY --from=builder /app/myapp /
    CMD ["/myapp"]

四、常见问题解决

  1. 容器时区问题
    Dockerfile 中设置时区:

    dockerfile 复制代码
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. 容器内存限制

    bash 复制代码
    docker run -m 512m --memory-swap 1g my-app

五、应用场景总结

场景 工具/技术 核心优势
微服务部署 Docker Compose 环境隔离,一键启动
开发环境统一 Docker镜像 消除"在我机器上能运行"问题
快速原型验证 预构建镜像(如Jupyter) 秒级启动,无需安装依赖
蓝绿部署 Docker Swarm/K8s 无缝切换,零停机更新

通过 Docker 可以实现:

  • 环境一致性:开发、测试、生产环境完全一致
  • 快速部署:镜像秒级启动,无需配置依赖
  • 资源隔离:每个容器独立运行,避免依赖冲突
  • 弹性伸缩:结合 Kubernetes 实现自动扩缩容
相关推荐
刘若水25 分钟前
Linux: 进程信号初识
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )43 分钟前
玛卡巴卡的k8s知识点问答题(六)
云原生·容器·kubernetes
rider1891 小时前
【1】搭建k8s集群系列(二进制部署)之系统初始化
云原生·容器·kubernetes
阳小江1 小时前
Docker知识点
运维·docker·容器
极客柒2 小时前
RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
服务器·docker·开源
只是橘色仍温柔2 小时前
xshell可以ssh连接,但vscode不行
运维·vscode·ssh
IT里的交易员2 小时前
【系统】换硬盘不换系统,使用WIN PE Ghost镜像给电脑无损扩容换硬盘
运维·电脑
共享家95273 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )3 小时前
玛卡巴卡的k8s知识点问答题(七)
云原生·容器·kubernetes
大刘讲IT3 小时前
制造业数字化转型:流程改造先行还是系统固化数据?基于以MTO和MTS的投资回报分析
运维·经验分享·生活·产品经理·数据可视化