模板文件是使用Compose的核心,默認模板文件名稱爲docker-compose.yml ,格式爲YAML格式。python
目錄結構mysql
[root@localhost ~]# tree /opt/compose-conf/jenkins/ /opt/compose-conf/jenkins/ ├── conf │ ├── ansible.cfg │ ├── ansible.cfg.bak │ └── hosts ├── core │ └── Dockerfile └── jenkins.yml
/opt/compose-conf/jenkins/core/Dockerfile 文件配置nginx
[root@localhost ~]# cat /opt/compose-conf/jenkins/core/Dockerfile FROM jenkins/jenkins MAINTAINER simon USER root RUN apt-get update \ && apt-get -y install vim rsync procps cronolog python-pip \ && pip install ansible \ && mkdir /etc/ansible EXPOSE 8080
[root@localhost ~]# cat /opt/compose-conf/jenkins/jenkins.yml version: '2' services: jenkins: build: core container_name: jenkins-core cap_add: - LINUX_IMMUTABLE ports: - "8080:8080" volumes: - /etc/localtime:/etc/localtime:ro - /opt/container-logs/jenkins:/var/log - /etc/hosts:/etc/hosts:ro - /opt/compose-conf/jenkins/conf:/etc/ansible hostname: jenkins restart: always #command: /bin/bash command: "/bin/tini -- /usr/local/bin/jenkins.sh" mem_limit: 8g memswap_limit: 8g stdin_open: true tty: true dns: - 10.168.11.100 - 10.167.11.100 ulimits: core: soft: 0 hard: 0
build 指定Dockerfile所在目錄(能夠是絕對路徑,或者docker-compose.yml 文件的相對路徑)。 Compose將會利用它自動構建這個鏡像,而後使用這個鏡像 build: core
cap_add,cap_drop 指定容器的內核能力(capacity)分配。 # 讓容器擁有全部能力 cap_add: - ALL # 去掉NET_ADMIN能力 cap_drop: - NET_ADMIN
command 覆蓋容器啓動後默認執行的命令 command: "/bin/tini -- /usr/local/bin/jenkins.sh"
container_name 指定容器名稱,默認將會使用"項目名稱_服務名稱_序號" 這樣的格式 # 須要注意,指定容器名稱後,改服務獎沒法進行擴展,由於Docker不容許多個容器具備相同的名稱。 container_name: jenkins-core
depends_on 表示服務以前的依賴關係 # docker-compose up ,啓動web服務器以前,啓動redis、db。 # docker-compose up web ,啓動web容器時,檢查依賴depends_on的配置內容,先啓動db和redis 例如: services: web: build: web depends_on: - db - redis redis: image: redis db: image: postages
dns 自定義DNS,能夠是單個的,也能夠是列表 # 單個 dns:8.8.8.8 # 多個 dns: - 8.8.8.8 - 4.4.4.4
dns_search 配置DNS搜索區域。能夠是單個的,也能夠是列表。 # 單個 dns_search: example.com # 多個 dns_search: - dom1.example.com - dom2.example.com
tmpfs 在容器中掛載一個tmpfs # tmpfs 能夠理解成虛擬機磁盤,是建立在內存上,不是硬盤上,讀取速度快,重啓後數據消失 tmpfs: /run tpmfs: - /run - /tmp
env_file 指定變量文件,能夠爲黨文件路徑或列表 # 若是經過docker-compose -f File 方式來指定Compose模板文件,則nev_file中變量路徑會基於模板文件路徑。 # 若是變量名稱與environment 指令衝突,則按照慣例之後者爲準 # 環境變量文件中每一行必須符合格式,支持#開通的註釋行 # 單個 env_file: .env # 多個 env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
environment 設置環境變量,可使用數組或字典兩種格式 # 給定名稱的變量會自動獲取運行Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據 # 若是在變量名或者值中用到true|false, yes|no 等,最後放在引號裏,避免YAML自動解析某些內容對應的布爾語義 # 字典格式 environment: RACK_ENV: development SHOW: 'true' # 數組格式 environment: - RACK_ENV=development - SHOW='true'
expose 暴露端口,但不映射到宿主機,只容許能被鏈接的服務訪問,僅能夠指定內部端口爲參數 expose: - "3000" - "8000"
extends 基於其餘模板文件進行擴展。 # 要避免出現循環依賴,例如 A依賴B,B依賴C,C反過來依賴A的狀況 # extends 不會繼承links 和volumes_from 中定義的容器和數據卷資源 # 推薦在基礎模板中定義一些能夠共享的鏡像和環境變量,在擴展模板中具體制定應用變量、連接、數據卷等信息。 例如已經有一個webapp服務,定義的基礎模板 common.yml webapp: build: ./webapp environment: - DEBUG='false' - RACK_ENV=development 在編寫一個新的development.yml 文件,使用common.yml 文件中的webapp服務進行擴展 web: extends: file: common.yml service: webapp ports: - "3000:3000" links: - db environment: - DEBUG='true' db: imgae: postgres
# external_links 連接到docker-compose.yml 外部容器,甚至能夠是非Compose管理的外部容器。 external_links: - redis_1 - project_db_1:mysql
# 相似於Docker 中的--add-host 參數,制定額外的host名稱映射信息。 extra_hosts: - "googledns:8.8.8.8" 啓動後容器中的/etc/hosts 文件中將添加: 8.8.8.8 googledns
# 指定鏡像名稱或鏡像ID。 若是本地不存在,Compose將會嘗試來去這個鏡像。 images: ubuntu
# 指定容器的標籤. # 字典類型定義 labels: com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: "" # 元祖類型定義 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value"
# 連接到其餘服務中的容器。使用服務名稱(同時做爲別名),或者"服務名稱: 服務別名 (如: SERVICE:ALIAS)" links: - db - db:database - redis
# 設置容器日誌驅動 # v2 中使用logging,在v1 中使用log_driver和log_opt logging: driver: syslog options: syslog-address: "tcp://10.168.11.101:571"
# 指定容器的網絡類型,v1 使用 net ;v2 使用network_mode network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
# 經過設置,容器可經過ps查詢宿主機的進程. pid: "host"
# 暴露端口信息 # 使用"宿主: 容器" # 或者僅僅指定容器的端口(宿主將會隨機端口) ports: - "3000" - "8000:8000"
# 指定容器的ulimits限制值。 ulimits: nproc: 65535 #最大進程數 nofile: soft: 20000 #軟鏈接 hard: 20000 #系統應限制
# 數據卷所掛載路徑設置。 # 能夠設置宿主路徑(HOST:CONTAINER) # 加上訪問模式(HOST:CONTAINER:ro) volumes: - /etc/localtime:/etc/localtime:ro - /opt/container-logs/jenkins:/var/log - /etc/hosts:/etc/hosts:ro - /opt/compose-conf/jenkins/conf:/etc/ansible
# 數據卷的插件驅動,可使用第三方驅動建立一個數據卷,而後使用名稱來訪問 volumes_driver: mydriver
# 從另一個服務或者容器掛載他的數據卷 volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
# 使用CPU 0核 和1核,只用50%的CPU資源 cpu_shares: 73 cpuset: 0,1 # 指定服務容器啓動後執行的命令 entrypoint: /code/entrypoint.sh # 指定容器中運行應用的用戶名 user: nginx # 指定容器中的工做目錄 working_dir: /code # 指定容器中搜索域名、主機名、mac地址等 domainname: website.com hostname: jenkins mac_address: 08-00-28-00-0C-0A # 指定容器 ipc: hostname # 指定容器中內存和交換分區的大小 mem_limit: 8g memswap_limit: 8g # 運行容器中運行一些特權命令 privileged: true # 指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,生產環境推薦配置 # 配置項: always 或 unless-stopped restart: always # 以只讀模式掛載容器的root文件系統,意味着不能對容器內容進行修改 read_only: true # 打開標準輸入,能夠接受外部輸入 stdin_open: true # 模擬一個假的遠程控制檯 tty: true