先簡單介紹下,Docker是一個工具羹唠,可以幫助我們快速構(gòu)建一個跨平臺的應(yīng)用服務(wù),可以理解為簡易版的虛擬機(jī)娄昆。那如果我們想讓docker幫我們構(gòu)建應(yīng)用服務(wù),就得告訴它怎么做缝彬,那這樣的一個操作文檔就是Dockerfile
, 它大概長這樣:
FROM microsoft/dotnet:2.1.403-sdk-bionic AS build-env
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# build runtime image
FROM microsoft/dotnet:2.1.5-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 80
ENTRYPOINT ["dotnet", "docker101.dll"]
上面雖然有很多命令萌焰,但是大家可以先不用看,今天只是一起了解下 EXPOSE
命令谷浅。
關(guān)于EXPOSE
命令,我之前學(xué)習(xí)的時候遇到下面幾個問題:
- 這樣聲明暴露端口就會把對應(yīng)端口的服務(wù)向外公開嗎扒俯?
- 如果我Docker中的服務(wù)端口在5000,但我在Dockerfile中聲明暴露80一疯,我的服務(wù)還能從外部訪問嗎撼玄?
最后經(jīng)過查閱文檔也得到了解答,順便跟大家一起分享下:
首先
EXPOSE
命令只是起到一個聲明的作用墩邀。告訴查看Dockerfile的人掌猛,這個容器想暴露80這個端口,如果你有之后一些關(guān)于容器端口的操作可以使用80端口眉睹。在宿主機(jī)上運(yùn)行Docker時并不會因為這個聲明應(yīng)用就會開啟這個端口的服務(wù)荔茬,如果你想在宿主機(jī)上訪問對應(yīng)80端口的服務(wù)是废膘,需要使用命令將端口進(jìn)行映射。
docker run -p 宿主機(jī)端口:容器端口 image
- 第二個問題慕蔚,其實已經(jīng)很明顯了丐黄,上面說到
Expose
只是起到了聲明作用,不是說我寫了80端口孔飒,這個容器就只能使用80了灌闺,如果你想5000端口也可以向外暴露,也可以使用命令:
docker run -p 宿主機(jī)端口:5000 image