在沒有docker-compose
以前,咱們建立和啓動一個容器方式以下:mysql
1.經過相似下面兩種方式的命令來構建或者拉取一個docker
鏡像。git
方式1:建立Dockerfile
文件來構建鏡像(命令最後的點別漏了~):github
docker build -t registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0 .
方式2: 直接從Docker Hub
或者阿里雲
或者網易雲
等等平臺拉取鏡像。web
docker pull registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0
2.使用命令docker run ...
來來依賴鏡像建立並運行一個容器,中間還要加一些複雜的參數。sql
docker run --restart always --privileged=true -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM="mysql" -e MYSQL_MASTER_SERVICE_HOST="www.wangjihong.com.cn" -e MYSQL_MASTER_SERVICE_PORT="3300" -e MYSQL_MASTER_SERVICE_DB_NAME="nacos" -e MYSQL_MASTER_SERVICE_USER="root" -e MYSQL_MASTER_SERVICE_PASSWORD="123456" -e MYSQL_SLAVE_SERVICE_HOST="www.wangjihong.com.cn" -e MYSQL_SLAVE_SERVICE_PORT="3301" -v=/usr/local/dockerfiles/nacos/data:/home/nacos/data -v=/usr/local/dockerfiles/nacos/logs:/home/nacos/logs --name docker-nacos-server1.0.0 -d -p 8848:8848 registry.cn-beijing.aliyuncs.com/wangjihong/nacos-server:1.0.0
3.使用命令docker exec ...
進入容器操做。docker
docker exec -it docker-nacos-server1.0.0 bash
4.查看容器啓動日誌。centos
docker logs -f docker-nacos-server1.0.0
綜上咱們能夠看出,運行單個docker
容器咱們要用命衆多命令來管理容器,這種狀況下如果只運行一個容器還好,但若是咱們有一堆容器(如: mysql
、kibana
、 elasticsearch
等等...)須要執行的話,這樣管理是極其麻煩的,利器docker-compose
的出現便解決了此類問題。數組
docker-compose.yml
文件去定義多個容器的應用,經過一條命令就能夠根據docker-compose.yml
文件建立出指定的容器,文件格式以下(使用docker-compose.yml
部署微服務調用鏈監控組件skywalking
):version: '2' services: elasticsearch: image: elasticsearch:5.6 container_name: elasticsearch ports: - 9200:9200 volumes: - ./es/data:/usr/share/elasticsearch/data - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml kibana: image: kibana:5.6 container_name: kibana ports: - 5601:5601 links: - elasticsearch:elasticsearch depends_on: - elasticsearch environment: ELASTICSEARCH_URL: http://elasticsearch:9200 skywalking: image: weihanli/skywalking:5.0.0-GA container_name: skywalking ports: - 10800:10800 - 11800:11800 - 12800:12800 - 8090:8080 volumes: - ./skywalking/application.yml:/app/skywalking/config/application.yml links: - elasticsearch:elasticsearch depends_on: - elasticsearch
可參考前言介紹。bash
從github上下載docker-compose二進制文件 https://github.com/docker/com... 並按描述安裝。服務器
1.下載最新版的docker-compose文件。
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
2.添加可執行權限。
sudo chmod +x /usr/local/bin/docker-compose
3.測試安裝結果。
docker-compose --version
4.安裝pip。
sudo pip install docker-compose
1.在centos
上建立一個docker-compose.yml
文件,裏面寫上本身的多容器內容,如上述skywalking
對應的文件內容。
2.最後在centos
上打開docker-compose.yml
所在的文件夾路徑下執行docker-compopse up
就能夠啓動了,若是須要後臺啓動則爲docker-compopse up -d
。
經過上述描述咱們能夠看到一份標準配置文件應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分,下面先來看 services 的書寫規則。
指定 docker-compose.yml 文件的寫法格式,如:
version: '3'
定義多個容器服務集合,如定義docker-mysql5.7-master-service和elasticsearch-service兩個容器服務寫法:
services: docker-mysql5.7-master-sevice: image: registry.cn-beijing.aliyuncs.com/wangjihong/mysql:5.7 container_name: docker-mysql5.7-master ports: - 3300:3306 elasticsearch-sevice: image: elasticsearch:5.6 container_name: elasticsearch ports: - 9200:9200
標明image的ID,這個image的ID能夠是本地也能夠是遠程的,若是本地不存在,Compose會嘗試去pull下來,如在services標籤下的第二級標籤是docker-mysql5.7-master-service,它表示服務名稱,用戶可自定義名稱,image則是指定服務的鏡像名稱或鏡像ID,若是鏡像在本地不存在,Compose將會嘗試拉取這個鏡像。
services: docker-mysql5.7-master-sevice: image: registry.cn-beijing.aliyuncs.com/wangjihong/mysql:5.7 container_name: docker-mysql5.7-master ports: - 3300:3306
配置構建時,Compose會利用它自動構建鏡像,該值能夠是一個路徑,也能夠是一個對象,用於指定Dockerfile參數。該參數指定Dockerfile文件的路徑,Compose將會以一個已存在的名稱進行構建並標記,並隨後使用這個image。
示例:
services: docker-mysql5.7-master-sevice: image: mysql:5.7 container_name: docker-mysql5.7-master ports: - 3300:3306 build: context: /usr/local/dockerfiles/mysql dockerfile: Dockerfile args: - buildno=1 - password=secre
示例說明:
docker-mysql5.7-master-sevice容器服務會根據/usr/local/dockerfiles/mysql路徑下的Dockerfile文件以buildno=1,password=secre爲環境變量來構建出一個image ID爲mysql:5.7的鏡像。其中:
context
:是一個目錄路徑,也能夠是一個git repository url。 當所提供的值是相對路徑的時候,它被解釋爲compose文件位置的相對路徑。目錄裏的信息會被當作構建內容發送到Docker daemon, context只支持version2+, version1只能使用build。
dockerfile
:Compose將會使用指定的該Dockerfile文件去構建,但必須指定路徑,如與context搭配使用。
args
:僅支持Version2+,用於添加構建環境變量參數,可是僅構建過程期間可使用,如:
ARG buildno ARG password RUN echo "Build number: $buildno" RUN script-requiring-password.sh "$password"
表示服務之間的依賴關係,做用以下:
1.docker-compose up
將會根據依賴關係的順序開啓全部服務,下面的例子中, kibana會早於elasticsearch服務先啓動。
2.docker-compose up
SERVICE會自動包含 SERVICE的依賴,下面的例子中, 執行docker-compose up命令時kibana將會建立,同時也會啓動elasticsearch服務。
version: '2' services: elasticsearch: image: elasticsearch:5.6 container_name: elasticsearch ports: - 9200:9200 volumes: - ./es/data:/usr/share/elasticsearch/data - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml kibana: image: kibana:5.6 container_name: kibana ports: - 5601:5601 links: - elasticsearch:elasticsearch depends_on: - elasticsearch environment: ELASTICSEARCH_URL: http://elasticsearch:9200
注意:kibana服務啓動前並不會等待elasticsearch服務到ready狀態才啓動。若是須要等待其餘服務到ready狀態,能夠參考https://docs.docker.com/compo...。
環境變量配置,能夠用數組或字典兩種方式。
格式如:
environment: RACK_ENV: development SHOW: 'ture' ------------------------- environment: - RACK_ENV=development - SHOW=ture
示例如:
version: '2' services: kibana: image: kibana:5.6 container_name: kibana ports: - 5601:5601 links: - elasticsearch:elasticsearch depends_on: - elasticsearch environment: ELASTICSEARCH_URL: http://elasticsearch:9200
從文件中獲取環境變量,能夠指定一個文件路徑或路徑列表,其優先級低於 environment指定的環境變量。
env_file: .env --------------- env_file: - ./common.env
將指定容器鏈接到當前鏈接,能夠設置別名,避免ip方式致使的容器重啓動態改變的沒法鏈接狀況,達到服務之間可使用服務名稱相互訪問,links 容許定義一個別名,從而使用該別名訪問其它服務,相似於微服務中的根據服務名查找主機服務的場景。
version: '2' services: kibana: image: kibana:5.6 container_name: kibana ports: - 5601:5601 links: # 指定服務名稱:別名 - elasticsearch:elasticsearch-server
備註:示例中kibana服務就可使用elasticsearch或elasticsearch-server做爲hostname訪問elasticsearch:elasticsearch服務了。
掛載指定的路徑或者named volumes, 能夠在主機上指定一個路徑 HOST:CONTAINER, 或者一個只讀的HOST:CONTAINER:ro。
volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume
示例
將容器的/usr/share/elasticsearch/data掛載到宿主機的./es/data文件下。目的是能夠不進入容器內部直接經過宿主機的./es/data目錄就能夠看到容器的數據內容,避免容器刪除銷燬後形成把數據也銷燬了的嚴重問題。
version: '2' services: elasticsearch: image: elasticsearch:5.6 container_name: elasticsearch ports: - 9200:9200 volumes: - ./es/data:/usr/share/elasticsearch/data - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
對外暴露端口,只將端口暴露給鏈接的服務(已經linked的service可訪問),而不暴露給主機。
expose: - "6666" - "8888"
對外暴露的端口定義,和expose對應。
格式:- "宿主機端口:容器暴露端口"
ports: # 暴露端口信息 - "3300:3306" - "8080:8080"
注意:
當以 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" - "127.0.0.1:5000-5010:5000-5010
覆蓋容器啓動後默認執行的命令。
command: bundle exec thin -p 3000 ---------------------------------- command: [bundle,exec,thin,-p,3000]
配置 dns 服務器,能夠是一個值或列表。
dns: 8.8.8.8 ------------ dns: - 8.8.8.8 - 9.9.9.9
配置 DNS 搜索域,能夠是一個值或列表。
dns_search: example.com ------------------------ dns_search: - dc1.example.com - dc2.example.com
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
--no-color 單色輸出,不顯示其餘顏. -f, --follow 跟蹤日誌輸出,就是能夠實時查看日誌 -t, --timestamps 顯示時間戳 --tail 從日誌的結尾顯示,--tail=200
添加 metadata 到容器中。可使用數組或字典。
labels: app-description: "website for wangjihong" app-website: "www.wangjihong.com.cn" app-memo: "一個不太神奇的網站" labels: - "app-description=website for wangjihong" - "app-website=www.wangjihong.com.cn" - "app-memo=一個不太神奇的網站"
將當前的PID設置爲主機的PID,從而打開容器和host操做系統之間的PID地址共享。帶有PID啓動的容器能夠訪問和操縱其餘真實機器空間容器。
pid:"host"
Docker Compose 經常使用命令與配置以下(與docker命令基本一致)。
列出全部運行容器。
docker-compose ps
查看服務日誌輸出。
docker-compose logs
打印綁定的公共端口,下面命令能夠輸出 elasticsearch 服務 9002 端口所綁定的公共端口。
docker-compose port elasticsearch 9002
構建或者從新構建服務。
docker-compose build
啓動指定服務已存在的容器。
docker-compose start elasticsearch
中止已運行的服務的容器。
docker-compose stop elasticsearch
刪除指定服務的容器。
docker-compose rm elasticsearch
構建、啓動容器。
----前臺啓動--- docker-compose up ----後臺啓動--- docker-compose up -d ----指定文件後臺啓動--- docker-compose -f docker-compose-nacos.yml up -d
經過發送 SIGKILL 信號來中止指定服務的容器。
docker-compose kill elasticsearch
下載服務鏡像。
docker-compose pull elasticsearch
設置指定服務運行容器的個數,以 service=num 形式指定。
docker-compose scale user=3 movie=3
在一個服務上執行一個命令。
docker-compose run elasticsearch bash
本文只是介紹了docker-compose基本內容,想深刻了解能夠自行查資料,嘿嘿。