02-docker查漏补缺
0. 免费容器平台,可以玩耍docker
https://labs.play-with-docker.com/
1. docker 的查漏补缺
1. docker 的 volume mount 和 bind mount 的区别和应用场景
https://docs.docker.com/get-started/06_bind_mounts/
卷挂载将数据保存在数据库中。当您需要持久性地存储应用程序数据时,卷装载是一个不错的选择。 绑定挂载是另一种挂载类型,它允许您将目录从主机的文件系统共享到容器中。在处理应用程序时,可以使用绑定挂载将源代码挂载到容器中。保存文件后,容器会立即看到您对代码所做的更改。这意味着您可以在容器中运行进程,以监视文件系统更改并对其进行响应。
2. 使用网络实现 两个容器的相互通信
https://docs.docker.com/get-started/07_multi_container/
使用网络排查工具:https://github.com/nicolaka/netshoot 可以进行排查
- 如何创建网络,
- 如何加入网络
- 如何排查网络
- --network-alias 是如何使用
3. Layer caching 图层缓存 和 .dockerignore 文件
分层的实际应用,是需要学习一个重要的课程,以帮助减少容器映像的生成时间。图层更改后,还必须重新创建所有下游图层。
修改前:
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
修改后:
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
4. Multi-stage builds 多阶段构建
在构建 React 应用程序时,你需要一个 Node 环境来将 JS 代码(通常是 JSX)、SASS 样式表等编译为静态 HTML、JS 和 CSS。如果您不进行服务器端渲染,则甚至不需要 Node 环境来进行生产构建。您可以将静态资源放在静态 nginx 容器中。
# syntax=docker/dockerfile:1
FROM node:18 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
使用 node:18 映像执行构建(最大化层缓存),然后将输出复制到 nginx 容器中。
2. docker-compose
1. 常用命令
# 在 容器名为 web 的容器中执行 ls 命令,和 docker run [container_name] [command]效果一样
docker compose run web ls
# 查看容器使用 .env 文件时候的 环境变量信息
docker compose config
# 停止容器,当您运行 docker compose down 时,不会删除撰写文件中的命名卷。如果要删除卷,则需要添加 --volumes 标志。
docker compose down
# 查看每一层的信息 底部显示底座,顶部显示最新的层
docker image history [image_name]
2. 在docker-compose 中使用 env 环境变量
https://docs.docker.com/compose/environment-variables/set-environment-variables/
重点:
- 如何定义环境变量
- 在外部文件.env中定义并使用
- 在compose.yaml 中定义并使用
- 如何查看环境变量信息
- 环境变量的覆盖顺序
3. docker compose 中的网络
https://docs.docker.com/compose/networking/ 在myapp的目录下存在 compose.yaml文件。
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
启动以后
- 创建名为的 myapp_default 网络。
- 创建名为 web 的容器。它以 web 的名字加入网络 myapp_default。
- 创建名为 db 的容器。它以 db 的名字加入网络 myapp_default。
容器间的网络通信: web 容器和db容器 均在 myapp_default 网络中,现在,每个容器都可以查找服务名称 web 或 db 获取相应容器的 IP 地址。 例如, web 的应用程序代码可以连接到 URL postgres://db:5432 (注意这里是容器的端口) 并开始使用 Postgres 数据库。
外部和容器的网络通信:
- 外部主机可以连接到 web 容器的 8000 端口。
- 外部主机可以连接到 db 容器的 8001 端口。