docker-compose用於定義和運行多個docker容器。採用YAML文件配置應用服務,可從配置文件啓動相關服務,一條命令能夠啓動多個容器。html
docker-compose應用
compose將所管理的容器分爲三層:工程(project)、服務(service)、容器(container)。compose運行目錄下的全部文件組成一個工程,一個工程包含多個服務,每一個服務中定義了容器運行的鏡像、參數、依賴,一個服務可包含多個容器實例。node
應用compose通常分爲3步:mysql
-
用Dockerfile定義app環境,使app能夠在任何地方reproduced。linux
-
用docker-compose.yml定義services,使相關services在隔離環境下一塊兒運行。nginx
-
docker-compose up,啓動compose和整個apps。git
一個docker-compose.yml示例以下:github
version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis
volumes: logvolume01: {}
compose特性:web
-
單主機上隔離環境,compose工程間相互獨立。用命令行選項-p或COMPOSE_PROJECT環境變量定義工程名。redis
-
容器建立時保留volume上數據。sql
-
僅僅在容器改變時再建立容器。compose緩存了配置,restart時compose re-use存在的未改變的容器。
-
compose file支持變量,能夠經過變量爲不一樣環境定製composition。
docker-compose安裝
目前docker-compose能夠安裝到macOS,Windows和64-bit Linux系統下。
linux下鏡像位於 Compose repository release page on GitHub,安裝方法以下:
sudo curl -L"https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version docker-compose version 1.24.0, build 1110ad01
若要安裝其餘版本能夠修改版本號1.24.0。
或pip安裝:
pip install docker-compose
卸載compose:
sudo rm /usr/local/bin/docker-compose
或pip卸載(加入compose用pip安裝的話):
pip uninstall docker-compose
docker-compse命令行
Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml),env:COMPOSE_FILE -p, --project-name NAME Specify an alternate project name (default: directory name),env:COMPOSE_PROJECT_NAME --verbose Show more output --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) --no-ansi Do not print ANSI control characters -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent Commands: build Build or rebuild services bundle Generate a Docker bundle from the Compose file config Validate and view the Compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information
最經常使用的命令是docker-compose up或docker-compose up -d(後臺運行)。
docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml up -d consul
up/run/start區別:
docker-compose up用於start或restart全部定義在docker-compose.yml內的服務。
docker-compose run用於一次性或臨時的任務,相似docker run -it(打開交互終端執行命令後退出並返回容器的退出狀態)。
docker-compose start用於restart原來建立但中止的容器,毫不會建立新容器。
logs:日誌輸出信息
--no-color 單色輸出,不顯示其餘顏. -f, --follow 跟蹤日誌輸出,就是能夠實時查看日誌 -t, --timestamps 顯示時間戳 --tail 從日誌的結尾顯示,--tail=200
更新容器
當服務的配置發生更改時,可以使用docker-compose up命令更新配置。此時,compose會刪除舊容器並建立新容器,新容器會以不一樣的IP地址加入網絡,名稱保持不變,任何指向舊容器的鏈接都會被關閉,從新找到新容器並鏈接上去。
compose file
compose配置文件的格式有多個版本:1,2,2.x和3.x,不一樣docker版本對應不一樣版本compose file。Compose file是YAML文件,用於定義services、networks和volumes,默認爲./docker-compose.yml。詳細語法介紹可參考:Compose file version 3 reference。
YAML(Yet Another Markup Language),是一個JSON的超集,意味着任何有效JSON文件也都是一個YAML文件。它規則以下:
1)大小寫敏感
2)使用縮進表示層級關係,但不支持tab縮進,只支持空格
3)縮進的數量不重要但至少一個空格,只要相同層級使用相同數量的空格便可
4)「#」表示註釋,從這個字符開始,直到行末,都會被解析器無視
compose的YAML只使用兩種類型:Maps和Lists,Maps的子項能夠是Lists,Lists的子項也能夠是Maps。
Maps:就是一個字典,即key:value的鍵值對。
image: postgres
Lists:就是一個列表。
ports: - "8000" - "8080" - "8090"
咱們能夠看到,能夠有任何數量的項在列表中,項的定義以破折號(-)開頭,而且和父元素之間存在縮進。
版本3的compose file示例以下:
version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: frontend: backend: volumes: db-data:
一個標準配置文件應該包含version、services、networks、volumes四大部分,處於top層。其餘包含的子項(sub-options)要相應縮進。
docker-compose.yml定義的每一個服務都必須經過image指定指定鏡像或build指令(須要Dockerfile)來自動構建。在Dockerfile指定的選項,默認狀況下會被compose自動獲取不須要在compose文件中指定。
》version:指定docker-compose.yml文件的寫法格式(版本)
》services:多個容器的集合
》image:指定服務的鏡像名稱或鏡像ID。若是鏡像在本地不存在,compose會嘗試拉取這個鏡像。
services: web: image: nginx
在 services 標籤下的第二級標籤是 web,這個名字是用戶本身自定義,它就是服務名稱。
》build:配置構建時,compose會利用它來自動構建鏡像,該值能夠是一個路徑,也能夠是一個對象,用於指定Dockfile參數。
build: ./dir --------------- build: context: ./dir dockerfile: Dockerfile args: buildno: 1
depends_on:容器依賴,解決啓動前後順序問題。
command:覆蓋容器啓動後默認執行的命令,能夠是一個列表
command: bundle exec thin -p 3000 ---------------------------------- command: [「bundle」,」exec」,」thin」,」-p」,」3000」]
dns:配置 dns 服務器,能夠是一個值或列表
dns: 8.8.8.8 ------------ dns: - 8.8.8.8 - 9.9.9.9
dns_search:配置 DNS 搜索域,能夠是一個值或列表
dns_search: example.com ------------------------ dns_search: - dc1.example.com - dc2.example.com
environment:環境變量配置,能夠用數組或字典兩種方式
environment: RACK_ENV: development SHOW: 'ture' ------------------------- environment: - RACK_ENV=development - SHOW=ture
env_file:從文件中獲取環境變量,能夠指定一個文件路徑或路徑列表,其優先級低於 environment 指定的環境變量
env_file: .env --------------- env_file: - ./common.env
expose:暴露端口,只將端口暴露給鏈接的服務,而不暴露給主機
expose: - "3000" - "8000"
network:分爲兩部分Top-level networks
key和Service-level networks
key。Service-level:Networks to join, referencing entries under the top-level networks
key.
By default Compose sets up a single network for your app. Each container for a service joins the default network and
is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.
在容器建立時會建立相應的網絡,容器建立後加入相應的網絡,即此網絡下可訪問到該容器。
Here’s an example Compose file defining two custom networks. The proxy
service is isolated from the db
service,
because they do not share a network in common - only app
can talk to both.
version: "3" services: proxy: build: ./proxy networks: - frontend app: build: ./app networks: - frontend - backend db: image: postgres networks: - backend networks: frontend: # Use a custom driver driver: custom-driver-1 backend: # Use a custom driver which takes special options driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
參考:https://docs.docker.com/compose/networking/。
network_mode:設置網絡模式
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
ports:對外暴露的端口定義,和 expose 對應,使用host:container格式或者只指定容器端口,宿主機會隨機映射端口。建議使用字符串格式,數字有時會解析錯誤。
ports: # 暴露端口信息 - "宿主機端口:容器暴露端口" - "8763:8763" - "8763:8763"
links:將指定容器鏈接到當前鏈接,能夠設置別名,避免ip方式致使的容器重啓動態改變的沒法鏈接狀況
links: # 指定服務名稱:別名
- docker-compose-eureka-server:compose-eureka
volumes:卷掛載路徑,掛載一個目錄或一個已經存在的數據卷容器,能夠直接使用host:container格式,或者host:container:ro,後者對於容器來講,數據卷是隻讀的,可有效保護宿主機的文件系統。compose能夠使用相對路徑。
volumes: // 只是指定一個路徑,Docker 會自動在建立一個數據卷(這個路徑是容器內部的)。 - /var/lib/mysql // 使用絕對路徑掛載數據卷 - /opt/data:/var/lib/mysql // 以 Compose 配置文件爲中心的相對路徑做爲數據卷掛載到容器。 - ./cache:/tmp/cache // 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。 - ~/configs:/etc/configs/:ro // 已經存在的命名的數據卷。 - datavolume:/var/lib/mysql
You can mount a host path as part of a definition for a single service, and there is no need to define it in the top level volumes key.單個容器使用不必定義頂層volume。
But, if you want to reuse a volume across multiple services, then define a named volume in the top-level volumes key. 多個服務要共用volume時須要定義頂層volumes。
Note: The top-level volumes key defines a named volume and references it from each service’s volumes list.
參考: