Docker-Compose

Docker-Compose

Docker Compose

Docker Compose是一個用來定義和運行復雜應用的docker工具。

可以通過使用Compose在一個文件中定義一個多容器應用,使用docker-compose up命令來啟動應用。

Compose的指令

  • build 構建或重建服務
  • help 幫助指令
  • kill 結束容器
  • logs 記錄容器輸出日志
  • port 打印容器綁定的端口
  • ps 列出容器列表
  • pull 從倉庫拉取服務鏡像
  • restart 重啟
  • rm 刪除已經停止的容器
  • run 運行容器
  • scale 設置服務的容器數(shù)目
  • stop 停止
  • start 開啟
  • up 創(chuàng)建并啟動容器

以上都是compose的一些基礎指令,但是Docker Compose最為重要的是docker-compose.yml配置的設置。

docker-compose.yml配置文件

一份標準的配置文件由version、services、networks三部分組成,其中最關鍵的是services和networks。

以下介紹services的書寫規(guī)則:

一、image

services:
  db:
    image: "mysql:5.7.15"   

在services標簽下的第二級標簽db是用戶給當前這個服務自定義的名字。

image是指定服務的鏡像名稱或者鏡像ID(如果鏡像在本地不存在,就會到倉庫中去pull)。

二、build

services除了可以基于指定的image,還可以基于一份Dockerfile,在docker-compose up啟動的時候執(zhí)行構建。

services:
  nginx:
    build: /path/nginx

build就是用來指定Dockerfile所在的文件路徑,這里的路徑可以是絕對路徑亦可是相對路徑。

注:

如果同時指定了image和build兩個標簽,那么Compose會在構建鏡像時使用iamge的名稱來命名。

三、command

使用command可以覆蓋容器啟動后默認執(zhí)行的命令。

如:

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

四、container_name

container_name: app #指定容器名稱

五、depends_on

一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。

為了避免這一情況,可使用depends_on。

depends_on標簽是用來規(guī)定容器啟動的先后順序。

如:

version: ’2‘
services: 
    web:
      build: .
      depends_on:
        - db
        - redis
    redis:
      image: redis
    db:
      image: postgres

以上配置中的depends_on規(guī)定的啟動順序為:db、redis、web。

六、tmpfs

掛載臨時目錄到容器內部,與run的參數(shù)效果一樣。

tmpfs: /run
tmpfs:
  - /run
  - /tmp

七、entrypoint

與Dockerfile中的ENTRYPOINT一樣,在容器啟動時有效。

entrypoint: /usr/sbin/nginx #啟動時運行nginx

八、expose

與Dockerfile中的EXPOSE一樣,用于暴露接口。

expose: 
  - "3500"
  - "5000"

九、links

解決容器鏈接問題。

links:
    - db
    - redis

以上配置是指,當前服務將要鏈接數(shù)據(jù)庫和redis方可正常運行。

十、ports

映射端口。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注:

當使用HOST:CONTAINER格式來映射端口時,如果你使用的容器端口小于60你可能會得到錯誤得結果,因為YAML將會解析xx:yy這種數(shù)字格式為60進制。

建議采用字符串格式。

十一、volumes

掛載一個目錄或者一個已存在的數(shù)據(jù)卷容器,可以直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,后者對于容器來說,數(shù)據(jù)卷是只讀的,這樣可以有效保護宿主機的文件系統(tǒng)。

volumes:
  # 指定一個文件目錄,用來存放容器數(shù)據(jù)。
  # $PWD 表示當前路徑
  - $PWD/data:/var/lib/mysql

以上是個人感覺相對重要的標簽,其它詳解。

實例

version: '2'

# 指定網絡模式
networks:
  ghost:

# 配置服務
services:
  ghost-app:
    # 使用當前路徑下ghost中的Dockerfile構建容器
    build: ghost
    networks:
      - ghost
    # 指定當前服務依賴服務
    depends_on:
      - db
    # 端口映射
    ports:
      - "2368:2368"

  nginx:
    build: nginx
    networks:
      - ghost
    depends_on:
      - ghost-app
    ports:
      - "80:80"
 
  db:
    image: "mysql:5.7.15"
    networks:
      - ghost
    # 配置環(huán)境變量
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    # 設置數(shù)據(jù)路徑,容器銷毀任然有效
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"        
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容