Docker-compose常用命令
docker-compose up -d nginx 構建建啟動nignx容器
docker-compose exec nginx bash 登錄到nginx容器中
docker-compose down 刪除所有nginx容器,鏡像
docker-compose ps 顯示所有容器
docker-compose restart nginx 重新啟動nginx容器
docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不啟動關聯容器,並容器執行php -v 執行完成后刪除容器
docker-compose build nginx 構建鏡像 。
docker-compose build --no-cache nginx 不帶緩存的構建。
docker-compose logs nginx 查看nginx的日志
docker-compose logs -f nginx 查看nginx的實時日志
docker-compose config -q 驗證(docker-compose.yml)文件配置,當配置正確時,不輸出任何內容,當文件配置錯誤,輸出錯誤信息。
docker-compose events --json nginx 以json的形式輸出nginx的docker日志
docker-compose pause nginx 暫停nignx容器
docker-compose unpause nginx 恢復ningx容器
docker-compose rm nginx 刪除容器(刪除前必須關閉容器)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 啟動nignx容器
docker-compose.ymal
官網示例:
version: "3.7"
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:
部分分解
##服務基於已經存在的鏡像
services:
web:
image: hello-world
##服務基於dockerfile
build: /path/to/build/dir
build: ./dir
build:
context: ../
dockerfile: path/of/Dockerfile
build: ./dir
image: webapp:tag
##command
command命令可以覆蓋容器啟動后默認執行的命令
command: bundle exec thin -p 3000
command: [bundle, exec, thin, -p, 3000]
##container_name
Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>
雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個標簽指定
container_name: app
##depends_on
depends_on解決了容器的依賴、啟動先后的問題
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
##dns
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
##tmfs
掛載臨時目錄到容器內部,與run的參數一樣效果
tmpfs: /run
tmpfs:
- /run
- /tmp
##environment
設置鏡像變量,它可以保存變量到鏡像里,也就是說啟動的容器也會包含這些變量設置
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
##expose
用於指定暴露的端口,但是只是作為參考,端口映射的話還得ports標簽
expose:
- "3000"
- "8000"
##external_links
在使用Docker的過程中,我們會有許多單獨使用docker run啟動的容器,為了使Compose能夠連接這些不在docker-compose.yml中定義的容器,我們需要一個特殊的標簽,就是external_links,它可以讓Compose項目里面的容器連接到那些項目配置外部的容器(前提是外部容器中必須至少有一個容器是連接到與項目內的服務的同一個網絡里面)
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
##extra_hosts
添加主機名的標簽,就是往容器內部/etc/hosts文件中添加一些記錄
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
##labels
向容器添加元數據,和Dockerfile的lable指令一個意思
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"
##links
解決容器連接問題,與docker的–link一樣的效果,會連接到其他服務中的容器,使用的別名將會自動在服務容器中的/etc/hosts里創建
links:
- db
- db:database
- redis
##ports
用作端口映射
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
當使用HOST:CONTAINER格式來映射端口時,如果你使用的容器端口小於60你可能會得到錯誤得結果,因為YAML將會解析xx:yy這種數字格式為60進制。所以建議采用字符串格式
##security_opt
為每個容器覆蓋默認的標簽。簡單說來就是管理全部服務的標簽,比如設置全部服務的user標簽值為USER
security_opt:
- label:user:USER
- label:role:ROLE
##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
如果你不使用宿主機的路徑,你可以指定一個volume_driver。
volume_driver: mydriver
##volumes_from
從其它容器或者服務掛載數據卷,可選的參數是:ro或者:rw,前者表示容器只讀,后者表示容器對數據卷是可讀可寫的,默認是可讀可寫的
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
##network_mode
網絡模式,與docker client的–net參數類似,只是相對多了一個service:[sevice name]的格式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
##networks
加入指定網絡
services:
some-service:
networks:
- some-network
- other-network