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