如何用React进行Docker的详细指南

105 阅读4分钟

就在最近,我不得不使用Docker来开发我的React网络应用程序。在这里,我想给大家简单介绍一下如何实现它。首先,我们需要一个React应用。要么自己创建一个React应用,要么按照这个最小的React与Webpack设置指南。React + Webpack应用程序也可以在GitHub上找到。

注意:如果你使用create-react-app,而不是自定义的React设置(例如React与Webpack),请查看这个Docker与create-react-app教程。

在你设置好你的React项目后,在http://localhost:8080 ,看看渲染好的React应用。一切都应该按预期进行。

在我们继续使用Docker之前,我们需要修改package.json中的一行,以启动Webpack开发服务器。如果你想让开发服务器对外界开放,那么主机必须被指定为0.0.0.0,也就是说:让Docker访问它。

"start": "webpack  --host 0.0.0.0 --config ./webpack.config.js --mode development",

现在,我们将使用Docker镜像Docker容器中运送这个React应用程序。首先,创建一个所谓的Dockerfile

touch Dockerfile

并在Dockerfile中输入以下内容:

# Docker Image which is used as foundation to create
# a custom Docker Image with this Dockerfile
FROM node:10

# A directory within the virtualized Docker environment
# Becomes more relevant when using Docker Compose later
WORKDIR /usr/src/app

# Copies package.json and package-lock.json to Docker environment
COPY package*.json ./

# Installs all node packages
RUN npm install

# Copies everything over to Docker environment
COPY . .

# Uses port which is used by the actual application
EXPOSE 8080

# Finally runs the application
CMD [ "npm", "start" ]

这个Dockerfile中的所有内容都会被Docker解释器逐行读取。最后,它是创建适合你的应用程序的自定义Docker镜像的蓝图。我们在这里使用的基础镜像(这里是FROM )确保所有Node/npm命令在Docker文件中可用。否则,如果使用一个不相关的Node镜像,我们将需要在Dockerfile中自己安装Node,然后才能使用Node的特定命令

可以选择创建一个*.dockerignore文件,将文件夹和文件从Docker进程中排除。例如,node_modules不需要包含在Docker镜像中,因为它们将被安装在npm install (见Dockerfile)的进程中。因此,.dockerignore*文件的内容可以是。

node_modules

接下来,在官方Docker Hub上创建一个账户。之后,你应该有一个Docker Hub用户名,可以用来构建你的第一个Docker镜像

docker build -t <username>/my-custom-react-app .

如果这个命令之后的输出显示*"无法连接到位于unix://var/run/docker.sock的Docker守护进程。docker守护进程正在运行吗?"*,你需要确保所有与Docker相关的东西都已设置好并正常运行。即使在用docker-machine ls 打印所有Docker引擎时运行正常,你也可能需要再次为Docker引擎设置环境变量。

如果Docker镜像的构建运行成功,你应该可以用以下命令列出你的镜像:

docker images

REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
<username>/my-custom-react-app     latest              036d38e931e4        5 minutes ago       153MB
node                               alpine              532fd65ecacd        9 days ago          113MB
hello-world                        latest              fce289e99eb9        13 months ago       1.84kB

这个Docker镜像是你在Docker容器中运行一个Docker应用程序所需要的一切。一个Docker镜像可以用来启动多个Docker容器,这有助于横向扩展应用程序的规模,或以不同的容器配置来运行应用程序。现在,我们将只在这个Docker镜像的基础上运行一个Docker容器。

docker run --name my-custom-react-app -p 4680:8080 -d <username>/my-custom-react-app

这个命令用一个特定的名字、两个端口的映射和一个Docker镜像创建并运行一个Docker容器。即使Dockerfile定义了一个特定的端口,我们也可以为这个特定的Docker容器将其重定向到一个自定义端口。在创建并运行基于Docker镜像的Docker容器后,我们应该能够列出所有的Docker容器。

docker ps

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                         NAMES
ab03066fb631        <username>/my-custom-react-app     "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        0.0.0.0:4680->8080/tcp/tcp   my-custom-react-app

在我们能够在浏览器中访问我们的应用程序之前,我们需要找出我们运行的Docker引擎的IP地址。

docker-machine ip default
-> 192.168.99.100

最后你应该能够访问http://192.168.99.100:4680 。注意,你的IP地址和端口可能会有所不同。恭喜你,你已经在Docker容器中发布了你的第一个React网络应用。