Linux Opt: Centos: docker - x893675/note GitHub Wiki

docker配置

在较新的docker版本中,有两种方式可以更改dockerd的配置:

  • 创建/etc/docker/daemon.json,写入配置项
  • 使用dockerd的flag(使用dockerd --help查看dockerd的flag), 在dockerd的启动文件中加入(dockerd使用systemd托管时,使用systemctl cat docker查看服务文件)

⚠️: 以上两种方式不兼容,同一个配置在两种方式中都有定义,dockerd会启动报错

daemon.json文件的样例:

{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": { "max-size": "100m" },
    "storage-driver": "overlay2",
    "storage-opts": [ "overlay2.override_kernel_check=true" ],
    "hosts": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"]
}

daemon.json所有的参数选项:

{
  "authorization-plugins": [],
  "data-root": "",
  "dns": [],
  "dns-opts": [],
  "dns-search": [],
  "exec-opts": [],
  "exec-root": "",
  "experimental": false,
  "features": {},
  "storage-driver": "",
  "storage-opts": [],
  "labels": [],
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file":"5",
    "labels": "somelabel",
    "env": "os,customer"
  },
  "mtu": 0,
  "pidfile": "",
  "cluster-store": "",
  "cluster-store-opts": {},
  "cluster-advertise": "",
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 5,
  "default-shm-size": "64M",
  "shutdown-timeout": 15,
  "debug": true,
  "hosts": [],
  "log-level": "",
  "tls": true,
  "tlsverify": true,
  "tlscacert": "",
  "tlscert": "",
  "tlskey": "",
  "swarm-default-advertise-addr": "",
  "api-cors-header": "",
  "selinux-enabled": false,
  "userns-remap": "",
  "group": "",
  "cgroup-parent": "",
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  },
  "init": false,
  "init-path": "/usr/libexec/docker-init",
  "ipv6": false,
  "iptables": false,
  "ip-forward": false,
  "ip-masq": false,
  "userland-proxy": false,
  "userland-proxy-path": "/usr/libexec/docker-proxy",
  "ip": "0.0.0.0",
  "bridge": "",
  "bip": "",
  "fixed-cidr": "",
  "fixed-cidr-v6": "",
  "default-gateway": "",
  "default-gateway-v6": "",
  "icc": false,
  "raw-logs": false,
  "allow-nondistributable-artifacts": [],
  "registry-mirrors": [],
  "seccomp-profile": "",
  "insecure-registries": [],
  "no-new-privileges": false,
  "default-runtime": "runc",
  "oom-score-adjust": -500,
  "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],
  "runtimes": {
    "cc-runtime": {
      "path": "/usr/bin/cc-runtime"
    },
    "custom": {
      "path": "/usr/local/bin/my-runc-replacement",
      "runtimeArgs": [
        "--debug"
      ]
    }
  },
  "default-address-pools":[
    {"base":"172.80.0.0/16","size":24},
    {"base":"172.90.0.0/16","size":24}
  ]
}

参考链接

containerd

  1. containerd release 页面下载最新 release 包

    1. wget https://github.com/containerd/containerd/releases/download/v1.4.3/cri-containerd-cni-1.4.3-linux-amd64.tar.gz
    2. wget https://download.fastgit.org/containerd/containerd/releases/download/v1.4.3/cri-containerd-cni-1.4.3-linux-amd64.tar.gz
  2. tar -C / -xzf cri-containerd-cni-1.4.3-linux-amd64.tar.gz

    1. 注意PATH 环境变量是否有/usr/local/bin:/usr/local/sbin
  3. 生成 containerd 配置

    1. mkdir -pv /etc/containerd

    2. containerd config default > /etc/containerd/config.toml

    3. 配置文件说明如下:

      version = 2
      # root用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据。每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件
      root = "/var/lib/containerd"
      # state 用来保存临时数据,包括 sockets、pid、挂载点、运行时状态以及不需要持久化保存的插件数据
      state = "/run/containerd"
      plugin_dir = ""
      disabled_plugins = []
      required_plugins = []
      # Containerd 是容器的守护者,一旦发生内存不足的情况,理想的情况应该是先杀死容器,而不是杀死 Containerd。所以需要调整 Containerd 的 OOM 权重,减少其被 OOM Kill 的几率。最好是将 oom_score 的值调整为比其他守护进程略低的值。这里的 oom_socre 其实对应的是 /proc/<pid>/oom_socre_adj
      # 在计算最终的 badness score 时,会在计算结果是中加上 oom_score_adj ,这样用户就可以通过该在值来保护某个进程不被杀死或者每次都杀某个进程。其取值范围为 -1000 到 1000。
      
      # 如果将该值设置为 -1000,则进程永远不会被杀死,因为此时 badness score 永远返回0。
      
      # 建议 Containerd 将该值设置为 -999 到 0 之间。如果作为 Kubernetes 的 Worker 节点,可以考虑设置为 -999
      oom_score = 0
      
      [grpc]
        address = "/run/containerd/containerd.sock"
        tcp_address = ""
        tcp_tls_cert = ""
        tcp_tls_key = ""
        uid = 0
        gid = 0
        max_recv_message_size = 16777216
        max_send_message_size = 16777216
      
      [ttrpc]
        address = ""
        uid = 0
        gid = 0
      
      [debug]
        address = ""
        uid = 0
        gid = 0
        level = ""
      
      [metrics]
        address = ""
        grpc_histogram = false
      
      [cgroup]
        path = ""
      
      [timeouts]
        "io.containerd.timeout.shim.cleanup" = "5s"
        "io.containerd.timeout.shim.load" = "5s"
        "io.containerd.timeout.shim.shutdown" = "3s"
        "io.containerd.timeout.task.state" = "2s"
      
      [plugins]
        [plugins."io.containerd.gc.v1.scheduler"]
          pause_threshold = 0.02
          deletion_threshold = 0
          mutation_threshold = 100
          schedule_delay = "0s"
          startup_delay = "100ms"
        [plugins."io.containerd.grpc.v1.cri"]
          disable_tcp_service = true
          stream_server_address = "127.0.0.1"
          stream_server_port = "0"
          stream_idle_timeout = "4h0m0s"
          enable_selinux = false
          selinux_category_range = 1024
          sandbox_image = "k8s.gcr.io/pause:3.2"
          stats_collect_period = 10
          systemd_cgroup = false
          enable_tls_streaming = false
          max_container_log_line_size = 16384
          disable_cgroup = false
          disable_apparmor = false
          restrict_oom_score_adj = false
          max_concurrent_downloads = 3
          disable_proc_mount = false
          unset_seccomp_profile = ""
          tolerate_missing_hugetlb_controller = true
          disable_hugetlb_controller = true
          ignore_image_defined_volumes = false
          [plugins."io.containerd.grpc.v1.cri".containerd]
            snapshotter = "overlayfs"
            default_runtime_name = "runc"
            no_pivot = false
            disable_snapshot_annotations = true
            discard_unpacked_layers = false
            [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
              runtime_type = ""
              runtime_engine = ""
              runtime_root = ""
              privileged_without_host_devices = false
              base_runtime_spec = ""
            [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
              runtime_type = ""
              runtime_engine = ""
              runtime_root = ""
              privileged_without_host_devices = false
              base_runtime_spec = ""
            [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
              [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
                runtime_type = "io.containerd.runc.v2"
                runtime_engine = ""
                runtime_root = ""
                privileged_without_host_devices = false
                base_runtime_spec = ""
                [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
              [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
                runtime_type = "io.containerd.kata.v2"
          [plugins."io.containerd.grpc.v1.cri".cni]
            bin_dir = "/opt/cni/bin"
            conf_dir = "/etc/cni/net.d"
            max_conf_num = 1
            conf_template = ""
          [plugins."io.containerd.grpc.v1.cri".registry]
            [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
              [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
                endpoint = ["https://registry-1.docker.io"]
          [plugins."io.containerd.grpc.v1.cri".image_decryption]
            key_model = ""
          [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
            tls_cert_file = ""
            tls_key_file = ""
        [plugins."io.containerd.internal.v1.opt"]
          path = "/opt/containerd"
        [plugins."io.containerd.internal.v1.restart"]
          interval = "10s"
        [plugins."io.containerd.metadata.v1.bolt"]
          content_sharing_policy = "shared"
        [plugins."io.containerd.monitor.v1.cgroups"]
          no_prometheus = false
        [plugins."io.containerd.runtime.v1.linux"]
          shim = "containerd-shim"
          runtime = "runc"
          runtime_root = ""
          no_shim = false
          shim_debug = false
        [plugins."io.containerd.runtime.v2.task"]
          platforms = ["linux/amd64"]
        [plugins."io.containerd.service.v1.diff-service"]
          default = ["walking"]
        [plugins."io.containerd.snapshotter.v1.devmapper"]
          root_path = ""
          pool_name = ""
          base_image_size = ""
          async_remove = false
    4. systemctl daemon-reload && systemctl start containerd --now

    docker使用containerd

    1. 更新dockerd的启动命令,换成 dockerd --containerd /run/containerd/containerd.sock --cri-containerd
    2. 使用 docker run 启动的容器可以使用 ctr -n moby c ls查看
⚠️ **GitHub.com Fallback** ⚠️