Dockerfile的EXPOSE和Docker?Compose的ports有什么區(qū)別詳解
在容器化部署時,我們經常會在 Dockerfile 里看到:
EXPOSE 18010
同時在 docker-compose.yml 里又寫了:
ports: - "18010:18010"
這兩者看起來都涉及端口,但卻常常讓人搞不清楚它們到底有什么區(qū)別?特別是初學者看到這兩個就懵了:端口是不是重復寫了?到底哪個負責映射?寫了 EXPOSE 會不會自動對外開放端口?
一、Dockerfile 中的 EXPOSE 是什么?
EXPOSE 的作用是 聲明容器內部服務監(jiān)聽的端口,它只是一個 元數(shù)據(jù)(Metadata),用于告訴其他開發(fā)者或工具:
“這個鏡像內部有一個服務會監(jiān)聽這個端口。”
例如你的 Dockerfile 里:
EXPOSE 18010
說明:
? 這個鏡像內部有程序監(jiān)聽 18010
?但 EXPOSE 不會自動開放端口到宿主機
也就是說外界依然訪問不到此端口。
它是一種 文檔式說明,便于閱讀/維護/工具自動化。
二、Docker Compose 中的 ports 又是什么?
在 docker-compose.yml 里:
ports: - "18010:18010"
這是一個真正的 端口映射(Port Mapping):
宿主機端口 18010 ? 容器內部 18010
作用:
? 將容器內部監(jiān)聽的端口映射到宿主機
? 外部可以直接通過宿主機訪問該端口
例如:
curl http://your-server-ip:18010
不寫 ports:,容器內部服務再跑得再好,宿主機和外部是訪問不到的。
三、兩者到底有什么區(qū)別?
| 配置位置 | 是否映射到宿主機 | 是否讓外界可訪問 | 作用 |
|---|---|---|---|
| EXPOSE | ? 不映射 | ? 不可訪問 | 只是聲明/提示 |
| ports | ? 映射 | ? 可訪問 | 真正對外映射端口 |
四、端口映射
?? 如果你只是構建鏡像,在 Dockerfile 里寫:
EXPOSE 18010
是一個良好的習慣,它說明了鏡像內部的監(jiān)聽端口。
?? 但如果你要讓容器對外可訪問,則 必須在 Compose 或 docker run 時寫端口映射:
ports: - "18010:18010"
?? 只有 EXPOSE 是不會自動映射端口的!
五、實例演示
Dockerfile
FROM eclipse-temurin:17-jdk-jammy WORKDIR /app COPY hikvoice-relay-1.0-SNAPSHOT.jar /app/app.jar COPY lib/ /app/lib/ COPY AudioFile/ /app/AudioFile/ ENV LD_LIBRARY_PATH=/app/lib:/usr/lib:/usr/local/lib EXPOSE 18010 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
這里的 EXPOSE 18010 表示:
?? 鏡像內部這個服務在監(jiān)聽 18010(例如 Spring Boot 默認端口)
docker-compose.yml(關鍵部分)
你不想寫 environment 變量,而是把所有配置放到 .env 里:
version: "3.8"
services:
wvp:
network_mode: "host"
image: wvp-gb28181:latest
container_name: wvp
restart: always
env_file:
- .env
volumes:
- ./:/app/config
- ./config.json:/app/static/config.json
- /opt/media/bin/www:/opt/media/bin/www
ports:
- "18080:18080"
- "18081:18081"
- "8116:8116/udp"
hikvoice:
image: hikvoice:latest
container_name: hikvoice
restart: unless-stopped
ports:
- "18010:18010"
env_file:
- .env
這里:
? env_file: - .env 用來注入 .env 里的所有變量
? ports: - "18010:18010" 把容器內部監(jiān)聽的 18010 映射到宿主機
六、總結
| 項目 | 推薦寫法 |
|---|---|
| 表示服務監(jiān)聽端口 | EXPOSE 18010 |
| 映射端口給宿主機訪問 | ports: - "18010:18010" |
| 注入環(huán)境變量 | env_file: - .env |
到此這篇關于Dockerfile的EXPOSE和Docker Compose的ports有什么區(qū)別的文章就介紹到這了,更多相關Dockerfile的EXPOSE和Compose的ports區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
.netcore 使用surging框架發(fā)布到docker
這篇文章主要介紹了netcore 使用surging框架發(fā)布到docker,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
在Linux系統(tǒng)中使用Dockerfile創(chuàng)建Docker的完整步驟
Dockerfile是Docker用來構建鏡像的文本文件,包含自定義的指令和格式,這篇文章主要介紹了在Linux系統(tǒng)中使用Dockerfile創(chuàng)建Docker的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-11-11

