修改Docker容器配置

运维笔记 | 📅 2020-09-18 | docker

基本上有两种方法:

  • 通过 docker update 命令
  • 通过 容器配置文件

通过 docker update

命令说明

# docker update --help
Usage:  docker update [OPTIONS] CONTAINER [CONTAINER...]

Update configuration of one or more containers

Options:
      --blkio-weight uint16        Block IO (relative weight), between 10 and 1000, or 0 to
                                   disable (default 0)
      --cpu-period int             Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int              Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int          Limit the CPU real-time period in microseconds
      --cpu-rt-runtime int         Limit the CPU real-time runtime in microseconds
  -c, --cpu-shares int             CPU shares (relative weight)
      --cpus decimal               Number of CPUs
      --cpuset-cpus string         CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string         MEMs in which to allow execution (0-3, 0,1)
      --kernel-memory bytes        Kernel memory limit
  -m, --memory bytes               Memory limit
      --memory-reservation bytes   Memory soft limit
      --memory-swap bytes          Swap limit equal to memory plus swap: '-1' to enable
                                   unlimited swap
      --restart string             Restart policy to apply when a container exits

docker update 可以修改容器的CPU、内存等资源配置,以及 restart 配置。新配置即时生效,不需要重启容器。

举例

比如我们想要使容器 “f945c69f8115” 只能使用一个CPU核心:

docker update --cpus=1 f945c69f8115

PS: –cpus=1 虽说是限制容器使用一个CPU核心,但是其限制的是资源总量,即它可能使用两个核心各50%的资源。如需指定其只能使用某个固定的核心,应使用 –cpuset-cpus 指定其可以使用的CPU

比如我们想要使容器 “f945c69f8115” 可以自己重启:

docker update --restart=always f945c69f8115

特点

如上所见,通过 docker update 我们只能修改部分配置,并不能为所欲为地修改容器配置。

但是我们其修改可以即时生效,不需要停止容器。

通过容器配置文件

我们启动容器后其配置信息会保存在配置文件中,每个容器一个文件夹,位于:

/var/lib/docker/containers/[容器ID]

说明

其中有两个文件保存了容器的相关配置:

  • hostconfig.json
  • config.v2.json

JSON格式文件,其中的内容基本可以顾名思义。

举例

假设我们要更改容器 “f945c69f8115” 的端口映射:

  1. 停止容器 “f945c69f8115”
  2. 停止docker服务
  3. 修改hostconfig.json文件的PortBindings字段
  4. 启动docker服务
  5. 启动容器 “f945c69f8115”

其中PortBindings应该长这样:

"PortBindings": {
    "8080/tcp": [
        {
            "HostIp": "",
            "HostPort": "8080"
        }
    ],
    "8090/tcp": [
        {
            "HostIp": "",
            "HostPort": "8090"
        }
    ]
}

如果修改了 hostconfig.json 也没有生效,那么可以看看 config.v2.json 里面是不是也有同样的配置没有修改

若要修改其他的配置,照猫画虎即可。

特点

通过配置文件,我们基本上能够修改所有常用的配置(为所欲为)。

但是,明显的缺点就是需要停止容器和docker服务。这在一些场景下是不可接受的。

从根源避免复杂的问题

上述两种修改配置的方法都有明显的有点和致命的缺点。实际应用场景下,很大概率都用不了。

我们应该尽量从根源(即容器设计)上避免这样复杂的情况。

比如将应用配置、数据等与容器分离,这样我们可以通过复制数据的方式轻松启动多个不同配置的容器应用,避免了“不得不修改现有容器配置”的尴尬情况。