Docker Compose 常用命令與配置

1、Docker-Compose介紹

Docker-Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。
Docker-Compose將所管理的容器分爲三層,分別是工程(project),服務(service)以及容器(container)。Docker-Compose運行目錄下的所有文件(docker-compose.yml,extends文件或環境變量文件等)組成一個工程,若無特殊指定工程名即爲當前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器運行的鏡像,參數,依賴。一個服務當中可包括多個容器實例,Docker-Compose並沒有解決負載均衡的問題,因此需要藉助其它工具實現服務發現及負載均衡。
Docker-Compose的工程配置文件默認爲docker-compose.yml,可通過環境變量COMPOSE_FILE或-f參數自定義配置文件,其定義了多個有依賴關係的服務及每個服務運行的容器。
使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個Web項目,除了Web服務容器本身,往往還需要再加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
Compose允許用戶通過一個單獨的docker-compose.yml模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project)。
Docker-Compose項目由Python編寫,調用Docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支持Docker API,就可以在其上利用Compose來進行編排管理。

2、Docker-Compose安裝

安裝方法一:
下載Docker-Compose:

sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

安裝Docker-Compose:
sudo chmod +x /usr/local/bin/docker-compose
查看版本 :
docker-compose version
安裝方法二:
安裝pip

yum -y install epel-release
yum -y install python-pip

確認版本
pip --version
更新pip
pip install --upgrade pip
安裝docker-compose
pip install docker-compose
查看版本
docker-compose version
安裝補全工具:
爲了方便輸入命令,也可以安裝Docker的補全提示工具幫忙快速輸入命令:
安裝
yum install bash-completion
下載docker-compose腳本

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

3、Docker-Compose卸載

如果是二進制包方式安裝的,刪除二進制文件即可:
sudo rm /usr/local/bin/docker-compose
如果通過Python pip工具安裝的,則執行如下命令刪除:
sudo pip uninstall docker-compose

常見命令

ps:列出所有運行容器

docker-compose ps

logs:查看服務日誌輸出

docker-compose logs

port:打印綁定的公共端口,下面命令可以輸出 eureka 服務 8761 端口所綁定的公共端口

docker-compose port eureka 8761

build:構建或者重新構建服務

docker-compose build

start:啓動指定服務已存在的容器

docker-compose start eureka

stop:停止已運行的服務的容器

docker-compose stop eureka

rm:刪除指定服務的容器

docker-compose rm eureka

up:構建、啓動容器

docker-compose up

kill:通過發送 SIGKILL 信號來停止指定服務的容器

docker-compose kill eureka

pull:下載服務鏡像

scale:設置指定服務運氣容器的個數,以 service=num 形式指定

docker-compose scale user=3 movie=3

run:在一個服務上執行一個命令

docker-compose run web bash

docker-compose.yml 屬性

version:指定 docker-compose.yml 文件的寫法格式

services:多個容器集合

image:image是指定服務的鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會嘗試拉取鏡像。

services: 
    web: 
        image: hello-world

build:配置構建時,Compose 會利用它自動構建鏡像,該值可以是一個路徑,也可以是一個對象,用於指定 Dockerfile 參數

build: ./dir
---------------
build:
    context: ./dir
    dockerfile: Dockerfile
    args:
        buildno: 1

context:context選項可以是Dockerfile的文件路徑,也可以是到鏈接到git倉庫的url,當提供的值是相對路徑時,被解析爲相對於撰寫文件的路徑,此目錄也是發送到Docker守護進程的context

build:
  context: ./dir

dockerfile:使用dockerfile文件來構建,必須指定構建路徑

build:
  context: .
  dockerfile: Dockerfile-alternate

command:覆蓋容器啓動後默認執行的命令

command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]

container_name:Compose的容器名稱格式是:<項目名稱><服務名稱><序號>
可以自定義項目名稱、服務名稱,但如果想完全控制容器的命名,可以使用標籤指定:container_name: app

depends_on:在使用Compose時,最大的好處就是少打啓動命令,但一般項目容器啓動的順序是有要求的,如果直接從上到下啓動容器,必然會因爲容器依賴問題而啓動失敗。例如在沒啓動數據庫容器的時候啓動應用容器,應用容器會因爲找不到數據庫而退出。depends_on標籤用於解決容器的依賴、啓動先後的問題

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:從另一個服務或容器掛載其數據卷:

volumes_from:
   - service_name    
     - container_name

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_mode:設置網絡模式

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

ports:對外暴露的端口定義,和 expose 對應

ports:   # 暴露端口信息  - "宿主機端口:容器暴露端口"
- "8763:8763"
- "8763:8763"

links:將指定容器連接到當前連接,可以設置別名,避免ip方式導致的容器重啓動態改變的無法連接情況

links:    # 指定服務名稱:別名 
    - docker-compose-eureka-server:compose-eureka

logs:日誌輸出信息

--no-color          單色輸出,不顯示其他顏.
-f, --follow        跟蹤日誌輸出,就是可以實時查看日誌
-t, --timestamps    顯示時間戳
--tail              從日誌的結尾顯示,--tail=200

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

Docker Compose 其它

更新容器

  • 當服務的配置發生更改時,可使用 docker-compose up 命令更新配置
  • 此時,Compose 會刪除舊容器並創建新容器,新容器會以不同的 IP 地址加入網絡,名稱保持不變,任何指向舊容起的連接都會被關閉,重新找到新容器並連接上去

links

  • 服務之間可以使用服務名稱相互訪問,links 允許定義一個別名,從而使用該別名訪問其它服務
version: '2'
services:
    web:
        build: .
        links:
            - "db:database"
    db:
        image: postgres
  • 這樣 Web 服務就可以使用 db 或 database 作爲 hostname 訪問 db 服務了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章