Docker 全栈开发与部署实战教程

本教程基于Ubuntu系统,涵盖Docker核心概念、镜像/容器管理、数据持久化、多容器编排及生产级项目部署,提供纯Docker命令DockerCompose两种方案,帮助开发者快速掌握容器化技术。

一、Docker安装与环境配置

1.1 安装Docker引擎

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
 # 安装依赖
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
 # 添加官方GPG密钥
curl-fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg--dearmor-o
 /usr/share/keyrings/docker-archive-keyring.gpg
 # 设置稳定版仓库
echo "deb [arch=$(dpkg--print-architecture) signed-by=/usr/share/keyrings/docker-archive
keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release-cs) stable" | sudo tee
 /etc/apt/sources.list.d/docker.list > /dev/null
 # 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
 # 验证安装
sudo docker run hello-world

 

1.2 安装Docker Compose

# 下载最新二进制文件(替换版本号)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

二、核心概念速览

概念 说明 类比
镜像(Image) 只读模板,包含应用代码和运行环境 虚拟机ISO文件
容器(Container) 镜像的运行实例,可读写、独立隔离 正在运行的虚拟机
仓库(Registry) 存储和分发镜像的平台(如Docker Hub) 应用商店
数据卷(Volume) 持久化存储容器数据,独立于容器生命周期 移动硬盘
网络(Network) 容器间通信的虚拟通道(支持bridge/host/none等模式) 局域网

三、镜像与容器管理

3.1 镜像操作

# 拉取镜像
docker pull nginx:latest

# 构建自定义镜像
# Dockerfile示例:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

# 构建命令
docker build -t my-nginx:v1 .

# 导出/导入镜像
docker save my-nginx:v1 > my-nginx.tar
docker load < my-nginx.tar

3.2 容器操作

# 启动容器
docker run -d --name my-nginx -p 8080:80 my-nginx:v1

# 进入容器
docker exec -it my-nginx /bin/bash

# 查看运行状态
docker ps -a

# 停止/删除容器
docker stop my-nginx && docker rm my-nginx

# 持久化数据
docker run -d -v /host/path:/container/path mysql:latest

四、数据卷与迁移

4.1 数据卷管理

# 创建命名卷
docker volume create app_data

# 备份数据卷
docker run --rm -v app_data:/data -v $(pwd):/backup ubuntu tar czvf /backup/backup.tar.gz /data

# 恢复数据卷
docker run --rm -v app_data:/data -v $(pwd):/backup ubuntu tar xzvf /backup/backup.tar.gz -C /data

4.2 容器迁移

# 导出容器为镜像
docker commit my-nginx my-nginx:migrate
docker save my-nginx:migrate > my-nginx-migrate.tar

# 新服务器导入
scp my-nginx-migrate.tar user@new-server:/path/
docker load < my-nginx-migrate.tar
docker run -d -p 8080:80 my-nginx:migrate

五、Docker Compose编排

5.1 Compose文件示例

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - php

  php:
    image: php:7.4-fpm
    volumes:
      - ./html:/var/www/html

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

5.2 常用命令

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重建服务
docker-compose up -d --build

六、实战:部署LNMP环境

6.1 方案一:使用Docker Compose

项目结构

lnmp/
├── docker-compose.yml
├── html/
│   └── index.php
└── mysql/
    └── init.sql

docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports: ["80:80"]
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on: [php, mysql]

  php:
    image: php:7.4-fpm
    volumes: ["./html:/var/www/html"]

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

启动验证

# 创建测试文件
echo "<?php phpinfo(); ?>" > html/index.php

# 启动服务
docker-compose up -d

# 访问 http://localhost

6.2 方案二:纯Docker命令

# 1. 创建网络
docker network create lnmp-net

# 2. 启动MySQL
docker run -d --name mysql --network lnmp-net \
  -v mysql_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  mysql:5.7

# 3. 启动PHP
docker run -d --name php --network lnmp-net \
  -v $(pwd)/html:/var/www/html \
  php:7.4-fpm

# 4. 配置Nginx
mkdir -p nginx/conf.d
cat > nginx/conf.d/default.conf <<EOF
server {
    listen 80;
    root /var/www/html;
    location \~ \.php$ {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    }
}
EOF

# 5. 启动Nginx
docker run -d --name nginx --network lnmp-net \
  -p 80:80 \
  -v $(pwd)/html:/var/www/html \
  -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d \
  nginx:latest

七、生产环境建议

  1. 镜像优化
    • 使用多阶段构建减少镜像体积
    • 定期更新基础镜像安全补丁
  2. 网络隔离
    • 为不同服务组创建独立网络
    • 限制容器间不必要的通信
  3. 数据安全
    • 使用命名卷代替目录挂载
    • 定期备份数据卷到云存储
  4. 监控日志
    • 集成Prometheus+Grafana监控
    • 使用ELK收集容器日志

八、附录:命令速查表

基础信息与版本

类别 命令 说明
系统信息 docker info 显示Docker系统详细信息(版本、存储驱动等)
版本查询 docker version 查看Docker客户端和服务端版本

镜像管理

类别 命令 说明
拉取镜像 docker pull <镜像名>:<标签> 从仓库下载指定镜像(默认Docker Hub)
查看镜像列表 docker images 或 docker image ls 列出本地所有镜像(含镜像ID、大小等)
构建镜像 docker build -t <镜像名>:<标签> . 根据当前目录的Dockerfile构建镜像
删除镜像 docker rmi <镜像ID> 删除指定镜像
清理未使用镜像 docker image prune -a 删除所有未被容器使用的镜像

容器操作

类别 命令 说明
运行容器 docker run -d -p 80:80 nginx 后台运行容器并映射端口
docker run -it --rm ubuntu bash 交互式运行容器,退出后自动删除
docker run -v /宿主机路径:/容器路径 挂载宿主机目录到容器(数据卷)
docker run -e KEY=VALUE 设置容器环境变量
查看容器状态 docker ps 查看运行中的容器
docker ps -a 查看所有容器(包括已停止的)
启动/停止 docker start/stop/restart <容器ID> 启动、停止或重启容器
进入容器终端 docker exec -it <容器ID> bash 进入运行中的容器执行命令
删除容器 docker rm <容器ID> 删除指定容器
docker rm $(docker ps -aq) 删除所有已停止的容器

日志与监控

类别 命令 说明
查看日志 docker logs -f <容器ID> 实时跟踪容器日志输出
资源监控 docker stats 查看容器CPU、内存、网络等资源使用情况

数据卷管理

类别 命令 说明
创建数据卷 docker volume create <卷名> 创建持久化数据卷
查看数据卷列表 docker volume ls 列出所有数据卷
删除数据卷 docker volume rm <卷名> 删除指定数据卷
docker volume prune 删除所有未使用的数据卷

网络管理

类别 命令 说明
创建网络 docker network create <网络名> 创建自定义桥接网络
连接容器到网络 docker network connect <网络名> <容器ID> 将容器加入指定网络
查看网络详情 docker network inspect <网络名> 显示网络配置和连接的容器信息

Docker Compose

类别 命令 说明
启动服务 docker-compose up -d 后台启动所有服务(根据docker-compose.yml)
停止服务 docker-compose down 停止并删除容器、网络和卷
查看服务状态 docker-compose ps 列出项目中的容器状态

系统清理

类别 命令 说明
一键清理 docker system prune -a 删除所有停止的容器、未使用的镜像、卷和网络

Dockerfile核心指令

指令 示例 说明
FROM FROM ubuntu:20.04 指定基础镜像
RUN RUN apt-get update && apt-get install -y nginx 执行命令(安装依赖等)
COPY COPY ./app /app 复制宿主机文件到镜像
EXPOSE EXPOSE 80 声明容器监听的端口
CMD CMD ["nginx", "-g", "daemon off;"] 容器启动时的默认命令

常用场景示例

场景 命令
运行Nginx并映射端口 docker run -d -p 80:80 --name my-nginx nginx
挂载MySQL数据并设置密码 docker run -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
构建并推送镜像到仓库 docker build -t myapp:v1 .
<br/>docker tag myapp:v1 user/myapp:v1
<br/>docker push user/myapp:v1

 

通过本教程,您已掌握Docker从开发到部署的全流程技能,可灵活选择Compose编排或手动管理方案。建议结合官方文档(Docker Docs)深入探索更多高级特性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注