运维笔记 | 📅 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” 的端口映射:
hostconfig.json
文件的PortBindings
字段其中PortBindings
应该长这样:
"PortBindings": {
"8080/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
],
"8090/tcp": [
{
"HostIp": "",
"HostPort": "8090"
}
]
}
如果修改了 hostconfig.json
也没有生效,那么可以看看 config.v2.json
里面是不是也有同样的配置没有修改
若要修改其他的配置,照猫画虎即可。
通过配置文件,我们基本上能够修改所有常用的配置(为所欲为)。
但是,明显的缺点就是需要停止容器和docker服务。这在一些场景下是不可接受的。
上述两种修改配置的方法都有明显的有点和致命的缺点。实际应用场景下,很大概率都用不了。
我们应该尽量从根源(即容器设计)上避免这样复杂的情况。
比如将应用配置、数据等与容器分离,这样我们可以通过复制数据的方式轻松启动多个不同配置的容器应用,避免了“不得不修改现有容器配置”的尴尬情况。