写给前端看的简要版 Docker 使用手册🌟

1,154 阅读4分钟

一、安装

docker-desktop

二、Node.js 应用 Docker 化

详细过程可参考: 把一个 Node.js web 应用程序给 Docker 化

即将一个 Node.js 的应用装入到 Docker 容器中,从而可以通过容器来运行这个应用。

准备 Dockerfile

在应用的根目录下创建一个 Dockerfile 文件,内容如下(假设你的 Node.js 代码不需要转换和打包,如使用了 typescript ):

 # 指定基础镜像。从这个镜像开始构建,本地没有则拉取远程
FROM node:12
​
# 指定工作目录,没有则创建
WORKDIR /app
​
# 将源代码拷贝到容器的工作目录下
COPY . .
​
# 运行命令
RUN npm install --production # 安装运行依赖
​
# 指定应用使用端口
EXPOSE 8080
​
# 指定容器的启动命令
CMD [ "node", "server.js" ] 

Docker 默认与镜像仓库使用 HTTPS 协议通信,如果需要拉取一些使用 HTTP 的内网私有仓库,则需要在 insecure-registries 中加入这个仓库地址。在 docker desktop 页面中配置如下:

截屏2021-11-25 下午3.36.51

构建镜像

在应用的根目录下运行以下命令,它将根据上面的 Dockerfile 进行构建。

docker build . -t my-app # -t 指定构建镜像的名称

即以 node:12 这个镜像为基础,将应用代码拷贝到镜像中,安装依赖,并指定启动容器的默认命令,这样我们就构建出了一个可以启动这个 Node.js 应用的新镜像!镜像里包含了我们的应用以及应用运行的环境。

Docker Hub 上有非常多的高质量的官方镜像,我们可以将它们作为基础镜像来构建我们需要的新镜像。

启动容器

使用下面的命令来启动一个应用容器:

docker run -p 49160:8080 -d my-app 

# -p 可以将本机的端口映射到容器的端口。如容器中应用运行的端口是8080,而我们想要开放的端口是49160,就可以通过 -p 49160:8080 来映射
# -d 指定容器在后台运行
# my-app 是镜像名称,也可以使用 IMAGE ID

如果需要传入环境变量,则可以运行下面的命令:

docker run --env-file env.file -p 49160:8080 -d my-app

# --env-file 读取环境变量文件

进入镜像调试

如果容器启动失败,那么我们可能需要进入到镜像中看它是否正确。运行如下命令:

docker run -it  --entrypoint="/bin/bash" my-app

# -it:获取交互式终端,通俗的说就是把容器内部的终端与当前的终端连接,与 -it 相反的是 -d 后台运行,不占用当前终端
# --entrypoint="/bin/bash": 指定启动入口
# my-app 是镜像名称

打印应用日志

# 查看运行的容器
docker ps

# 打印容器应用日志
docker logs <container-name>

截屏2021-11-25 下午2.20.00

如果需要进入到容器中,那么可以运行以下命令:

docker exec -it <container-name> /bin/bash

截屏2021-11-25 下午2.25.30

多级构建(Typescript 应用)

以一个 Typescript 应用为例,与前面不同的是,它需要先进行代码转换和打包,将 TS 语法转换为 JS,然后才能正常运行。

这里使用了多级构建,即先使用一个镜像来专门做打包,之后再用另一个镜像来运行应用。这样做的好处时可以让最后构建的 Docker 镜像体积小一点。Dockerfile 如下:

# 指定用于打包的基础镜像
FROM somerepo/node:17 as builder 
​
# 指定工作目录,没有则创建
WORKDIR /app
​
# 将源代码拷贝到容器的工作目录下
COPY . .
​
# 运行命令
RUN yarn # 安装依赖(包括 dependencies 和 devDependencies 中的依赖)
RUN yarn build # 打包
​
# 指定用于运行应用的基础镜像
FROM somerepo/node:17 
​
COPY  --from=builder /app/dist /app/ # 将前面镜像打包后的文件拷贝到当前镜像中
COPY  --from=builder /app/package.json /app/ # 拷贝前面镜像中的 package.json 文件
COPY  --from=builder /app/yarn.lock /app/ # 拷贝前面镜像中的 yarn.lock 文件
​
# 指定工作目录
WORKDIR /app 
​
# 安装运行时依赖 (只包括 dependencies 中的依赖)
RUN yarn --production
​
EXPOSE 8080
CMD ["node", "dist/main.js"]

三、Web 前端应用 Docker 化

即将 Web 前端应用进行打包构建,并将构建后的静态文件放入安装了 Web 服务器(如 Nginx)的 Docker 容器中。这样启动容器后就可以访问我们的静态文件了。

准备 Dockerfile

 # 指定用于打包的基础镜像
 FROM somerepo/node12 as builder
​
 # 指定工作目录,没有则创建
 WORKDIR /app
​
 # 将源代码拷贝到容器的工作目录下
 COPY . .
​
 # 运行命令
 RUN yarn
 RUN yarn build
​
 # 指定用于运行应用的基础镜像,以 Nginx 为例
 FROM somerepo/nginx:latest 
​
 # 将前面镜像打包后的文件拷贝到当前镜像中
 COPY  --from=builder /app/build/ /usr/share/nginx/html

其他流程就与前面的差不多了~

参考

  1. Docker Sample application
  2. 使用 Dockerfile 定制镜像
  3. nodejs-docker-webapp/