Docker 是一套平台即服务 (PaaS) 产品,它使用操作系统级虚拟化技术,以软件包(称为容器)的形式交付软件。这些容器可能需要相互通信,或者与 Docker 外部的服务通信。为此,我们不仅需要运行镜像,还需要公开容器的端口,使其能够被不同网络上的其他服务或容器访问。
注意: 如果您需要以 root 用户身份运行 docker,请记住在命令前面 加上 sudo 。
现在让我们看看如何在 Docker 中管理端口。
从 Docker Hub 拉取镜像:
Docker Hub 是 Docker 提供的托管仓库服务,用于查找和共享容器镜像。您可以在 Docker Hub 上托管自己的镜像,但我们将使用官方 Nginx 仓库来拉取 Nginx 的镜像,Nginx 是一个开源反向代理服务器。Docker 上的官方镜像都有一个官方镜像标签。
这个仓库包含有关 Nginx 镜像及其使用方法的所有信息。在右上角,我们看到一个 docker pull 命令,它指定了如何将镜像拉取到我们的电脑上。
步骤1.使用命令拉取Nginx镜像。
$docker pull nginx
输出:
从拉取的镜像运行容器:
当我们使用docker run命令运行容器时,它不会向外界发布任何端口。要将容器端口暴露给 Docker 外部的服务,或暴露给与容器不在同一网络的容器,请使用 –publish 或 -p 标志。
–publish 标志的典型示例:
$ docker run -p 8080:80 --name webhost -d nginx
让我们分解这个命令以便更好地理解:
-
Docker run Nginx: 将从 Nginx 镜像启动容器。
-
-p 8080:80: 将容器中的 TCP 端口 80 映射到 Docker 主机上的端口 8080。
-
–name webhost: 将我们的容器命名为 webhost,如果没有指定,docker 将为其指定一个随机名称。
-
-d:标志将以分离模式(即在后台)运行 docker。
如何知道哪个端口是暴露的?
剩下的一个问题是,_我们如何知道应该将计算机端口映射到容器中的哪个端口?_通常,此详细信息在镜像存储库中提供,或者使用inspect命令提供。
- 转到 docker hub 上的 Nginx 存储库并尝试找到公开端口部分:
- 使用 docker inspect 命令:
$docker inspect nginx
这将列出 Nginx 镜像的所有配置,从中我们可以找到 ExposedPort 属性。
第 2 步: 可以使用--format
标志过滤掉这些数据:
$ docker inspect --format="{{.ContainerConfig.ExposedPorts}}" nginx
步骤3: 现在我们确定Nginx在容器虚拟网络内的TCP端口80上运行。我们可以使用docker run命令。
$ docker run -p 8080:80 --name webhost -d nginx
步骤 4:验证 Nginx 是否在端口 8080 上运行:
创建并公开本地容器:
好吧,这很简单,让我们为 React 应用程序创建一个本地 docker 镜像并发布其端口:
步骤1:为此,我使用了一个简单的React应用程序。让我们首先初始化React应用程序:
$ npx create-react-app gfg
如果您没有安装 NodeJs,您可以从 GitHub 克隆一个 React App 项目。
步骤 2: 在项目根目录中创建一个 Dockerfile 文件。在项目根目录中创建一个名为 file 的Dockerfile文件,并粘贴以下内容:
# pull official base image
FROM node:13.12.0-alpine
# set working directory
WORKDIR /app
# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
# add app
COPY . ./
# can be skipped
EXPOSE 3000
# start app
CMD ["npm", "start"]
步骤3.构建镜像。
$ docker build -t basic-react-app .
步骤 4.运行镜像:$ docker inspect –format=”{{.ContainerConfig.ExposedPorts}}” basic-react-app
$ docker run -p 3000:3000 -d basic-react-app
这一步需要稍微解释一下。我们的 React 应用在容器内的 3000 端口上运行 -p 3000:3000 将此端口映射到主机端口。
步骤 5.在浏览器中验证
这些都是关于管理 Docker 中的端口。