Docker 必知必会(2)
1.概述
Docker 把"环境"变成了代码制品,把"部署"变成了拉镜像+跑容器,把"运维操作"变成了声明式配置。

2. 端口映射和容器互联
容器默认是隔离的网络环境,拥有独立的内网 IP(仅容器网络内可见),宿主机或外部设备无法直接访问容器内的服务,端口映射的作用就是将宿主机的端口与容器内的服务端口绑定,让外部请求通过宿主机端口转发到容器内部,实现外部对容器服务的访问。
多个容器需要相互协作(比如 Hadoop 的 NameNode 容器和 DataNode 容器、MySQL 容器和 Java 应用容器、Nginx 容器和后端服务容器),容器互联就是让多个容器处于同一网络域,实现容器之间通过容器名 / 别名(无需记复杂的容器内网 IP)直接通信的能力,是多容器集群架构的核心网络配置。
2.1 查看网络

2.2 网络模式
2.2.1 bridge(桥接模式)
Docker 默认的模式。给容器分配一个独立的 “小房子”(独立的网络空间、专属内网 IP),所有容器的 “小房子” 都连在宿主机的一个公共走廊(bridge 网桥) 上。走廊能让容器之间互相串门(容器互联),也能通过走廊的大门(端口映射) 让外部(宿主机 / 外网)进来找容器。
2.2.2 host(主机模式)
容器不再是独立的 “小房子”,而是直接住进了宿主机的 “大别墅”,宿主机的门牌号(IP)就是容器的门牌号,宿主机的窗户(端口)就是容器的窗户。容器用哪个端口,就直接占了宿主机的这个端口,不用任何映射,外部直接访问宿主机 IP + 端口就能找到容器。
2.2.3 none(无网络模式)
容器的 “禁闭模式”
2.3 查看 bridge 网络
docker network inspect bridge


2.4 自定义网络,解决容器间网络访问
Docker 内置 bridge 网络(默认叫 bridge)没有内置容器名的 DNS 解析功能,只能通过 IP 通信;而自定义 bridge 网络(哪怕驱动还是 bridge)默认开启了 DNS 解析,会自动把容器名映射为容器 IP,所以能 ping 通容器名。

创建自定义网络
docker network create --driver <网络模式> <网络名称>
![]()

docker network inspect <网络名称/网络id>

创建容器的时候,使用 --network 指定网络


3. Docker Compose
Docker Compose是用于定义和运行多容器应用程序的工具。通过 yml 文件定义多容器的 Docker 应用,再通过一条命令根据 yml 文件的定义去创建或管理多容器。
3.1 安装 docker compose
首先检查系统架构
uname -m
x86_64
sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
arm64
sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3.2 核心命令
| 功能描述 | V2 版本命令(2.x,无短横线) | 核心说明 & 适用场景 |
|---|---|---|
|
后台启动所有容器 |
docker compose up -d |
日常开发 / 部署最常用,后台启动所有服务,容器退出不影响终端 |
|
查看容器运行状态 |
docker compose ps |
快速检查容器是否正常运行(Up/Exit 状态) |
|
实时查看容器日志 |
docker compose logs -f |
排查问题核心命令,实时跟踪日志输出(类似 tail -f) |
|
停止所有容器(保留数据) |
docker compose stop |
临时停止容器,不删除容器 / 数据卷,重启可用 restart |
|
停止并删除容器 / 网络 |
docker compose down |
清理环境常用,停止并删除容器、网络,保留数据卷 |
|
进入指定容器 |
docker compose exec 服务名 bash |
进入容器调试(如 exec web_php bash),替代 docker exec |
|
重启所有 / 指定容器 |
docker compose restart |
重启所有容器;加「服务名」仅重启指定容器(如 restart web_nginx) |
|
校验配置文件语法 |
docker compose config |
启动前校验 docker-compose.yml,避免配置语法错误 |
|
启动前重新构建镜像 |
docker compose up -d --build |
代码 / 配置修改后,重新构建镜像并启动容器 |
|
彻底清理环境(含数据卷) |
docker compose down -v |
测试环境清理,删除容器、网络、数据卷(谨慎使用,会丢失持久化数据) |
|
仅启动指定服务 |
docker compose up -d 服务名 |
无需启动所有服务时使用(如仅启动数据库 up -d db) |
|
查看 Compose 版本 |
docker compose version |
验证安装 / 升级是否成功,V2 版本命令无 -- |
|
构建指定服务镜像 |
docker compose build 服务名 |
单独构建镜像,不启动容器 |
|
查看 Compose 管理的镜像 |
docker compose images |
列出当前 Compose 项目关联的所有镜像 |
|
暂停 / 恢复容器进程 |
docker compose pause |
临时暂停容器进程(恢复用 unpause) |
|
删除停止的容器 |
docker compose rm |
清理已停止的容器,需先执行 stop 再 rm |
3.3 编写 docker-compose.yml
3.3.1 Compose 文件完整骨架
name: myproject # 项目名,决定容器前缀和网络名(等价于 -p)
services: # 核心,定义容器
<服务名>:
# 镜像 / 构建
# 启动参数
# 网络 / 端口
# 存储
# 环境变量
# 健康检查 / 依赖
# 资源 / 日志 / 安全
volumes: # 声明命名卷(数据持久化)
<卷名>:
networks: # 声明自定义网络(网络隔离)
<网络名>:
configs: # 挂配置文件(不用 bind mount)
secrets: # 敏感信息(密码/证书)
3.3.2 全字段注释样板
name: shop # 项目名(决定容器前缀)
services:
web:
image: nginx:1.27-alpine
container_name: shop_web
build:
context: ./web
target: prod
ports:
- "127.0.0.1:80:80"
volumes:
- ./nginx/conf:/etc/nginx/conf.d:ro
- static:/usr/share/nginx/html/static
env_file: [.env]
depends_on:
api:
condition: service_healthy
restart: unless-stopped
init: true
logging:
driver: json-file
options: { max-size: "10m", max-file: "3" }
mem_limit: 256m
cpus: "0.5"
networks: [frontend]
profiles: []
api:
image: myapi:3.4
command: ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]
env_file: [.env, .env.prod]
environment:
WORKERS: "4"
volumes:
- uploads:/app/uploads
expose: ["8000"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 15s
timeout: 5s
retries: 3
start_period: 20s
restart: unless-stopped
logging: { driver: json-file, options: { max-size: "50m", max-file: "5" } }
mem_limit: 1g
cpus: "2"
networks: [frontend, backend]
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
interval: 10s
timeout: 3s
retries: 5
restart: unless-stopped
networks: [backend]
volumes:
pgdata:
static:
uploads:
networks:
frontend:
backend:
internal: true
3.4 开发 vs 生产的关键差异 Checklist
|
场景 |
开发 |
生产 |
|---|---|---|
|
代码 |
volumes: ./src:/app热更新 |
别挂,COPY 进镜像 |
|
端口 |
映射 0.0.0.0:3000:3000 |
只绑 127.0.0.1:+ 走 Nginx |
|
镜像 tag |
:dev |
锁版本号 :1.4.2,不用 :latest |
|
restart |
随便 |
unless-stopped |
|
日志 |
随便 |
必配 max-size |
|
资源 |
不限 |
必配 mem_limit/cpus |
|
密码 |
.env |
.env+ secrets:+ 不入 Git |
|
调试工具 |
profiles: [dev]挂 mailhog/adminer |
不 --profile就不起 |
4. 搭建私有仓库 register

4.1 创建 registry 容器
docker pull registry

4.2 服务端配置镜像源
修改 /etc/docker/daemon.json 文件
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": ["<宿主机ip或主机名>:5000"]
}
重启 docker 服务
systemctl restart docker
查看 docker 详情
docker info
4.3 创建数据卷
docker volume create registry

4.3 启动容器
docker run -d --name "my_registry" -p 5000:5000 -v registry:/var/lib/registry --restart=always registry:latest
![]()
浏览器访问
http://192.168.113.126:5000/v2/_catalog
4.4 docker 客户端使用指南
参考 4.2 修改 /etc/docker/daemon.json 文件的 insecure-registries
并且重启客户端 docker 服务
4.5 镜像标签
标准格式

4.6 推送和拉取私有镜像
将 vm1上面的镜像 vm2:5000/wlg/redis:6.0-alpine 推到 私有仓库



从私有仓库拉取 vm2:5000/wlg/redis:6.0-alpine 到 vm2 的本地仓库

![]()
5. 企业级镜像仓库可以使用 harbor 镜像仓库,可以图形化展示
6. 总结
Docker 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
- 点赞
- 收藏
- 关注作者
评论(0)