云原生: 为开发朋友解答的 100 个问题

如果在 公众号 文章发现状态为 已更新, 建议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/03/22/docker-100-questions-for-developers/

1. 镜像与服务

1.1. 容器内服务监听地址 0.0.0.0

0.0.0.0 是最省事的方法。 如果不嫌弃麻烦, 程序可以自己获取网卡地址 监听本地IP

通常在开发的时候, 在本地调试喜欢用 127.0.0.1, 这种情况在本地调试是没有问题的。

但是在容器中, 所有流量是通过 外部 转发过来的。 如果使用 127.0.0.1 的话, 容器内部的 iptables 规则就是 127.0.0.1, 即 只允许容器内部流量

1.2. Docker 制作容器镜像的时候, 可以 All In One 吗??

关于这个问题, 个人觉得是可以的。

有些时候, 可以灵活一点。 这种看法是有争议的, 自行考虑。

  1. 从服务 很稳定的时候。 参考 Nginx + Php 镜像二合一 , 在这个案例中, 我认为 二者都需要使用源文件, 且 Nginx 很稳定、功能单一, 所以 Nginx 可以为从服务放在后台。

  2. 当拆分时业务管理麻烦的时候。 之前遇到一个项目总共有约 10 个组件, 而客户的部署环境网络相对独立, 且技术不高。 如果使用传统的 K8S 业务管理方式就非常的麻烦。 最后选择将所有组件合并到一个镜像中, 如果业务出现问题请求用户帮助重启服务器即可。 (并不是所有用户和互联网一样对高可用性有极高的要求)

规则约束技术, 技术服务业务 有些时候灵活一点, 没必要钻牛角尖。

02. Docker

2.1. 怎么快速启动安装一个 Docker 环境。

我个人建议选择 Ubuntu LTS 版本(当前为 Ubuntu22.04 LTS)。

安装 docker

1
2
3
apt update

apt install -y docker.io

配置 /etc/docker/daemon.json

这里有三个比较重要的字段

  1. registry-mirrors: 国内加速镜像
  2. bip: 使用 docker 启动的网络容器地址, 使用 169.xx 可以很好的避免 ABC 网络冲突。
  3. data-root: 镜像、容器的保存地方。 一般而言, /data 目录你需要额外挂载一个硬盘, 建议容量 100G
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "registry-mirrors": [
    "https://wlzfs4t4.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "bip":"169.254.31.1/24",
  "data-root": "/data/var/lib/docker"
}

重启 docker 更新配置

1
2
systemctl daemon-reload
systemctl restart docker

为什么选择 Ubuntu

  1. Ubuntu 是 Debian 系的。 大部分官方镜像都是基于 Debian 和 Alpine 制作的。 可以保持基础镜像兼容。
  2. 官方已经不再维护 CentOS。 且 CentOS 内核版本较低, 不能支持更新的 docker 行为。

2.2. docker-compose 单机容器编排神器

docker-compose 应该是单机管理 docker 应用最方便配置神器了。

  1. compose v2 已经用 go 重构了, 比之前的 python 版本兼容性好了很多, 可以在任意 linux 版本下运行, docker-compose Github 下载地址
  2. docker-compose 通常使用 YAML 格式的配置文件。
    1. 配置文件有自己的 version 字段, 不同版本支持的功能不同。 docker-compose v3 配置文档参考

以下是一个比较基础的 docker-compose.yml 配置文件, 阐释了一个 web 应用与其 db 之间的关系。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# docker-compose.yaml
version: "3.8"
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: Pgsql_Pass123
      POSTGRES_DB: appdb 
    networks:
      - mynet

  web:
    image: example.com/project/repo:v1.0.0
    environment:
      DATABASE_URL: postgres://postgres:Pgsql_Pass123@db:5432/appdb
    env_file:
      - .local.env
    volumes:
      - ./app.conf:/app/conf.d/app.conf
    depends_on:
      - db
    networks:
      - mynet

networks:
  mynet:

03. K8S

3.1. 快速部署一个 k8s 集群。

如果就是为了玩儿, 或者搭建一个 k8s 集群做开发的功能测试

  1. 机器多, 资源足, 部署完整集群, 可以考虑部署方式: https://github.com/easzlab/kubeasz
  2. 只有一台机器, 可以考虑 k3s 满足常规开发需求:
  3. 官方文档: https://k3s.io/
  4. 在 Linux 上安装 Docker + K3s 混合开发环境

3.2. k8s 集群节点位置选择, 有什么讲究?

在云上, 至少应该 跨可用区, 即 同 Region, 不同可用区。 如果有条件还可以实现 机架 级别的隔离。(我记得腾讯云是支持的)

3.3. K8S Ingress 常见问题

可以参考 Ingress 常见问题