docker下载镜像
docker.xuanyuan.run 当前国内比较稳的镜像,要花钱
阿里云,腾讯云只有相关厂商服务器才能访问
# 拉取镜像
docker pull docker.xuanyuan.run/library/centos:centos8
# image重命名为 centos:centos8
docker tag docker.xuanyuan.run/library/centos:centos8 centos:centos8
启动
docker run -dit --name centos centos:centos8
#-d 后台运行
#-it 以交互终端运行容器
# -t
进入容器
docker exec -it centos /bin/bash
docker run 命令说明
| 分类 | 参数 | 全称 | 说明 | 实用示例 | 备注 |
|---|---|---|---|---|---|
| 基础运行 | -d detached | 后台运行容器(守护进程模式) | docker run -d nginx | 不占用当前终端,常用 | |
| 基础运行 | --name | 给容器指定自定义名称(唯一) | docker run -d --name my-nginx nginx | 避免随机命名,方便管理 | |
| 基础运行 | -it -i | (交互模式)+ -t(分配伪终端),组合使用 | docker run -it ubuntu /bin/bash | 进入容器交互,exit 退出容器 | |
| 基础运行 | --rm | 容器停止后自动删除(临时测试专用) | docker run --rm -it alpine sh | 避免残留无用容器 | |
| 基础运行 | -e env | 设置容器内环境变量(可多次使用) | docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai mysql | 多环境变量用多个 -e | |
| 基础运行 | --restart | 容器退出后的重启策略 | docker run -d --restart always nginx | 常用值:always/on-failure/unless-stopped | |
| 网络配置 | -p publish | 端口映射:主机端口:容器端口 | docker run -d -p 8080:80 -p 8443:443 nginx | 可映射多个端口 | |
| 网络配置 | -P | 随机映射容器暴露的所有端口到主机随机端口 | docker run -d -P nginx | 少用,仅测试场景 | |
| 网络配置 | --network | 指定容器所属网络(默认 bridge) | docker run -d --network my-custom-net nginx | 自定义网络需提前创建:docker network create | |
| 网络配置 | -h hostname | 设置容器主机名 | docker run -it -h my-container ubuntu bash | 容器内执行 hostname 可验证 | |
| 数据持久化 | -v volume | 数据卷挂载:主机路径:容器路径 [: 权限] | docker run -d -v /host/nginx/conf:/etc/nginx/conf.d:ro nginx ro | 表示只读挂载 | |
| 数据持久化 | -v(匿名卷) | 仅指定容器路径,Docker 自动创建匿名卷 | docker run -d -v /var/lib/mysql mysql | 数据保存在 Docker 内置卷中 | |
| 数据持久化 | --mount | 更规范的挂载方式(功能同 -v,语法更清晰) | docker run -d --mount type=bind,source=/host/conf,target=/etc/nginx/conf.d nginx | 生产环境推荐 | |
| 资源限制 | -m /--memory | 限制容器最大内存(单位:b/k/m/g) | docker run -d -m 1g nginx | 超出限制容器会被 OOM 终止 | |
| 资源限制 | --cpus | 限制容器使用的 CPU 核心数(支持小数) | docker run -d --cpus 2 mysql --cpus 0.5 | 表示占用半核 | |
| 资源限制 | --cpu-shares | CPU 权重(相对值,仅 CPU 紧张时生效) | docker run -d --cpu-shares 1024 nginx | 默认值 1024,值越高优先级越高 | |
| 权限 / 用户 | --user/-u | 指定容器运行的用户(ID / 用户名) | docker run -it --user 1000 ubuntu bash | 避免 root 权限风险 | |
| 权限 / 用户 | --privileged | 赋予容器宿主机的 root 权限(慎用) | docker run -d --privileged nginx | 突破容器隔离,仅特殊场景使用 | |
| 日志 / 输出 | --log-driver | 指定容器日志驱动 | docker run -d --log-driver json-file nginx | 常用:json-file(默认)/syslog/journald | |
| 日志 / 输出 | -q quiet | 仅输出容器 ID | docker run -d -q nginx | 适合脚本批量处理 | |
| 镜像 / 命令 | --pull | 拉取镜像策略:always/never/missing | docker run --pull always nginx always | 强制拉取最新镜像 | |
| 镜像 / 命令 | --entrypoint | 覆盖镜像的默认入口命令 | docker run -it --entrypoint sh nginx | 替换镜像默认的启动命令 |
docker compose 命令说明
优势
- 同时启动多个容器组件
- 便于维护
备注: 底层是依赖docker run 命令
1. 基础使用说明
# 启动所有容器(后台运行)
docker-compose up -d
# 停止所有容器
docker-compose down
# 查看所有容器日志
docker-compose logs -f
2. docker-compose.yml
docker 容器启动配置说明文件,方便维护
# 指定Compose文件的版本(需与Docker引擎版本兼容,3.8是较新的稳定版本)
version: '3.8'
# 定义所有服务(每个服务对应一个容器)
services:
# 服务名称:mysql(自定义,容器间可通过该名称访问)
mysql:
# 指定运行容器的镜像:mysql 8.0版本(无tag默认拉取latest)
image: mysql:8.0
# 指定容器名称(避免Docker自动生成随机名称,方便管理)
container_name: app-mysql
# 配置容器所属网络(关联下方定义的app-net网络)
networks:
- app-net
# 端口映射:主机端口3306 → 容器端口3306
ports:
- "3306:3306"
# 数据卷挂载:主机目录/host/mysql → 容器目录/var/lib/mysql(持久化MySQL数据)
volumes:
- /host/mysql:/var/lib/mysql
# 设置容器内的环境变量(MySQL核心配置)
environment:
# 设置MySQL root用户密码
- MYSQL_ROOT_PASSWORD=123456
# 容器启动时自动创建名为app_db的数据库
- MYSQL_DATABASE=app_db
# 容器重启策略:始终重启(容器退出/宿主机重启后自动启动)
restart: always
# 服务名称:node(Node.js后端服务)
node:
# 指定Node.js镜像版本为18
image: node:18
# 容器名称:app-node
container_name: app-node
# 关联app-net网络(与mysql容器互通)
networks:
- app-net
# 端口映射:主机3000端口 → 容器3000端口(后端服务端口)
ports:
- "3000:3000"
# 挂载主机/host/node目录到容器/app目录(挂载后端代码,方便热更新)
volumes:
- /host/node:/app
# 后端服务的环境变量(配置数据库连接)
environment:
# 数据库主机地址:直接用mysql服务名(Compose自动解析为容器IP)
- DB_HOST=mysql
# 数据库端口
- DB_PORT=3306
# 重启策略:始终重启
restart: always
# 启动依赖:先启动mysql服务,再启动node服务(仅保证启动顺序,不保证mysql就绪)
depends_on:
- mysql
# 服务名称:nginx(前端反向代理服务)
nginx:
# 指定轻量级nginx镜像(alpine版本体积更小)
image: nginx:alpine
# 容器名称:app-nginx
container_name: app-nginx
# 关联app-net网络(与node容器互通)
networks:
- app-net
# 端口映射:主机80端口 → 容器80端口(HTTP服务端口)
ports:
- "80:80"
# 挂载主机Nginx配置目录到容器配置目录(自定义反向代理规则)
volumes:
- /host/nginx/conf:/etc/nginx/conf.d
# 重启策略:始终重启
restart: always
# 启动依赖:先启动node服务,再启动nginx服务
depends_on:
- node
# 定义自定义网络(Compose会自动创建,所有服务接入该网络后可通过服务名互通)
networks:
# 网络名称:app-net(自定义),默认使用bridge驱动
app-net:
# 可省略驱动配置,默认bridge;如需自定义可加:
# driver: bridge
docker 网络
网络管理基础命令
| 命令 | 说明 | 示例 |
|---|---|---|
| docker network ls | 列出所有网络 | docker network ls |
| docker network create | 创建一个新网络 | docker network create mynet |
| docker network inspect | 查看网络的详细信息(JSON) | docker network inspect mynet |
| docker network rm | 删除一个或多个网络 | docker network rm mynet |
| docker network prune | 删除所有未使用的网络 | docker network prune |
网络模式
常用
- bridge 默认
- overlay 分配子网
驱动类型|说明|适用场景
---|---|---
bridge(默认)| 创建虚拟网桥,容器连接到该网桥,通过 NAT 与外网通信。适合单机容器间通信。| 单机开发/测试,默认网络。
overlay |跨主机的虚拟网络,支持多机容器间通信。需配合 Swarm 或外部键值存储。| 能够给容器分配子网,在同一个宿主机内,容器能通过子网相互访问
host| 容器直接使用宿主机的网络栈,不隔离网络。性能最高,但端口冲突风险大。| 需要极致网络性能的场景(如网络流量监控)。
none| 容器无网络接口,完全隔离。| 对安全性要求极高、无需网络的容器。
macvlan| 为容器分配物理网络的 MAC 地址,使其像独立物理机一样接入网络。 |需要容器直接使用物理网络 IP 的 legacy 应用。
ipvlan| 类似 macvlan,但共享 MAC 地址,更节省 IP 资源。 |大规模容器部署,MAC 地址有限的环境。
创建网络
docker network create \ # 创建 Docker 网络
--subnet 192.168.0.0/24 \ # 指定网络子网为 192.168.0.0/24,即可用 IP 范围为 192.168.0.1~254
--ip-range 192.168.0.128/25 \ # 限制容器自动分配的 IP 范围为 192.168.0.128/25(128~255),仅使用后半段
--gateway 192.168.0.1 \ # 设置网关为 192.168.0.1(通常位于子网起始位置)
my-limited # 网络名称,后续可通过此名称使用该网络