20230318--Docker Compose配置文件詳解

Docker Compose配置文件是Docker Compose的核心,用于定義服務(wù)宿礁、網(wǎng)絡(luò)和數(shù)據(jù)卷案铺。格式為YAML,默認(rèn)路徑為./docker-compose.yml窘拯,可以使用.yml或.yaml擴展名红且,目前Compose配置文件格式的最新版本為V3坝茎。


Docker Compose配置文件詳解.png

一)version

Docker Compose版本主要有1, 2, 2.x, and 3.x涤姊,以下表格是docker-compose支持的docker版本。

Docker Compose file format Docker Engine release
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
# docker-compose version
docker-compose version 1.26.0, build d4451659
docker-py version: 4.2.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

1.Version 2.x

通過YAML的根配置項version來指定嗤放,具體配置如version: '2'或version: '2.1'等思喊。
必須在Compose配置文件根選項指定版本號,并且主版本數(shù)字為2次酌,且所有服務(wù)必須在services配置項下聲明恨课。1.6.0+版本的Compose都支持V2舆乔,Docker Engine的版本需要1.10.0+版本。
支持?jǐn)?shù)據(jù)卷和網(wǎng)絡(luò)的配置剂公。
默認(rèn)情況下希俩,每個容器都加入了應(yīng)用范圍的默認(rèn)網(wǎng)絡(luò),并且可以在與服務(wù)名稱相同的主機名下發(fā)現(xiàn)纲辽。很大程度上links不是必要的颜武。
V2中加入了環(huán)境變量替換。

2.Version 3.x

最新版本拖吼,也是推薦使用版本鳞上,推出該版的目的是為了在Compose和Docker Engine的swarm模式之間形成交叉兼容。通過YAML的根配置項version來指定吊档,具體配置如version: '3'或version: '3.1'等篙议。

在指定Compose配置文件要使用的版本時,需同時指定主版本數(shù)字和次版本數(shù)字怠硼。如果未給定次版本數(shù)字鬼贱,則默認(rèn)使用0而不是最新版本,因此將不支持再更高版本中才加入的新功能拒名。比如version: '3'吩愧,使用的是3.0版本而不是目前最新的3.9版本

二)networks

通過頂層networks配置項可以指定要創(chuàng)建的網(wǎng)絡(luò)。

# docker network inspect docker_redis_network
[
    {
        "Name": "docker_redis_network",
        "Id": "74f09926f4d034f2ae63ff1a46590d883562e711814a0dcce7e683284e407c31",
        "Created": "2023-03-13T09:50:44.80943824+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "91abfc78b2fecc20f5fe2fdfdd575b0b30b9a5e1a3ec8fb459a336fb287e9be7": {
                "Name": "docker_redis_1",
                "EndpointID": "812224986f60105aa06b201b47a4568a38379e2a07ae5f942c3fcb6125b8aa5a",
                "MacAddress": "02:42:ac:15:00:02",
                "IPv4Address": "172.21.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "redis_network",
            "com.docker.compose.project": "docker",
            "com.docker.compose.version": "1.26.0"
        }
    }
]

1.Name

為該網(wǎng)絡(luò)設(shè)置一個自定義名稱增显。

networks:
  network1:
    name: my-app-net

2.Driver

指定該網(wǎng)絡(luò)所要使用的驅(qū)動雁佳。默認(rèn)驅(qū)動取決于所使用的Docker Engine的配置方式,但是在大多數(shù)情況下同云,單個主機上用的bridge糖权,Swarm上用的overlay。
docker網(wǎng)絡(luò)模式主要有Host炸站、Container星澳、None、Bridge旱易、overlay
Host:容器不會虛擬出自己的網(wǎng)卡禁偎、配置主機的IP,而是使用宿主機的IP和端口阀坏;
Container:創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡如暖,配置自己的IP,而是和一個指定的容器共享IP忌堂、端口的范圍盒至;
None:該模式關(guān)閉了容器的網(wǎng)絡(luò)功能;
Bridge:默認(rèn)為該模式,橋接枷遂,此模式會為每一個容器分配樱衷,設(shè)置IP等,并將容器連接到虛擬網(wǎng)橋docker0酒唉,通過docker0 網(wǎng)橋以及iptables nat表配置與宿主機通信矩桂;
overlay:overlay驅(qū)動在一個swarm中的多個節(jié)點之間創(chuàng)建一個命名網(wǎng)絡(luò)。

networks:
  network1:
    driver: overlay

3.EnableIPv6

在該網(wǎng)絡(luò)上啟用IPv6網(wǎng)絡(luò)(如果要使用enable_ipv6配置項痪伦,則需要使用V2版Compose配置文件)耍鬓。

4.IPAM

指定自定義IPAM配置。
有以下配置選項:
driver:自定義IPAM驅(qū)動以代替默認(rèn)驅(qū)動流妻。
config:包含零個或多個配置塊的列表牲蜀,每個配置塊可以有以下配置選項。
subnet:設(shè)置表示網(wǎng)段的CIDR格式的子網(wǎng)绅这。
gateway:設(shè)置表示網(wǎng)段的子網(wǎng)掩碼涣达。僅適用于V2版Compose配置文件

networks:
  network1:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

5.Internal

指定是否創(chuàng)建一個與外部隔離的overlay網(wǎng)絡(luò)。默認(rèn)情況下证薇,Docker也會將橋接網(wǎng)絡(luò)連接到它以提供外部連接度苔。如果要創(chuàng)建一個與外部隔離的overlay網(wǎng)絡(luò),需將此配置項設(shè)置為true浑度。

6.Attachable

指定是否允許除服務(wù)之外的獨立容器連接到該網(wǎng)絡(luò)寇窑。僅在driver設(shè)置為overlay時使用。如果設(shè)置為true箩张,則除了服務(wù)之外的獨立容器也可以連接到該網(wǎng)絡(luò)甩骏。如果獨立容器連接到了overlay網(wǎng)絡(luò),那它可以與那些也從其他Docker守護(hù)進(jìn)程連接到overlay網(wǎng)絡(luò)的服務(wù)和獨立容器進(jìn)行通信先慷。

networks:
  mynet1:
    driver: overlay
    attachable: true

7.Options

以鍵值對的形式指定用來傳遞給該網(wǎng)絡(luò)所使用的驅(qū)動的列表選項饮笛。這些選項取決于驅(qū)動,可以參考驅(qū)動程序文檔论熙。

 networks:
   mynet1:
     driver_opts:
       foo: "bar"
       baz: 1

8.Labels

將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中福青。可以使用數(shù)組或字典兩種格式脓诡。

networks:
  mynet1:
    labels:
      - "com.example.description=Financial transaction network"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"

9.external

指定該網(wǎng)絡(luò)是否是外部網(wǎng)絡(luò)无午。如果設(shè)置為true,則指定該網(wǎng)絡(luò)是在Compose外部創(chuàng)建的祝谚。由于docker-compose up不會嘗試創(chuàng)建該網(wǎng)絡(luò)宪迟,如果該網(wǎng)絡(luò)不存在則會引發(fā)錯誤。在3.3及以下版本的Compose配置文件格式中踊跟,external配置項不能與包括driver踩验、driver_opts、ipam和internal等在內(nèi)的其他網(wǎng)絡(luò)配置項同時使用商玫,在3.4及以上版本中則沒有此限制箕憾。

三)volumes

在services中可以聲明并直接創(chuàng)建數(shù)據(jù)卷,但是從整體規(guī)劃以及實現(xiàn)多個服務(wù)重用的需要拳昌,通過頂層volumes配置項定義數(shù)據(jù)卷更規(guī)范袭异,并且頂層volumes配置項定義的數(shù)據(jù)卷可以使用命令行或API輕松進(jìn)行檢索和檢查。

docker cli查看定義的數(shù)據(jù)卷
# docker volume inspect docker_redis_vol
[
    {
        "CreatedAt": "2023-03-13T09:50:45+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "docker",
            "com.docker.compose.version": "1.26.0",
            "com.docker.compose.volume": "redis_vol"
            "com.example.department": "IT/Ops",
            "com.example.description": "Database volume",
            "com.example.label-with-empty-value": ""
        },
        "Mountpoint": "/var/lib/docker/volumes/docker_redis_vol/_data",
        "Name": "docker_redis_vol",
        "Options": null,
        "Scope": "local"
    }
]

1.Driver

指定該數(shù)據(jù)卷所要使用的數(shù)據(jù)卷驅(qū)動炬藤。默認(rèn)為Docker Engine中配置使用的無論哪種驅(qū)動御铃,大多數(shù)情況下為local驅(qū)動。如果驅(qū)動不可用沈矿,則引擎會在docker-compose up嘗試創(chuàng)建數(shù)據(jù)卷時返回一個錯誤上真。

volumes:
  redis_vol:
    driver: local

2.Labels

將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中「牛可以使用數(shù)組或字典兩種格式睡互。

volumes:
  redis_vol:
    labels:
      - "com.example.description=Database volume"
      - "com.example.department=IT/Ops"
      - "com.example.label-with-empty-value"

3.Name

為該數(shù)據(jù)卷設(shè)置一個自定義名稱。

volumes:
  redis_vol:
    name: my-app-data

4.Options

以鍵值對的形式指定用來傳遞給該數(shù)據(jù)卷所使用的數(shù)據(jù)卷驅(qū)動的列表選項陵像。

掛在nfs文件目錄/docker/example
volumes:
  redis_vol:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

5.external

指定該數(shù)據(jù)卷是否是外部數(shù)據(jù)卷就珠。如果設(shè)置為true,則指定該數(shù)據(jù)卷是在Compose外部創(chuàng)建的醒颖。由于docker-compose up不會嘗試創(chuàng)建該數(shù)據(jù)卷妻怎,如果該數(shù)據(jù)卷不存在則會引發(fā)錯誤。在3.3及以下版本的Compose配置文件格式中泞歉,external配置項不能與包括driver逼侦、driver_opts和labels在內(nèi)的其他數(shù)據(jù)卷配置項同時使用,在3.4及以上版本中則沒有此限制腰耙。

四)services

一個比較完整的docker service詳細(xì)配置內(nèi)容
# docker inspect bf76418f4ab6
[
    {
        "Id": "bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980",
        "Created": "2023-03-16T23:29:10.470087985Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "redis-server",
            "/etc/redis/redis.conf"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1858657,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-03-16T23:29:11.643425486Z",
            "FinishedAt": "0001-01-01T00:00:00Z",
            "Health": {
                "Status": "unhealthy",
                "FailingStreak": 11,
                "Log": [
                    {
                        "Start": "2023-03-17T07:39:42.421770498+08:00",
                        "End": "2023-03-17T07:39:42.520933467+08:00",
                        "ExitCode": -1,
                        "Output": "OCI runtime exec failed: exec failed: unable to start container process: exec: \"curl\": executable file not found in $PATH: unknown"
                    },
                    {
                        "Start": "2023-03-17T07:41:12.527300168+08:00",
                        "End": "2023-03-17T07:41:12.618813081+08:00",
                        "ExitCode": -1,
                        "Output": "OCI runtime exec failed: exec failed: unable to start container process: exec: \"curl\": executable file not found in $PATH: unknown"
                    },
                    {
                        "Start": "2023-03-17T07:42:42.624743521+08:00",
                        "End": "2023-03-17T07:42:42.721798285+08:00",
                        "ExitCode": -1,
                        "Output": "OCI runtime exec failed: exec failed: unable to start container process: exec: \"curl\": executable file not found in $PATH: unknown"
                    },
                    {
                        "Start": "2023-03-17T07:44:12.725901737+08:00",
                        "End": "2023-03-17T07:44:12.800762299+08:00",
                        "ExitCode": -1,
                        "Output": "OCI runtime exec failed: exec failed: unable to start container process: exec: \"curl\": executable file not found in $PATH: unknown"
                    },
                    {
                        "Start": "2023-03-17T07:45:42.80707081+08:00",
                        "End": "2023-03-17T07:45:42.958008502+08:00",
                        "ExitCode": -1,
                        "Output": "OCI runtime exec failed: exec failed: unable to start container process: exec: \"curl\": executable file not found in $PATH: unknown"
                    }
                ]
            }
        },
        "Image": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
        "ResolvConfPath": "/var/lib/docker/containers/bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980/hostname",
        "HostsPath": "/var/lib/docker/containers/bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980/hosts",
        "LogPath": "/var/lib/docker/containers/bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980/bf76418f4ab69dff5892b1f53adcddbb5add2b4ed7b610359c1405a4dc7ab980-json.log",
        "Name": "/docker_redis_1",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "docker_redis_vol:/data:rw",
                "/root/docker/redis.conf:/etc/redis/redis.conf:rw"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {
                    "max-file": "10",
                    "max-size": "200k"
                }
            },
            "NetworkMode": "docker_redis_network",
            "PortBindings": {
                "6379/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "6379"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": [],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [
                "8.8.8.8"
            ],
            "DnsOptions": null,
            "DnsSearch": [
                "example.com"
            ],
            "ExtraHosts": [
                "somehost:162.242.195.82",
                "otherhost:50.31.209.229"
            ],
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "host",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": [
                "label:user:USER",
                "label:role:ROLE",
                "label=disable"
            ],
            "Tmpfs": {
                "/run": ""
            },
            "UTSMode": "",
            "UsernsMode": "host",
            "ShmSize": 67108864,
            "Sysctls": {
                "net.core.somaxconn": "1024",
                "net.ipv4.tcp_syncookies": "0"
            },
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "default",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": null,
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": [
                {
                    "Name": "nproc",
                    "Hard": 65535,
                    "Soft": 65535
                },
                {
                    "Name": "nofile",
                    "Hard": 40000,
                    "Soft": 20000
                }
            ],
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ],
            "Init": true
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/fdd65a7b3dd4e2d3904fe5d38656a6ef209f838f7fb4eff82387cf58e63fd665-init/diff:/var/lib/docker/overlay2/f40df8bee5df02139b8842b49df50204a209f20ea55e90c5e679155d47f14052/diff:/var/lib/docker/overlay2/f262ebf707b84c4aaf15ad95fb5f3762a3de9f00e3fa80eb200e7d2974b47a71/diff:/var/lib/docker/overlay2/d7238b1c8820c4cc6345df77afe0f8a7d7074dee0d1483b78f794aca4730ab5c/diff:/var/lib/docker/overlay2/fea75636a73398782f4ce75ae4f2649857dcda914ac1a8978ede85dc612b7dd6/diff:/var/lib/docker/overlay2/03388075cf9f8ecaab7c1f0cd70bac5ca3cde5398b5b6910ff56400cac7d7c66/diff:/var/lib/docker/overlay2/04f6770d7d1240e23c1dff9a8302a998ecd99506d465de78ecc42463282538d3/diff",
                "MergedDir": "/var/lib/docker/overlay2/fdd65a7b3dd4e2d3904fe5d38656a6ef209f838f7fb4eff82387cf58e63fd665/merged",
                "UpperDir": "/var/lib/docker/overlay2/fdd65a7b3dd4e2d3904fe5d38656a6ef209f838f7fb4eff82387cf58e63fd665/diff",
                "WorkDir": "/var/lib/docker/overlay2/fdd65a7b3dd4e2d3904fe5d38656a6ef209f838f7fb4eff82387cf58e63fd665/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "docker_redis_vol",
                "Source": "/var/lib/docker/volumes/docker_redis_vol/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "rw",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "bind",
                "Source": "/root/docker/redis.conf",
                "Destination": "/etc/redis/redis.conf",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "bf76418f4ab6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "affinity:container==c3d082140a07e61738084405939a53abd90ad6d56450d70ca4347e3307db167c",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.6",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
                "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
            ],
            "Cmd": [
                "redis-server",
                "/etc/redis/redis.conf"
            ],
            "Healthcheck": {
                "Test": [
                    "CMD",
                    "curl",
                    "-f",
                    "http://localhost"
                ],
                "Interval": 90000000000,
                "Timeout": 10000000000,
                "Retries": 3
            },
            "Image": "redis:latest",
            "Volumes": {
                "/data": {},
                "/etc/redis/redis.conf": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "com.docker.compose.config-hash": "09aaa807a7358703e1a719294b4167daaf9bc7845d27af4dc753fa3407204e78",
                "com.docker.compose.container-number": "1",
                "com.docker.compose.oneoff": "False",
                "com.docker.compose.project": "docker",
                "com.docker.compose.project.config_files": "docker-compose.yml",
                "com.docker.compose.project.working_dir": "/root/docker",
                "com.docker.compose.service": "redis",
                "com.docker.compose.version": "1.26.0",
                "com.example.department": "Finance",
                "com.example.description": "Accounting webapp",
                "com.example.label-with-empty-value": ""
            },
            "StopSignal": "SIGUSR1",
            "StopTimeout": 90
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "275e877c39e11427ae85da409e87d6853571c86a215293f1367c7e8d9521b81a",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "6379/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "6379"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "6379"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/275e877c39e1",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "docker_redis_network": {
                    "IPAMConfig": null,
                    "Links": [
                        "redis_1:redis_1"
                    ],
                    "Aliases": [
                        "bf76418f4ab6",
                        "redis",
                        "alias3",
                        "alias1"
                    ],
                    "NetworkID": "74f09926f4d034f2ae63ff1a46590d883562e711814a0dcce7e683284e407c31",
                    "EndpointID": "caf62eb67f9f47fe3de0cb65900cfcead21e3c6d935778e22874953a1c9be9f3",
                    "Gateway": "172.21.0.1",
                    "IPAddress": "172.21.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:15:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

1.build

在創(chuàng)建服務(wù)時使用

services:
  webapp:
    build: ./dir
1)context

指定包含Dockerfile的目錄路徑或git倉庫url偿洁。該目錄是發(fā)送給Docker守護(hù)進(jìn)程(Daemon)的構(gòu)建上下文(context)。當(dāng)配置的值是相對路徑時沟优,它將被解釋為相對于Compose配置文件的路徑涕滋。

services:
  webapp:
    build:
      context: ./dir
2)dockerfile

指定Dockerfile文件。Compose會使用指定的Dockerfile文件構(gòu)建鏡像挠阁,但必須要指定構(gòu)建上下文路徑宾肺。

services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
3)args

添加構(gòu)建參數(shù),這些只能在構(gòu)建過程中訪問的環(huán)境變量侵俗。

services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        - buildno=1
        - gitcommithash=cdc3b19
4)cache_from

指定緩存解析鏡像列表

services:
  webapp:
    build:
      context: ./dir
      cache_from:
        - alpine:latest
        - corp/web_app:3.14
5)labels

將元數(shù)據(jù)以標(biāo)簽的形式添加到生成的鏡像中锨用。可以使用數(shù)組或字典兩種格式隘谣。推薦使用反向DNS寫法以避免和其他應(yīng)用的標(biāo)簽沖突增拥。

services:
  webapp:
    build:
      context: ./dir
      labels:
        com.example.description: "Accounting webapp"
        com.example.department: "Finance"
        com.example.label-with-empty-value: ""
6)network

設(shè)置容器網(wǎng)絡(luò)連接以獲取構(gòu)建過程中的RUN指令啄巧。

services:
  webapp:
    build:
      context: ./dir
      network: custom_network_1
7)shm_size(shared memory size)

指定容器的/dev/shm分區(qū)大小。指定的值為表示字節(jié)數(shù)的整數(shù)值或表示字節(jié)值的字符串掌栅。

services:
  webapp:
    build:
      context: ./dir
      shm_size: 10000000
8)target

指定在Dockerfile中定義的構(gòu)建階段秩仆,即鏡像只構(gòu)建到指定階段(dev、test猾封、prod等)就停止構(gòu)建澄耍。

services:
  webapp:
    build:
      context: ./dir
      target: prod

2.cap_add、cap_drop

添加或刪除容器內(nèi)核能力(capability)

容器擁有所有內(nèi)核能力
services:
  webapp:
    build:
      cap_add:
        - ALL
容器擁有刪除NET_ADMIN和SYS_ADMIN能力
services:
  webapp:
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
# docker inspect --format='{{.Name}}|''{{.HostConfig.CapAdd}}|''{{ .HostConfig.CapDrop}}' 91abfc78b2fe
/docker_redis_1|[]|[]

3.cgroup_parent

為容器指定一個可選的父控制組晌缘。

services:
  webapp:
    cgroup_parent: m-executor-abcd
# docker inspect --format='{{.Name}}|''{{.HostConfig.CgroupParent}}' 91abfc78b2fe
/docker_redis_1|

4.command

覆蓋容器啟動后默認(rèn)執(zhí)行的命令齐莲。可以寫成字符串形式磷箕。

services:
  webapp:
    command: bundle exec thin -p 3000

# docker inspect --format='{{.Name}}|''{{.Config.Cmd}}' 91abfc78b2fe
/docker_redis_1|[redis-server /etc/redis/redis.conf]

5.config

為每個服務(wù)授予對配置(configs)的訪問權(quán)限选酗。支持short和long兩種格式的語法。
注意:該配置(config)必須已存在或者在堆棧文件頂層configs配置項中定義岳枷,否則堆棧部署將失敗星掰。

1)Short syntax

Short syntax僅指定config名稱來授予容器訪問config的權(quán)限并將其掛載到容器的/<config_name>上。source名稱和目標(biāo)掛載點都設(shè)置為config名稱嫩舟。

services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true
2)Long syntax

Long syntax提供了在服務(wù)的任務(wù)容器內(nèi)如何創(chuàng)建config的更多粒度:
source:Docker中存在的config名稱氢烘。
target:指定要掛載到服務(wù)的任務(wù)容器的文件的路徑加名稱。如果未指定家厌,默認(rèn)為/播玖。
uid和gid:指定服務(wù)的任務(wù)容器所擁有的該文件的UID或GID。如果在LInux中未指定饭于,兩者都默認(rèn)為0蜀踏。不支持Windows。
mode:以八進(jìn)制表示法指定要掛載到服務(wù)的任務(wù)容器的文件權(quán)限掰吕。例如果覆,0444代表可讀。默認(rèn)值就為0444殖熟。config內(nèi)容已掛載到臨時文件系統(tǒng)中局待,所以不可寫,如果設(shè)置了可寫位將被忽略菱属∏ィ可以設(shè)置可執(zhí)行位。如果不熟悉UNIX文件權(quán)限模式纽门,可以使用權(quán)限計算器 薛耻。

services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

6.container_name

指定自定義容器的名稱,而不是使用默認(rèn)名稱赏陵。因為Docker容器的名稱必須唯一饼齿,所以為一個服務(wù)指定了自定義容器名稱后饲漾,該服務(wù)不能進(jìn)行擴展。如果嘗試為該服務(wù)擴容將會導(dǎo)致錯誤缕溉。

services:
  webapp:
    container_name: my-web-container

# docker inspect --format='{{.Name}}' 91abfc78b2fe
/docker_redis_1

7.credential_spec

配置托管服務(wù)帳戶的憑據(jù)規(guī)格(credential spec)考传。此選項僅用于使用Windows容器的服務(wù)。credential_spec配置必須采用file://或registry://格式倒淫。使用file:時,引用的文件必須存在于Docker數(shù)據(jù)目錄的CredentialSpecs子目錄中败玉,在Windows上敌土,Docker數(shù)據(jù)目錄默認(rèn)為C:\ProgramData\Docker\。以下示例從名為C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json的文件加載憑證規(guī)格:

services:
  myservice:
    image: myimage:latest
    credential_spec:
      file: my-credential-spec.json
services:
  myservice:
    image: myimage:latest
    credential_spec:
      config: my_credential_spec
 
configs:
  my_credentials_spec:
    file: ./my-credential-spec.json|

8.depends_on

指定服務(wù)之間的依賴關(guān)系运翼,解決服務(wù)啟動先后順序問題返干。指定服務(wù)之間的依賴關(guān)系,將會導(dǎo)致以下行為:
docker-compose up以依賴順序啟動服務(wù)血淌。
docker-compose up SERVICE會自動包含SERVICE的依賴項矩欠。
docker-compose stop以依賴順序停止服務(wù)。
但是服務(wù)不會等待該服務(wù)所依賴的服務(wù)完全啟動或停止之后才啟動或停止悠夯。

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
使用docker-compose up啟動時會先啟動db和redis癌淮,最后才啟動web。
使用docker-compose up web啟動web時沦补,也會啟動db和redis乳蓄,因為在web服務(wù)中指定了依賴關(guān)系。
使用docker-compose stop在停止時也在web之前先停止db和redis夕膀。

9.deploy

指定部署和運行服務(wù)的相關(guān)配置虚倒。該配置僅在swarm mode下生效,并只能通過docker stack deploy命令部署产舞,docker-compose up和docker-compose run命令將被忽略魂奥。

services:
  redis:
    image: redis:alpine
    deploy:
      replicas: 6
      placement:
        max_replicas_per_node: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

deploy配置項中包含endpoint_mode、labels易猫、mode耻煤、placement、max_replicas_per_node准颓、replicas违霞、resources、restart_policy瞬场、rollback_config买鸽、update_config等子配置項。

# docker service inspect 3x9ypsh2sx5a
[
    {
        "ID": "3x9ypsh2sx5amr4wrs1or2zt8",
        "Version": {
            "Index": 40
        },
        "CreatedAt": "2023-03-16T07:34:04.154820913Z",
        "UpdatedAt": "2023-03-16T07:34:04.154820913Z",
        "Spec": {
            "Name": "sharp_mendeleev",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "redis:latest@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339",
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "Architecture": "arm64",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "386",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "mips64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "ppc64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "s390x",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        }
    }
]
1)endpoint_mode

為外部客戶端連接到swarm指定服務(wù)發(fā)現(xiàn)方式:
endpoint_mode: vip:Docker為服務(wù)分配了一個前端的虛擬IP贯被,客戶端通過該虛擬IP訪問網(wǎng)絡(luò)上的服務(wù)眼五。Docker在客戶端和服務(wù)的可用工作節(jié)點之間進(jìn)行路由請求妆艘,而無須關(guān)系有多少節(jié)點正在參與該服務(wù)或這些節(jié)點的IP地址或者端口。這是默認(rèn)設(shè)置看幼。
endpoint_mode: dnsrr:DNS輪詢(DNSRR)批旺,Docker設(shè)置服務(wù)的DNS條目,以便對服務(wù)名稱的DNS查詢返回IP地址列表诵姜,并且客戶端通過輪詢的方式直接連接到其中之一汽煮。

version: "3.2"
services:
  wordpress:
    ...
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip
默認(rèn)為endpoint_mode: vip
# docker service inspect --format='{{.Spec.TaskTemplate.ContainerSpec.Image}}----''{{.Spec.EndpointSpec.Mode}}' 3x9ypsh2sx5a
redis:latest@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339----vip
2)labels

指定服務(wù)的標(biāo)簽。這些標(biāo)簽僅在服務(wù)上設(shè)置棚唆,而不在服務(wù)的任何容器上設(shè)置暇赤。

version: "3.8"
services:
  web:
    image: web
    deploy:
      labels:
        com.example.description: "This label will appear on the web service"
默認(rèn)Lables為空
# docker service inspect --format='{{.Spec.TaskTemplate.ContainerSpec.Image}}----''{{.Spec.Labels}}' 3x9ypsh2sx5a
redis:latest@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339----map[]
3)mode

指定服務(wù)的容器副本模式∠瑁可以為:
global:每個swarm節(jié)點只有一個該服務(wù)容器鞋囊。
replicated:整個集群中存在指定份數(shù)的服務(wù)容器副本,為默認(rèn)值瞎惫。

services:
  worker:
    image: dockersamples/examplevotingapp_worker
    deploy:
      mode: global
# docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' 3x9ypsh2sx5a
1
4)placement

指定constraints和preferences溜腐。constraints可以指定只有符合要求的節(jié)點上才能運行該服務(wù)容器,preferences可以指定容器分配策略瓜喇。例如挺益,指定集群中只有滿足node.rolemanager和engine.labels.operatingsystemubuntu 18.04條件的節(jié)點上能運行db服務(wù)容器,并且在滿足node.labels.zone的節(jié)點上均勻分配:

services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - "node.role==manager"
          - "engine.labels.operatingsystem==ubuntu 18.04"
        preferences:
          - spread: node.labels.zone
# docker service inspect --format '{{.Spec.TaskTemplate.Placement.Platforms}}' 3x9ypsh2sx5a
[{amd64 linux} { linux} { linux} {arm64 linux} {386 linux} {mips64le linux} {ppc64le linux} {s390x linux}]
5)max_replicas_per_node

如果服務(wù)的容器副本模式為replicated(默認(rèn))乘寒,可以指定每個節(jié)點上運行的最大容器副本數(shù)量矩肩。當(dāng)指定的容器副本數(shù)量大于最大容器副本數(shù)量時,將引發(fā)no suitable node (max replicas per node limit exceed)錯誤肃续。

version: "3.8"
services:
  worker:
    ...
    deploy:
      mode: replicated
      replicas: 6
      placement:
        max_replicas_per_node: 1
6)replicas

如果服務(wù)的容器副本模式為replicated(默認(rèn))黍檩,指定運行的容器副本數(shù)量。

services:
  worker:
    ...
    deploy:
      mode: replicated
      replicas: 6
# docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' 3x9ypsh2sx5a
7)resources

配置資源限制始锚。例如刽酱,指定redis服務(wù)使用的cpu份額為25%到50%,內(nèi)存為20M到50M:
在V3版Compose配置文件中的改變:resources取代了V3版之前的Compose配置文件中舊的資源限制的配置項瞧捌,包括cpu_shares棵里、cpu_quota、cpuset姐呐、mem_limit殿怜、memswap_limit、mem_swappiness曙砂。
在非swarm mode容器上設(shè)置資源限制:此處的resources配置項只有用于deploy配置項之下和swarm mode头谜。如果要在非swarm mode部署中設(shè)置資源限制,需使用V2版Compose配置文件中CPU鸠澈、memory和其他資源的配置項柱告。

services:
  redis:
    ...
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
# docker service inspect --format '{{.Spec.TaskTemplate.Resources.Limits}}---{{.Spec.TaskTemplate.Resources.Reservations}}' 3x9ypsh2sx5a
{0 0 0}---{0 0 []}
8)restart_policy

指定容器的重啟策略怀浆。代替restart辜妓。有以下配置選項:
condition:重啟策略。值可以為none躲叼、on-failure或any绊率,默認(rèn)為any促脉。
delay:嘗試重啟的等待時間助币。指定為持續(xù)時間(durations)猴蹂。默認(rèn)值為0。
max_attempts:重啟最多嘗試的次數(shù)窒所,超過該次數(shù)將放棄鹉勒。默認(rèn)為永不放棄。如果在window配置的時間之內(nèi)未成功重啟墩新,則此次嘗試不計入max_attempts的值贸弥。
window:在決定重啟是否成功之前的等待時間窟坐。指定為持續(xù)時間(durations)海渊。默認(rèn)值為立即決定。
例如哲鸳,指定重啟策略為失敗時重啟臣疑,等待5s,重啟最多嘗試3次徙菠,決定重啟是否成功前的等待時間為120s:

services:
  redis:
    ...
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
# docker service inspect --format '{{.Spec.TaskTemplate.RestartPolicy.Condition}},''{{.Spec.TaskTemplate.RestartPolicy.Delay}},'{{.Spec.TaskTemplate.RestartPolicy.MaxAttempts}}'' 3x9ypsh2sx5a
any,5s,0
9)rollback_config

配置在更新失敗的情況下如何回滾服務(wù)讯沈。有以下配置選項:
parallelism:一次回滾的容器數(shù)量。如果設(shè)置為0婿奔,則所有容器同時回滾缺狠。
delay:每個容器組之間的回滾所等待的時間。默認(rèn)值為0s萍摊。
failure_action:回滾失敗后的行為挤茄。有continue和pause兩種,默認(rèn)值為pause冰木。
monitor:每次任務(wù)更新后監(jiān)視失敗的時間(ns|us|ms|s|m|h)穷劈。默認(rèn)值為0s。
max_failure_ratio:在回滾期間能夠容忍的最大失敗率踊沸。默認(rèn)值為0歇终。
order:設(shè)置回滾順序。stop-first為在開啟新任務(wù)之前停止舊任務(wù)逼龟,start-first為首先啟動新任務(wù)评凝,和正在運行任務(wù)短暫重疊,默認(rèn)值為stop-first腺律。

            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
# docker service inspect --format '{{index .Spec.RollbackConfig}}' 3x9ypsh2sx5a
{1 0s pause 5s 0 stop-first}
10)update_config

配置如何更新服務(wù)肥哎。該配置對滾動更新很有用辽俗。有以下配置選項:
parallelism:一次更新的容器數(shù)量。
delay:更新一組容器之間的等待時間篡诽。
failure_action:更新失敗后的行為崖飘。有continue、rollback和pause三種杈女,默認(rèn)值為pause朱浴。
monitor:每次任務(wù)更新后監(jiān)視失敗的時間(ns|us|ms|s|m|h)。默認(rèn)值為0s达椰。
max_failure_ratio:在更新期間能夠容忍的最大失敗率翰蠢。
order:設(shè)置更新順序。stop-first為在開啟新任務(wù)之前停止舊任務(wù)啰劲,start-first為首先啟動新任務(wù)梁沧,和正在運行任務(wù)短暫重疊,默認(rèn)值為stop-first蝇裤。注意該配置項在3.4版的配置文件格式中加入廷支,僅支持3.4或更高版本。
例如栓辜,指定每次更新2個容器恋拍,更新等待時間10s,更新順序為先停止舊任務(wù)再開啟新任務(wù):

services:
  vote:
    ...
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
# docker service inspect --format '{{index .Spec.UpdateConfig}}' 3x9ypsh2sx5a
{1 0s pause 5s 0 stop-first}
11)Not supported for docker stack deploy

以下為支持docker-compose up和docker-compose run藕甩,不支持docker stack deploy或deploy配置項的配置項:

build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode

10.devices

指定設(shè)備映射列表施敢。與Docker客戶端create的--device選項類似。

  devices:
    - "/dev/ttyUSB0:/dev/ttyUSB0"
# docker inspect --format '{{.HostConfig.Devices}}' 241f80a43637
[]

11.dns

自定義DNS服務(wù)器狭莱〗┩蓿可以是一個值或一個列表。例如:

services:
  redis:
    ...
    dns: 8.8.8.8
    
    dns:
      - 8.8.8.8
      - 9.9.9.9
# docker inspect --format '{{.HostConfig.Dns}}' b03c7080b0b6
[8.8.8.8]

12.dns_search

自定義DNS搜索域腋妙∧梗可以是一個值或一個列表。例如:
services:
redis:
...
dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com
# docker inspect --format '{{.HostConfig.DnsSearch}}' 1c705ea79a52
[example.com]

13.entrypoint

覆蓋默認(rèn)的入口命令辉阶。注意設(shè)置entrypoint會覆蓋所有在服務(wù)鏡像上使用Dockerfile的ENTRYPOINT指令設(shè)置的默認(rèn)入口命令先壕,并清除掉服務(wù)鏡像上任何使用Dockerfile的CMD指令設(shè)置的啟動容器時默認(rèn)執(zhí)行的命令∽惶穑可以寫成字符串形式垃僚,例如:

services:
  redis:
    ...
    entrypoint: /code/entrypoint.sh
也可以寫成JSON數(shù)組形式,例如:
    entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
# docker inspect --format '{{.Config.Entrypoint}}' 1c705ea79a52
[docker-entrypoint.sh]

14.env_file

從文件中獲取環(huán)境變量规辱∽还祝可以是一個值或一個列表。例如:

services:
  redis:
    ...
    env_file: .env

    env_file:
      - ./common.env
      - ./apps/web.env
      - /opt/runtime_opts.env

如果指定了Compose配置文件,env_file路徑為相對于該文件所在目錄的路徑改淑。如果環(huán)境文件中設(shè)置有與environment選項同名的變量碍岔,將以后者為準(zhǔn),無論這些變量的值是空還是未定義朵夏。其中環(huán)境文件每行都以VAR=VAL格式聲明環(huán)境變量蔼啦,以#開頭的行被解析為注釋,和空行一樣將被忽略仰猖。環(huán)境文件示例如下:

# Set Rails/Rack environment
RACK_ENV=development

如果變量的值被引號引起來(通常是shell變量)捏肢,則引號也包含在傳遞給Compose的值中。如果以列表的形式同時指定了多個環(huán)境文件饥侵,列表中文件的順序?qū)τ诮o多次出現(xiàn)的環(huán)境變量確定值十分重要鸵赫,且列表中的文件是從上到下處理的。如果指定了多個環(huán)境文件且有至少兩個文件聲明了相同名稱但不同值的環(huán)境變量躏升,那么指定列表中順序靠下的文件將覆蓋順序靠上的文件中的相同名稱的環(huán)境變量的值辩棒。例如:

services:
  some-service:
    env_file:
      - a.env
      - b.env

如果a.env中有VAR=1,b.env中有VAR=2膨疏,則最終$VAR=2一睁。
注意:這里所說的環(huán)境變量是針對宿主機的Compose而言的,如果在服務(wù)中指定了build配置項成肘,那么這些變量并不會進(jìn)入構(gòu)建過程中卖局,如果要定義構(gòu)建時用的環(huán)境變量首選build的arg子選項斧蜕。

15.environment

設(shè)置環(huán)境變量双霍。可以使用數(shù)組或字典兩種格式批销。任何布爾類型的值都必須用引號引起來洒闸,以便解析器將它們解釋為字符串。值設(shè)置了鍵沒設(shè)置值的環(huán)境變量可以在運行Compose的主機環(huán)境中解析它們的值均芽,這對于使用密鑰和特定于主機的值用處很大丘逸。例如:

services:
  some-service:
    environment:
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:
  
    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET

注意:這里所說的環(huán)境變量是針對宿主機的Compose而言的,如果在服務(wù)中指定了build配置項掀宋,那么這些變量并不會進(jìn)入構(gòu)建過程中深纲,如果要定義構(gòu)建時用的環(huán)境變量首選build的arg子選項。

# docker inspect --format '{{.Config.Env}}' 1c705ea79a52
[affinity:container==b03c7080b0b697c58833d7ee59a74301dd76e46655c994befc1eca99ef760e03 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin GOSU_VERSION=1.12 REDIS_VERSION=6.2.6 REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab]

16.expose

暴露指定端口劲妙,但不映射到宿主機湃鹊,只被連接的服務(wù)訪問。只能指定內(nèi)部端口镣奋。例如:

services:
  some-service:
    expose:
      - "3000"
      - "8000"
# docker inspect --format '{{.Config.ExposedPorts}}' 1c705ea79a52
map[6379/tcp:{}]

17.external_links

鏈接到docker-compose.yml外部的容器币呵,甚至并非Compose管理的外部容器,特別是對于提供共享或公共服務(wù)的容器侨颈。在同時指定容器名稱和鏈接別名(CONTAINER:ALIAS)時余赢,external_links與舊版本中的配置項links有類似的語義芯义。例如:

services:
  some-service:
    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql

注意:Compose項目里面的容器連接到外部容器的前提條件是外部容器中必須至少有一個容器連接到與項目內(nèi)的服務(wù)的同一個網(wǎng)絡(luò)里面。建議使用networks代替舊版本中的配置項Links妻柒。
使用docker stack deploy時的注意事項:在swarm mode下部署堆棧時扛拨,external_links配置項將被忽略。

# docker inspect --format '{{.NetworkSettings.Networks.docker_redis_network.Links}}'  f43a1da40a04
[redis_1:redis_1]

18.extra_hosts

添加主機名到IP的映射举塔。使用和Docker客戶端中的--add-host的參數(shù)一樣的值鬼癣。例如:

services:
  some-service:
    extra_hosts:
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"

會在啟動后的服務(wù)容器中的/etc/hosts文件中添加如下兩條具有主機名和IP地址的條目:

162.242.195.82  somehost
50.31.209.229   otherhost
# docker inspect --format '{{.HostConfig.ExtraHosts}}' 5ed09a98c65d
[somehost:162.242.195.82 otherhost:50.31.209.229]

19.healthcheck

配置運行檢查以確定服務(wù)容器是否健康。支持以下配置選項:
test:指定健康檢測的方法啤贩。
interval:啟動容器到進(jìn)行健康檢查的間隔時間以及兩次健康檢查的間隔時間待秃。
timeout:單次健康檢查的超時時間,超過該時間該次健康檢查失敗痹屹。
retries:健康檢查失敗后的最大重試次數(shù)章郁,重試了最大次數(shù)依然失敗,容器將被視為unhealthy志衍。
start_period:為需要時間引導(dǎo)的容器提供的初始化時間暖庄,在此期間檢查失敗將不計入最大重試次數(shù),但是如果在啟動期間健康檢查成功楼肪,則會將容器視為已啟動培廓,并且所有連續(xù)失敗將計入最大重試次數(shù)。
其中interval春叫、timeout和start_period都被指定為持續(xù)時間(durations)肩钠。start_period是在3.4版的配置文件格式中加入。test必須是字符串或JSON數(shù)組格式暂殖。如果是JSON數(shù)組格式价匠,第一項必須是NONE、CMD或CMD-SHELL其中之一呛每。如果是字符串格式踩窖,則等效于指定CMD-SHELL后跟該字符串的JSON數(shù)組格式。

例如以下示例晨横,指定檢測方法為訪問http://localhost洋腮,健康檢查間隔時間為1m30s,健康檢查超時時間為10s手形,重試次數(shù)為3啥供,啟動容器后等待健康檢查的初始化時間為40s:

services:
  some-service:
    healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"]
    interval: 1m30s
    timeout: 10s
    retries: 3
    start_period: 40s

例如以下示例,兩種形式等效:

test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1

使用disable: true可以設(shè)置鏡像禁用所有健康檢查叁幢,相對于test: ["NONE"]滤灯。例如:

services:
  some-service:
    healthcheck:
      disable: true
# docker inspect --format '{{.Config.Healthcheck}}' f1b65c983797
{[CMD curl -f http://localhost] 1m30s 10s 0s 3}

            "Healthcheck": {
                "Test": [
                    "CMD",
                    "curl",
                    "-f",
                    "http://localhost"
                ],
                "Interval": 90000000000,
                "Timeout": 10000000000,
                "Retries": 3
            },

20.image

指定要從中啟動容器的鏡像。可以寫倉庫/標(biāo)簽(repository/tag)或鏡像ID鳞骤。示例如下:

services:
  redis:
    image: redis:latest
    
    image: redis
    image: ubuntu:18.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd

如果鏡像不存在窒百,Compose會自動拉取鏡像,除非指定了build豫尽,這種情況下會使用指定選項構(gòu)建鏡像并給鏡像打上指定標(biāo)簽篙梢。

# docker inspect --format '{{.Config.Image}}' f1b65c983797
redis:latest

21.init

在容器內(nèi)運行一個初始化程序以轉(zhuǎn)發(fā)信號并獲取進(jìn)程。設(shè)置為true即可為服務(wù)啟動此功能美旧。例如:

version: "3.7"
services:
  web:
    image: alpine:latest
    init: true

注意:默認(rèn)使用的初始化二進(jìn)制文件是Tini渤滞,并安裝在主機守護(hù)進(jìn)程的/usr/libexec/docker-init×裥幔可以通過Daemon configuration file中的init-path將守護(hù)進(jìn)程配置為使用自定義的初始化二進(jìn)制文件 妄呕。

# docker inspect --format '{{.HostConfig.Init}}' 77a502571344
true

22.isolation

指定容器的隔離技術(shù)。Linux上只支持default值嗽测。Windows上支持default绪励、process和hyperv這三個值。

services:
  web:
    isolation: default
# docker inspect --format '{{.HostConfig.Isolation}}'  6d497ef22a13
default

23.labels

將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中唠粥∈栉海可以使用數(shù)組或字典兩種格式。例如:

services:
  web:
    labels:
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
# docker inspect --format '{{.Config.Labels}}' 6d497ef22a13
map[com.docker.compose.config-hash:cfba4c9fafbd05de296e709055a74dfd9391f7de20e9c3f25cdc49801db6393b com.docker.compose.container-number:1 com.docker.compose.oneoff:False com.docker.compose.project:docker com.docker.compose.project.config_files:docker-compose.yml com.docker.compose.project.working_dir:/root/docker com.docker.compose.service:redis com.docker.compose.version:1.26.0 com.example.department:Finance com.example.description:Accounting webapp com.example.label-with-empty-value:]

24.links

警告:--link是Docker的遺留功能晤愧。它最終可能會被刪除大莫。建議您使用用戶自定義網(wǎng)絡(luò)代替--link來進(jìn)行兩個容器間的通信。用戶自定義的網(wǎng)絡(luò)不支持--link在容器之間共享的環(huán)境變量的功能官份。但是可以使用例如數(shù)據(jù)卷之類的其他機制以更可控的方式在容器之間共享環(huán)境變量只厘。
鏈接到其他服務(wù)中的容器」嵯牛可以使用"SERVICE:ALIAS"或"SERVICE"的格式懈凹,其中SERVICE為服務(wù)名稱蜀变,ALIAS為鏈接別名悄谐。

services:
  web:
    links:
      - "db"
      - "db:database"
      - "redis"

鏈接服務(wù)的容器可以通過與別名相同的主機名訪問,如果未指定別名库北,則可以使用服務(wù)名爬舰。默認(rèn)情況下,不需要鏈接即可使服務(wù)進(jìn)行通信寒瓦,任何服務(wù)都可以使用該服務(wù)的名稱訪問任何其他服務(wù)情屹。鏈接也可以和depends_on一樣表示服務(wù)之間的依賴關(guān)系 ,因此可以確定服務(wù)啟動的順序杂腰。
注意:如果同時定義鏈接和網(wǎng)絡(luò)垃你,則它們之間具有鏈接的服務(wù)必須共享至少一個公共網(wǎng)絡(luò)才能進(jìn)行通信。
使用docker stack deploy時的注意事項:在swarm mode下部署堆棧時,links配置項將被忽略惜颇。

# docker inspect --format '{{.NetworkSettings.Networks.docker_redis_network.Links}}'  f43a1da40a04

25.logging

服務(wù)的日志配置皆刺。例如:

services:
  web:
    logging:
      driver: syslog
      options:
        syslog-address: "tcp://192.168.0.42:123"

driver配置項指定服務(wù)容器的日志驅(qū)動,與docker run中的--log-driver選項一樣凌摄。默認(rèn)值為json-file羡蛾,這里列舉三種日志驅(qū)動類型:

driver: "json-file"
driver: "syslog"
driver: "none"

使用options配置項為日志驅(qū)動指定日志記錄選項,與docker run中的--log-opt選項一樣锨亏。例如:
默認(rèn)日志驅(qū)動json-file具有限制日志存儲量的選項痴怨。例如以下示例,max-size設(shè)置最大存儲大小為200k器予,max-file設(shè)置存儲的最大文件數(shù)為10浪藻,隨著日志超過最大限制,將刪除較舊的日志文件以允許存儲新日志:

services:
  web:
    logging:
      options:
        max-size: "200k"
        max-file: "10"
            "LogConfig": {
                "Type": "json-file",
                "Config": {
                    "max-file": "10",
                    "max-size": "200k"
                }
            },
# docker inspect --format '{{.HostConfig.LogConfig}}' 38067601e2e3
{json-file map[max-file:10 max-size:200k]}

26.network_mode

設(shè)置網(wǎng)絡(luò)模式乾翔。使用和Docker客戶端中的--network的參數(shù)一樣的值珠移,格式為service:[service name]∧┤冢可以指定使用服務(wù)或者容器的網(wǎng)絡(luò)钧惧。示例如下:

services:
  redis:
    ...
    network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

注意事項:
在swarm mode下部署堆棧時,該選項將被忽略勾习。
network_mode: "host"不能與links配置項混用浓瞪。
network_mode不能與networks配置項混用。

當(dāng)用netorks配置項時
# docker inspect --format '{{.HostConfig.NetworkMode}}' 38067601e2e3
docker_redis_network
當(dāng)設(shè)置network_mode: "bridge"
# docker inspect --format '{{.HostConfig.NetworkMode}}' d137058708eb
bridge

27.networks

指定所加入的網(wǎng)絡(luò)巧婶。需要在頂層networks配置項中引入具體的網(wǎng)絡(luò)信息乾颁。

services:
  redis:
    ...
    networks:
      - redis_network
      - other-network
# docker inspect --format '{{.HostConfig.NetworkMode}}' 38067601e2e3
docker_redis_network
1)aliases

指定服務(wù)在此網(wǎng)絡(luò)上的別名(備用主機名)。同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)名稱或此別名來連接到服務(wù)的任何一個容器艺栈。由于aliases屬于網(wǎng)絡(luò)范圍英岭,因此同一服務(wù)在不同的網(wǎng)絡(luò)上可以具有不同的別名。例如:

services:
  redis:
    ...
    networks:
      redis_network:
        aliases:
          - alias1
          - alias3
                    "Aliases": [
                        "redis",
                        "alias1",
                        "2c1fc62e6cb1",
                        "alias3"
                    ],

# docker inspect --format '{{.NetworkSettings.Networks.docker_redis_network}}' 2c1fc62e6cb1
{<nil> [redis_1:redis_1] [redis alias1 2c1fc62e6cb1 alias3] 74f09926f4d034f2ae63ff1a46590d883562e711814a0dcce7e683284e407c31 a8cca1aecb9a3283a1b49fee318acd956a33358837690632c12209dc21b33894 172.21.0.1 172.21.0.2 16   0 02:42:ac:15:00:02 map[]}
# docker inspect --format '{{.NetworkSettings.Networks.docker_redis_network.Aliases}}' 2c1fc62e6cb1
[redis alias1 2c1fc62e6cb1 alias3]

在以下示例中湿右,提供了web诅妹、worker和db三個服務(wù),以及new和legacy兩個網(wǎng)絡(luò):

services:
  web:
    image: "nginx:alpine"
    networks:
      - new
  worker:
    image: "my-worker-image:latest"
    networks:
      - legacy
  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql
 
 
networks:
  new:
  legacy:

在該例中毅人,可以通過主機名db或database在new網(wǎng)絡(luò)上訪問db服務(wù)吭狡,通過db或mysql在legacy網(wǎng)絡(luò)上訪問db服務(wù)。
注意:網(wǎng)絡(luò)范圍內(nèi)的別名可以被多個容器甚至多個服務(wù)共享丈莺。如果是這樣划煮,則不能保證名稱恰好解析到哪一個容器。

2)ipv4_address缔俄、ipv6_address

加入網(wǎng)絡(luò)后弛秋,為此服務(wù)的容器指定一個靜態(tài)IP地址器躏。在頂層networks配置項中的相應(yīng)網(wǎng)絡(luò)配置必須有子網(wǎng)配置覆蓋每個靜態(tài)地址的ipam配置。例如:

version: "3.8"
services:
  app:
    image: nginx:alpine
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
 
 
networks:
  app_net:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

注意:如果需要IPv6尋址蟹略,則必須使用V2.x版本的Compose配置文件并設(shè)置頂層networks配置項下的enable_ipv6選項邀桑。在當(dāng)前swarm mode下IPv6選項不會起作用。

28.pid

跟主機系統(tǒng)共享進(jìn)程命名空間科乎。

services:
  redis:
    pid: "host"

將PID模式設(shè)置為主機PID模式壁畸,打開該選項的容器之間,以及容器和宿主機操作系統(tǒng)之間可以通過進(jìn)程ID來相互訪問和操作

# docker inspect --format '{{.State.Pid}}' 2c1fc62e6cb1
1837303
# ps -ef|grep 1837303
root     1837303 1837284  0 05:58 ?        00:00:00 /sbin/docker-init -- docker-entrypoint.sh redis-server /etc/redis/redis.conf
systemd+ 1837351 1837303  0 05:58 ?        00:00:00 redis-server *:6379

29.posts

暴露端口茅茂。

1)Long syntax

注意端口映射與network_mode: host不兼容捏萍。支持short和long兩種格式的語法。short語法可以使用HOST:CONTAINER的格式指定端口映射空闲,也可以指定容器端口令杈,宿主機會隨機選擇臨時端口進(jìn)行映射。例如:

services:
  redis:
    ports:
      - "6379:6379"

      - "3000"
      - "3000-3005"
      - "8000:8000"
      - "9090-9091:8080-8081"
      - "49100:22"
      - "127.0.0.1:8001:8001"
      - "127.0.0.1:5000-5010:5000-5010"
      - "6060:6060/udp"
      - "12400-12500:1240"

注意:當(dāng)使用HOST:CONTAINE格式來映射端口時碴倾,如果使用的容器端口小于60可能會得到錯誤得結(jié)果逗噩,因為YAML將會解析xx:yy這種數(shù)字格式為60進(jìn)制,因此建議始終采用字符串格式來指定端口映射跌榔。

# docker inspect --format '{{.NetworkSettings.Ports}}' 2c1fc62e6cb1
map[6379/tcp:[{0.0.0.0 6379} {:: 6379}]]
2)Short syntax

long語法支持配置short語法中不支持的附加字段异雁。這些附加字段如下:
target:指定容器內(nèi)的端口。
published:指定公開的端口僧须。
protocol:指定端口協(xié)議(tcp或udp)纲刀。
mode:使用host在每個節(jié)點公開一個主機端口,或使用ingress對swarm mode端口進(jìn)行負(fù)載均衡担平。

services:
  redis:
    ports:
      - target: 80
        published: 8080
        protocol: tcp
        mode: host

30.restart

指定重啟策略示绊。例如想要在容器退出時總是會重啟容器,指定以下重啟策略:
一共支持以下重啟策略:
no:在任何情況下都不會重啟容器暂论。默認(rèn)的重啟策略面褐。
always:在容器退出時總是重啟容器。
on-failure:在容器以非0狀態(tài)碼退出時才會重啟取胎。
unless-stopped:在容器退出時總是重啟容器展哭,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器。

services:
  redis:
    restart: "no"
    restart: always
    restart: on-failure
    restart: unless-stopped

使用docker stack deploy時的注意事項:在swarm mode下部署堆棧時扼菠,restart配置項將被忽略摄杂。

# docker inspect --format '{{.HostConfig.RestartPolicy}}' 2c1fc62e6cb1
{always 0}
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },

31.secrets

為每個服務(wù)授予對保密數(shù)據(jù)(secrets)的訪問權(quán)限。支持short和long兩種格式的語法循榆。
使用docker stack deploy時的注意事項:該保密數(shù)據(jù)(secret)必須已存在或者在Compose配置文件頂層secrets配置項中定義,否則堆棧部署將失敗墨坚。

1)Short syntax

short語法僅指定secret名稱來授予容器訪問secret數(shù)據(jù)的權(quán)限并將其掛載到容器的/run/secrets/<secret_name>上秧饮。source名稱和目標(biāo)掛載點都設(shè)置為secret名稱映挂。例如以下示例,授予了redis服務(wù)對secrets的my_secret和my_other_secret的訪問權(quán)限盗尸,其中my_secret的值設(shè)置到文件./my_secret.txt的內(nèi)容中柑船,my_other_secret定義為外部資源,這意味著它已經(jīng)在Docker中通過運行docker secret create命令或其他堆棧部署進(jìn)行定義泼各,如果外部secret不存在鞍时,堆棧部署將會失敗并顯示secret not found錯誤:

version: "3.9"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    secrets:
      - my_secret
      - my_other_secret
secrets:
  my_secret:
    file: ./my_secret.txt
  my_other_secret:
    external: true
2)Long syntax

long語法提供了在服務(wù)的任務(wù)容器內(nèi)如何創(chuàng)建secret的更多粒度:
source:Docker中存在的secret名稱。
target:指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件名稱扣蜻。如果未指定逆巍,默認(rèn)為source的值。
uid和gid:指定服務(wù)的任務(wù)容器的/run/secrets/中所擁有的該文件的UID或GID莽使。如果未指定锐极,兩者都默認(rèn)為0。
mode:以八進(jìn)制表示法指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件權(quán)限芳肌。例如灵再,0444代表可讀。默認(rèn)值在Docker 1.13.1為0000亿笤,在較新版本為0444翎迁。secret內(nèi)容已掛載到臨時文件系統(tǒng)中,所以不可寫净薛,如果設(shè)置了可寫位將被忽略鸳兽。可以設(shè)置可執(zhí)行位罕拂。如果不熟悉UNIX文件權(quán)限模式揍异,可以使用權(quán)限計算器 。
例如以下示例爆班,指定secret名稱為my_secret衷掷,授予redis服務(wù)對my_secret的訪問權(quán)限,指定要掛載到redis服務(wù)的任務(wù)容器的/run/secrets/中的文件名稱為redis_secret柿菩,指定UID和GID均為103戚嗅,指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件權(quán)限為0440(group-readable),但該redis服務(wù)沒有訪問my_other_secret的權(quán)限:

version: "3.9"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    secrets:
      - source: my_secret
        target: redis_secret
        uid: '103'
        gid: '103'
        mode: 0440
secrets:
  my_secret:
    file: ./my_secret.txt
  my_other_secret:
    external: true

32.security_opt

為每個容器覆蓋默認(rèn)的標(biāo)簽(label)枢舶。例如配置標(biāo)簽中的用戶名和角色名:

services:
  redis:
    ...
    security_opt:
      - label:user:USER
      - label:role:ROLE

使用docker stack deploy時的注意事項:在swarm mode下部署堆棧時懦胞,security_opt配置項將被忽略。

# docker inspect --format '{{.HostConfig.SecurityOpt}}' 02a534e927b2 
[label:user:USER label:role:ROLE label=disable]

33.stop_grace_period

指定在發(fā)送SIGKILL之前凉泄,如果容器無法處理SIGTERM或使用stop_signal指定的任何停止信號時躏尉,試圖停止該容器所需要的等待時間。默認(rèn)情況下后众,stop在發(fā)送SIGKILL之前等待10秒以退出容器胀糜。時間指定為duration颅拦。具體示例如下:

services:
  redis:
    ...
    stop_grace_period: 1m30s
# docker inspect --format '{{.Config.StopTimeout}}' 02010fce43b8
90

34.stop_signal

設(shè)置停止容器的信號。默認(rèn)使用SIGTERM停止容器教藻。例如指定SIGUSR1信號:

services:
  redis:
    ...
    stop_signal: SIGUSR1
# docker inspect --format '{{.Config.StopSignal}}' 24b883a4ca86
SIGUSR1

35.sysctls

在容器中設(shè)置的內(nèi)核參數(shù)距帅。可以使用數(shù)組或字典兩種格式括堤。例如指定連接數(shù)為1024和開啟TCP的syncookies:

services:
  redis:
    ...
    sysctls:
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
# docker inspect --format '{{.HostConfig.Sysctls}}' 2ac559f58bb2 
map[net.core.somaxconn:1024 net.ipv4.tcp_syncookies:0]

36.tmpfs

掛載一個臨時文件系統(tǒng)到容器內(nèi)部碌秸。可以是一個值或一個列表悄窃。例如
services:
redis:
...
tmpfs: /run

tmpfs:
  - /run
  - /tmp
# docker inspect --format '{{.HostConfig.Tmpfs}}' 2f3f969ca726 
map[/run:]

在容器內(nèi)掛載一個臨時文件系統(tǒng)讥电。Size可以指定掛載的tmpfs大小,以字節(jié)為單位广匙。默認(rèn)情況下不受限制允趟。例如:

services:
  redis:
    ...
    - type: tmpfs
      target: /app
      tmpfs:
        size: 1000

37.ulimits

覆蓋容器的默認(rèn)ulimit值⊙恢拢可以單一地將限制值設(shè)為一個整數(shù)潮剪,也可以將soft/hard限制指定為映射。例如分唾,指定最大進(jìn)程數(shù)為65535抗碰,指定文件句柄數(shù),其中軟限制為20000绽乔,系統(tǒng)硬限制為40000弧蝇,軟限制應(yīng)用可以隨時修改,不能超過硬限制折砸,硬限制只能root用戶提高:

services:
  redis:
    ...
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
            "Ulimits": [
                {
                    "Name": "nproc",
                    "Hard": 65535,
                    "Soft": 65535
                },
                {
                    "Name": "nofile",
                    "Hard": 40000,
                    "Soft": 20000
                }
            ],
# docker inspect --format '{{.HostConfig.Ulimits}}' c3d082140a07
[nproc=65535:65535 nofile=20000:40000]

38.userns_mode

指定用戶命名空間模式看疗。如果Docker守護(hù)進(jìn)程配置了用戶名稱空間,則禁用此服務(wù)的用戶名稱空間睦授。以下是使用主機上的用戶命名空間的配置示例:

userns_mode: "host"
默認(rèn)UsernsMode為null
# docker inspect --format '{{.HostConfig.UsernsMode}}' c3d082140a07
設(shè)置UsernsMode為host
# docker inspect --format '{{.HostConfig.UsernsMode}}' bf76418f4ab6
host

使用docker stack deploy時的注意事項:在swarm mode下部署堆棧時两芳,userns_mode配置項將被忽略。

39.volumes

指定所掛載的主機路徑或數(shù)據(jù)卷名稱去枷。支持short和long兩種格式的語法怖辆。可以將主機路徑作為單個服務(wù)的一部分進(jìn)行掛載删顶,而無需在頂層volumes配置項中定義竖螃。但是如果想要在多個服務(wù)之間重用數(shù)據(jù)卷,需要在頂層volumes配置項中定義一個數(shù)據(jù)卷名稱逗余。
在3版的配置文件格式中的變化:在頂層volumes配置項中定義了數(shù)據(jù)卷名稱并從每個服務(wù)的volumes列表中引用了該數(shù)據(jù)卷特咆。這將替代早期版本的Compose配置文件格式中的volumes_from配置項。

1)Long syntax

short語法使用通用的[SOURCE:]TARGET[:MODE]格式猎荠,SOURCE可以是主機路徑或數(shù)據(jù)卷名稱坚弱,TARGET為掛載數(shù)據(jù)卷的容器路徑蜀备,MODE可以為ro只讀模式或rw讀寫模式(默認(rèn))关摇』囊叮可以在主機上掛載相對路徑,該路徑相對于正在使用的Compose配置文件的目錄進(jìn)行擴展输虱,相對路徑應(yīng)始終以.或..開頭些楣。例如:

volumes:
  # 只指定一個路徑,Docker會自動在創(chuàng)建一個數(shù)據(jù)卷(這個路徑是容器內(nèi)部的)
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql
  # 使用絕對路徑掛載數(shù)據(jù)卷
  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql
  # 使用基于Compose配置文件的相對路徑作為數(shù)據(jù)卷掛載到容器
  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache
  # 使用基于root用戶的相對路徑作為數(shù)據(jù)卷掛載到容器
  # User-relative path
  - ~/configs:/etc/configs/:ro
  # 使用已經(jīng)存在命名的數(shù)據(jù)卷掛載到容器
  # Named volume
  - datavolume:/var/lib/mysql
2)Short syntax

long語法支持配置以下short語法中不支持的附加字段:
type:掛載類型宪睹,可以為volume愁茁、bind、tmpfs或npipe亭病。
source:掛載源鹅很,在主機上用于綁定掛載的路徑或定義在頂層volumes配置項中的數(shù)據(jù)卷名稱。不適用于tmpfs掛載類型罪帖。
target:數(shù)據(jù)卷掛載在容器中的路徑。
read_only:設(shè)置數(shù)據(jù)卷為只讀。
bind:配置額外的bind選項琐鲁。
propagation:用于綁定的傳播模式志膀。
volume:配置額外的volume選項。
nocopy:創(chuàng)建數(shù)據(jù)卷時禁止從容器復(fù)制數(shù)據(jù)坐昙。
tmpfs:配置額外的tmpfs選項绳匀。
size:tmpfs掛載的大小,以字節(jié)為單位炸客。
consistency:掛載的一致性要求疾棵,可以為consistent、cached或delegated痹仙。其中consistent表示主機和容器具有相同視圖是尔。cached表示讀取緩存,主機視圖是權(quán)威的蝶溶。delegated表示讀寫緩存嗜历,容器視圖是權(quán)威的。

version: "3.9"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:
services:
  redis:
    ...
    volumes:
      - redis_vol:/data
      - ./redis.conf:/etc/redis/redis.conf
# docker inspect --format '{{.Config.Volumes}}' bf76418f4ab6
map[/data:{} /etc/redis/redis.conf:{}]
3)Volumes for services, swarms, and stack files

注意:當(dāng)使用services抖所、swarms和docker-stack.yml文件時梨州,請記住,支持服務(wù)的任務(wù)(容器)可以部署在群組中的任何節(jié)點上田轧,并且每次更新服務(wù)時暴匠,這可能是不同的節(jié)點。
在沒有指定來源的命名卷的情況下傻粘,Docker會為支持服務(wù)的每個任務(wù)創(chuàng)建一個匿名卷每窖。刪除關(guān)聯(lián)的容器后帮掉,匿名卷不會持久存在。
如果希望數(shù)據(jù)持久化窒典,請使用命名卷和支持多主機的卷驅(qū)動程序蟆炊,以便可以從任何節(jié)點訪問數(shù)據(jù)∑僦荆或者涩搓,對服務(wù)設(shè)置約束,以便將其任務(wù)部署在具有卷的節(jié)點上劈猪。

version: "3.9"
services:
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
4)domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir

每一個都是一個單獨的值昧甘,類似于docker run的對應(yīng)值。請注意战得,mac_address是一個遺留選項充边。

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

privileged: true

read_only: true
shm_size: 64M
stdin_open: true
tty: true

參考URL

https://blog.csdn.net/weixin_67479400/article/details/125864700
https://github.com/docker/compose/releases
https://docs.docker.com/compose/compose-file/compose-versioning/
https://docs.docker.com/compose/compose-file/compose-file-v3/
https://blog.csdn.net/qq_27546717/article/details/125586553

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市常侦,隨后出現(xiàn)的幾起案子浇冰,更是在濱河造成了極大的恐慌,老刑警劉巖刮吧,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湖饱,死亡現(xiàn)場離奇詭異,居然都是意外死亡杀捻,警方通過查閱死者的電腦和手機井厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致讥,“玉大人仅仆,你說我怎么就攤上這事」父ぃ” “怎么了墓拜?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長请契。 經(jīng)常有香客問我咳榜,道長,這世上最難降的妖魔是什么爽锥? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任涌韩,我火速辦了婚禮,結(jié)果婚禮上氯夷,老公的妹妹穿的比我還像新娘臣樱。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布雇毫。 她就那樣靜靜地躺著玄捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棚放。 梳的紋絲不亂的頭發(fā)上枚粘,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音席吴,去河邊找鬼赌结。 笑死捞蛋,一個胖子當(dāng)著我的面吹牛孝冒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拟杉,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼庄涡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搬设?” 一聲冷哼從身側(cè)響起穴店,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拿穴,沒想到半個月后泣洞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡默色,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年球凰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腿宰。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡呕诉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吃度,到底是詐尸還是另有隱情甩挫,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布椿每,位于F島的核電站伊者,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏间护。R本人自食惡果不足惜亦渗,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兑牡。 院中可真熱鬧央碟,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洛勉,卻和暖如春粘秆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收毫。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工攻走, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人此再。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓昔搂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親输拇。 傳聞我的和親對象是個殘疾皇子摘符,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容