本教程基于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
6.2 方案二:纯Docker命令
docker network create lnmp-net
docker run -d --name mysql --network lnmp-net \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=rootpass \
mysql:5.7
docker run -d --name php --network lnmp-net \
-v $(pwd)/html:/var/www/html \
php:7.4-fpm
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
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
七、生产环境建议
- 镜像优化
- 使用多阶段构建减少镜像体积
- 定期更新基础镜像安全补丁
- 网络隔离
- 数据安全
- 监控日志
- 集成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)深入探索更多高级特性。