一、docker-compose 介紹
docker-compose是一個容器編排工具,單機版
有時候有一組服務他們有一些依賴關系,或者需要通信,需要同時部署(eg:web服務器與數(shù)據(jù)庫),此時docker-compose可以簡單的實現(xiàn)
且docker-compose會創(chuàng)建一個網(wǎng)絡,從而在一個services中的容器,他們是在同一個子網(wǎng)的
指定一個yml文件作為docker-compose的配置文件來啟動
docker-compose -f docker-compose-dev.yml up
二、docker-compose 使用
- 模板文件 docker-compose.yml
version: "3"
# 服務 里面包含了多個容器
services:
# 單個service(容器的配置)
webapp:
# 鏡像名
image: imageName
# 共享內(nèi)存的大小
shm_size: 1gb
#卷掛載
volumes:
- /var/www/project:/cached
# 最大文件限制數(shù),主要是程序崩潰后會生成可調(diào)試文件core.2131 會占用內(nèi)存,不啟用即可
ulimits:
core: 0
nofile:
soft: 1024
hard: 1024
# 環(huán)境變量文件
env_file:
- .env
# 環(huán)境變量設置
environment:
RACK_ENV: development
SHOW: 'true'
- 指定yml配置文件名
docker-compose -f docker-compose-dev.yml up
二、 docker-compose 參數(shù)詳解:
- 所使用的鏡像名
image: image_name
- 文件掛載文件、目錄映射 —— 注意:linux下vim修改文件wq后是一個新文件,也就是使用文件掛載,vim修改文件無法更新docker容器內(nèi)的文件,所以這種(平時測試代碼)可以選擇目錄掛載
volumes:
- /var/www/project:/cached # 目錄掛載
- /var/www/u2.txt:/home/u2.txt # 文件掛載
掛載點 :
- 如果:掛載了父目錄 /app 。里面有個子目錄 /app/caches,然后又對子目錄/app/caches掛載映射了其他目錄,那么原來父目錄的/app/caches會被覆蓋為新的掛載的目錄
- 比如先掛載了一個目錄/root/atom-node1(atom-node1下面有個caches子目錄)作為/app目錄
- 然后又掛載了/app/caches 目錄。這時候/tmp就覆蓋了原來的/root/atom-node1/caches目錄了
# 比如先掛載了一個目錄/root/atom-node1(atom-node1下面有個caches子目錄)作為/app目錄,
# 然后又掛載了/app/caches 目錄。這時候/tmp就覆蓋了原來的/root/atom-node1/caches目錄了
docker run -v /root/atom-node1:/app -it -v /tmp:/app/caches oc-runner bash
- 端口映射,把docker內(nèi)部的端口暴露出來
ports:
- 8088:8088
- 重啟操作
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
- 容器名稱
container_name: "test2"
- 環(huán)境變量文件
env_file:
- .env
- .env的內(nèi)容可以如下, 格式是name=value的形式,#表示注釋
# Set Rails/Rack environment
RACK_ENV=development
- 環(huán)境變量 —— 有時候需要自定義一些環(huán)境變量
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
- external_links,鏈接其他的容器服務 (CONTAINER:ALIAS).
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
- ulimit 限制,限制生成可調(diào)試文件
# 最大文件限制數(shù),主要是程序崩潰后會生成可調(diào)試文件core.2131 會占用內(nèi)存,不啟用即可
ulimits:
core: 0
nofile:
soft: 1024
hard: 1024
- shm_size 共享內(nèi)存,這個會限制某些應用(eg. 谷歌瀏覽器)的使用內(nèi)存,從而可能導致崩潰
shm_size: 1gb
- command 啟動后的命令,這個會直接覆蓋掉默認的 dockerfile定義的command
command: bundle exec thin -p 3000
- depends_on 由于啟動順序是隨機的,所以如果有依賴關系的話,需要使用這個
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- entrypoint 容器啟動的入口點:docker-compose這里定義的話。會覆蓋原本docker的image的默認的entrypoint
# 覆蓋Dockerfile文件里面的:ENTRYPOINT command param1 param2
entrypoint : /code/entrypoint.sh
- command 容器的啟動命令:docker-compose 這里定義的話,會覆蓋docker image里面的CMD 命令
# 覆蓋Dockerfile里面的:CMD ./entrypoint.py start
command: bundle exec thin -p 3000
- 執(zhí)行多行命令的方式:使用 bash -c "command1 && command2"
command: bash -c "ls && pwd && ./start.sh"
三、docker-compose 坑 之 不支持 shell command 擴展
- 本來想在docker-compose.yml中 使用shell動態(tài)來映射目錄【實際并不支持】:
volumes:
- /var/lib/docker/containers/$(docker inspect --format="{{.Id}}" atom-node1_oc-runner_1):/var/log/atom-node1