docker compose安裝與常用命令介紹 及使用docker-compose執行一個進銷存管理系統
使用微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個例項。如果每個微服務都要手動啟停,那麼效率之低,維護量之大可想而知
docker compose 是一個用於定義和執行多容器docker應用程式的工具
安裝:
下在並安裝適應系統版本的compose
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
為安裝指令碼新增執行許可權
chmod +x /usr/local/bin/docker-compose
這樣,compose就安裝完成了
可使用一下命令測試安裝結果
docker-compose --version
使用compose 大致有三個步驟
使用 dockerfile 定義應用程式環境,以便在任何地方重現該環境
在docker-compose.yml檔案中定義組成應用程式的服務,以便各個服務在一個隔離的環境中一起執行
執行 docker-compose up 命令,啟動並執行整個應用程式
docker compose 將所管理的容器分為三層,分別是工程(project),服務以及容器。docker compose執行目錄下的所有檔案(docker-compose.yml,extends檔案或環境變數檔案等)組成一個
工程(預設為docker-compose.yml所在目錄的名稱)。一個工程可包含多個服務,每個服務中定義了容器執行的映象,引數和依賴,一個服務可包括多個容器例項
docker-compose.yml 常用命令
build
配置構建時的選項,compose會利用它自動構建映象。build的值可以是一個路徑。例如 build: ./dir
也可以是一個物件,用於指定dockerfile和引數,例如:
build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
context 為路徑
dockerfile 為需要替換預設docker-compose的檔名
args 為構建(build)過程中的環境變數,用於替換dockerfile裡定義的ARG引數,容器中不可用
例如
dockfile中
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
docker-compose.yml
build:
context: .
args:
- buildno=1
- password=secret
command
覆蓋容器啟動後預設執行的命令
示例: command: bundle exec thin -p 3000
也可以是一個list,類似於dockerfile中的CMD指令 格式如下:
command:[bundle,exec,thin,-p,3000]
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
environment
環境變數設定,可使用陣列或字典兩種方式
environment:
RACK_ENV: development
SHOW: 'true'
environment:
- RACK_ENV=development
- SHOW=true
env_file
從檔案中獲取環境變數,可指定一個檔案路徑或路徑列表。如果通過docker-compose -f FILE 指定了compose檔案,那麼env_file中的路徑是compose檔案所在目錄的
相對路徑。使用environment指定的環境變數會覆蓋env_file指定的環境變數。
示例:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
expose
expose 提供 container之間的埠訪問,不會暴露給主機使用。同 docker run --expose
示例:
expose: - "3000" - "8000"
external_links
連線到docker-compose.yml外部的容器,甚至並非compose管理的容器,特別是提供共享或公共服務的容器。格式跟links類似
例如:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
image
指定映象名稱或映象ID,如果本地不存在該映象,compose會嘗試下載該映象
示例:
image: java
links
連線到其他服務的容器。可以指定服務名稱和服務別名(SERVICE:ALIAS),也可只指定服務名稱,同docker run --link
示例:
web:
links:
- db
- db:database
- redis
ports
暴露埠資訊,可使用HOST:CONTAINER的格式,也可只指定容器埠(此時宿主機將會隨機選擇埠),類似於docker run -p
需要注意的是,當使用HOST:CONTAINER格式對映埠時,容器埠小於60將會得到錯誤的介面,因為yaml會把xx:yy的數字解析為60進位制。因此,建議使用字串的形式。
例子:
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
volumes:
掛載資料卷。同docker run -v
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
從另一個服務或容器掛載卷。可指定只讀(ro)或讀寫(rw),預設是讀寫(rw)。同docker run --volumes-from
例子
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name 格式僅支援 version2
depends_on
用於指定服務依賴,一般是mysql,redis等
指定了依賴,將會優先於服務建立並啟動依賴
link2 也可以指定依賴
docker-compose命令常用選項
和docker命令一樣,docker-compose命令也有很多選項
build
構建或重新構建服務。服務被構建後將會以project_service的形式標記,例如:compose-setest_db
help
檢視指定命令的幫助文件
docker-compose help COMMAND
如 docker-compose help build
kill
通過傳送SIGKILL訊號停止指定服務的容器
例如:docker-compose kill eureka
logs
檢視服務的日誌輸出
port
列印繫結的公共埠
例如 docker-compose port eureka 8761
這樣就可輸出eureka服務8761埠所繫結的公共埠
ps
列出所有容器。示例:
docker-compose ps
也可列出指定服務的容器,示例:
docker-compose ps eureka
pull
下載服務映象
rm
刪除指定服務的容器
如 docker-compose rm eureka
run
在一個服務上執行一個命令
docker-compose run web bash
這樣即可啟動一個web服務,同時執行bash命令
scale
設定指定服務執行容器的個數,以service=num 的形式指定
docker-compose scale user=3 movie=3
start
啟動指定服務已存在的容器
docker-compose start eureka
stop
停止已執行的容器
docker-compose stop eureka
停止後,可使用docker-compose start再次啟動這些容器
up
構建,建立,重新建立,啟動,連線服務的相關容器。所有連線的服務都會啟動,除非它們已經執行
docker-compose up 命令會聚合所有容器的輸出,當命令退出時,所有容器都會停止。使用docker-compose up -d可在後臺啟動並執行所有容器
下面,編寫一個簡單的例子
專案地址 https://gitee.com/shenduedu/JXC.git
準備環境:
現在下載 mysql:5.5 映象
新建一個目錄
把 專案 pull 下來,然後用maven 打包,把tag 下的war包複製到 新建的目錄下
然後 在該目錄下編寫dockerfile 檔案
然後 使用 dockerfile 構建我的 JXC專案
FROM java:8
VOLUME /tmp
ADD JXC-0.0.1-SNAPSHOT.war /app.war
EXPOSE 80
ENTRYPOINT ["java","-jar","/app.war"]
編寫完 dockerfile 執行 docker build -t jxc:0.0.2 .
然後 在該目錄下 docker-compose.yml
version: '2'
services:
mysql:
image: docker.io/mysql:5.5
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=db_jxc2
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
jxc:
image: jxc:0.0.2
links:
- mysql
ports:
- "8080:80"
然後執行 docker-compose up
注意: 要正常 執行
1 要把專案下的sql 指令碼 匯入,mysql 映射了3306埠,普通的 mysql 客戶端可以連線,
鳴謝地址
http://www.cnblogs.com/52fhy/p/5991344.html
springcloud 與 docker 微服務實戰一書