Docker 初体验

作为一个从客户端工程师,之前并没有接触过 Docker 这类工具只是听说过,现在做了一些前端项目之后发现很多前端项目是部署在 Docker 上的,于是给了学习 Docker 的契机,这篇文章就是初始 Docker 的一些过程和体会。

在 Docker 官网 (opens new window)下载好对应的版本客户端版本,打开 Docker 客户端之后,会有默认的 Guide,这个 Guide 是个挺好的感受 Docker 的教程。

Docker 里面最重要的概念就是容器,我自己理解容器就像是个虚拟的系统一样,我们可以看它里面的文件结构,以及看这个「虚拟系统」运行时产生的日志,容器也向外暴露了自己的端口,让外部用户能够访问到它,像官方提供的这个例子里面容器暴露了 8088 端口,我们运行容器后,在浏览器访问 http://localhost:8088/ (opens new window) 就能访问容器内部署好的前端服务。

Untitled

明白了 Docker 容器概念之后,接下来看下如何运行 Docker,也就是官方 Guide 里面的第二个内容「How do I run a container」,在这个例子我们可以看到如何通过 Dockerfile 生成一个镜像。按步骤拆解说明一下

# 准备一个前端工程 (opens new window)

工程大致如下,和之前的工程不同的是当前的工程里面包含一个 Dockerfile 的文件。这个文件是创建 Docker 镜像的关键文件,如果是我们自己的工程的话,就需要创建自己的 Dockerfile

Untitled

# 构建 Docker 镜像

执行命令 docker build -t welcome-to-docker . ,问下 ChatGPT 这个命令是嘛意思,给出解释如是「使用当前目录下的 Dockerfile 构建一个 Docker 镜像,并给这个镜像打上标签 welcome-to-docker」。我现在并不理解打标签的含义,感觉有点像给镜像命名,不过也不妨碍我们可以先执行这个命令构建一下 Docker 镜像。

构建完之后本地目录并不会出现任何 Docker 的镜像,镜像会出现在 Docker 客户端的 images tab 里。

Untitled

# 运行 Docker 镜像

点击运行按钮,在 Optional Settings 里指定端口 3333。回到 Container Tab 查看,会看到和镜像对应的容器。点击端口位置,打开 http://localhost:3333/ (opens new window) 会看到已经部署在 Docker 容器里的内容。

Untitled

基本上整体配置就到这儿,还有一些额外的疑问:

Q: Docker 镜像和 Docker 容器之间的关系?

A: 镜像(Image)是容器(Container)的模板。一个容器只对应一个镜像。

Docker 镜像是一个只读的模板,创建容器时需要指定一个镜像作为基础。容器是镜像的运行实例,容器会创建一个可写层作为最上层,我们通常会在容器中安装软件、创建文件等,这些变化会记录在容器层中。

Q: 制作镜像这个过程有点疑问?我们是怎么把前端项目构建成一个 Docker 镜像的?

A: 核心还是 Dockerfile. 可以看一下示例中的 Dockerfile 的内容,并带上注释说明一下

//1. 选择官方的 node:18-alpine 镜像作为基础镜像
FROM node:18-alpine
//2. 将工作目录设置为 /app
WORKDIR /app
//3. 复制文件到工作目录。
COPY package*.json ./
COPY ./src ./src
COPY ./public ./public
//4. 按顺序执行 npm 命令
RUN npm install \
    && npm install -g serve \
    && npm run build \
    && rm -fr node_modules
//5. 导出容器的 3000 端口。
EXPOSE 3000
//6. 容器启动后,执行 serve -s build 命令,以 production 模式启动 Node 应用。
CMD [ "serve", "-s", "build" ]

我自己理解其实就是把一个前端项目拷贝到了 Docker 镜像里面,如图然后就像是安装一些必要的依赖,同时删除掉无用的依赖,最后在容器里面启动前端应用。

查看构建好正在运行的容器文件结构,可以看到之前的拷贝都生效了,所以 Dockerfile 其实就是构建镜像的一些规则文件,Dockerfile 里面的命令就是用来操作镜像内容的。

Untitled

学习 Docker 这部分内容主要是尝试理解公司的前端项目是如何部署在 Docker 上,上面这些Docker知识基本上能帮助梳理清大部分的部署流程。


关注我的微信公众号,我在上面会分享我的日常所思所想。