目錄
一.docker-compose簡述
什麼是docker-compose
- compose是定義和運行多容器的Docker應用程序的工具。使用compose可以使用YAML文件來配置應用程序。然後,使用單個命令,就可以創建並且啓動配置中的所有服務。
- compose適用於所有環境:生產,開發,測試以及CI工作流程。使用compose基本上有三步流程:
1.使用Dockerfile定義應用程序的環境,以便於在任何地方進行復制。
2.在docker-compose.yml中定義組成應用程序的服務,以便於他們可以在隔離的環境中一起運行。
3.運行docker-compose並且撰寫開始並且運行你的整個應用程序
- docker-compose是用來做docker的多容器控制,docker-compose是一個用來把docker自動化的工具,有了docker-compose你可以把所有繁複的docker操作使用一條命令自動化完成。
容器的編排與部署
- docker有很多優勢,但是對於運維或者開發來說,docker最大的優點在於它提供了一種全新的發佈機制。這種發佈機制指的是我們使用docker鏡像作爲統一的軟件製品載體,使用docker容器提供獨立的軟件運行環境,使用docker hub提供鏡像統一的協作,最重要的是該機制使用dockerfile定義容器內部行爲和容器關鍵屬性來支持軟件的運行。
- Dockerfile作爲整個機制的核心,這是一個非常了不起的創新。因爲在Dockerfile文件中,不但能夠定義使用者在容器中需要進行的操作,而且能夠定義容器中運行軟件需要的配置,於是軟件開發和運維終於能夠在一個配置文件上達成統一。運維人員使用同一個Dockerfile能在不同的場合下“重現”與開發者環境中一模一樣的運行單元(docker容器)出來。
- 編排,即orchestration,它根據被部署的對象之間的耦合關係,以及被部署對象環境的依賴,制定部署流程中各個動作的執行順序,部署過程所需要的依賴文件的存儲位置和獲取方式,以及如何驗證部署成功,這些信息都會在編排工具中指定的格式(比如配置文件或者特定的代碼)來要求運維人員定義並且保存起來,從而保證這個流程能夠隨時在全新的環境中可靠有序地重現出來。
- 部署,即deployment,它是按照編排所指定地內容和流程,在目標機器上執行編排指定環境初始化,存放指定的依賴和文件,運行指定的部署動作,最終按照編排中的規則來確定聯署成功。
compose的原理
- docker-compose的調用過程如下:
首先,用戶執行的docker-compose up指令調用了命令行中的啓動方法。功能簡單明瞭,一個docker-compose.yml文件定義了一個docker-compose的project(項目),docker-compose操作提供的命令行參數規則作爲這個project的啓動參數交由peoject模塊去處理。
其次,如果當前宿主機已經存在與該應用對應的容器,docker-compose將進行爲邏輯判斷。如果用戶指定可以重新啓動已有服務,docker-compose就會執行service模塊的容器重啓方法,否則就直接啓動已有容器。這兩種操作的區別在於前者會停止舊的容器,創建新的容器,並且把舊的容器移除掉。在這個過程中創建容器的各項定義參數都是從docker-compose up指令和docker-compose.yml中傳入的。
接着,啓動容器的方法也很簡潔,這個方法中完成了一個docker容器啓動所需要的主要參數的封裝,並且在container模塊執行啓動。
最後,container模塊會調用docker-py客戶端執行docker daemon發起創建容器的POST請求,再往後就是Docker處理的範疇
二.安裝docker-compose
安裝docker-compose
- 網絡優化
[root@192 ~]# vim /etc/sysctl.conf
[root@192 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@192 ~]#
- 下載docker-compose執行文件,且添加權限
//下載docker-compose執行文件
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
//添加執行權限
chmod +x /usr/local/bin/docker-compose
//查看版本
[root@192 ~]# docker-compose -v
docker-compose version 1.21.1, build 5a3f1a3
[root@192 ~]#
注:在使用curl下載docker-compose時,可以選擇更高的版本
三.Docker-compose的相關命令格式
- docker-compose的命令格式
//命令格式
docker-compose [ -f <arg>... ] [options] [COMMAND] [ARGS...]
//命令選項如下
-f,--file FILE指定compose模板文件,默認爲docker-compose.yml,可以多次指定。
-p,--project-name NAME指定項目名稱,默認將使用所在目錄名稱作爲項目名
-x-network-driver 使用Dockerfile的可拔插網絡後端特性(需要docker 1.9版本以上)
-x-network-driver DRIVER指定網絡後端的驅動,默認爲bridge
-verbose 輸出更多的調式信息
-v,打印版本並且退出
-
docker-compose up的使用
//docker-compose up的命令格式
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
//選項包括:
-d 在後臺運行服務容器
–no-color 不使用顏色來區分不同的服務的控制輸出
–no-deps 不啓動服務所鏈接的容器
–force-recreate 強制重新創建容器,不能與–no-recreate同時使用
–no-recreate 如果容器已經存在,則不重新創建,不能與–force-recreate同時使用
–no-build 不自動構建缺失的服務鏡像
–build 在啓動容器前構建服務鏡像
–abort-on-container-exit 停止所有容器,如果任何一個容器被停止,不能與-d同時使用
-t, –timeout TIMEOUT 停止容器時候的超時(默認爲10秒)
–remove-orphans 刪除服務中沒有在compose文件中定義的容器
–scale SERVICE=NUM 設置服務運行容器的個數,將覆蓋在compose中通過scale指定的參數
docker-compose up
啓動所有服務
docker-compose up -d
在後臺所有啓動服務
-f 指定使用的Compose模板文件,默認爲docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
-
docker-compose的常用命令
docker-compose常用命令:
build 構建或重建服務
kill 殺掉容器
logs 顯示容器的輸出內容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務鏡像
restart 重啓服務
rm 刪除停止的容器
run 運行一個一次性命令
scale 設置服務的容器數目
exec 在容器裏搪行命令
start 開啓服務
stop 停止服務
up 創建並啓動容器
四.compose編排nginx
YAML文件格式以及常用字段
- YAML是一種標記語言,可讀性很強。類似於XML數據描述語言,語法比XML簡單的多。YAML數據結構通過縮進來表示,連續的項目通過減號來表示,鍵值對用冒號分融,數組用括號括起來,hash用花括號。
- YAML文件格式注意事項:
- 在縮排中空白字符的數目並不是非常重要,只要相同階層的元素左側對齊就可以了(不過不能使用TAB字符);
- 通常開頭縮進2個空格;
- 字符的後面縮進1個空格,比如冒號、逗號、橫杆;
- 支持#註釋;
- 允許在文件中加入選擇性的空行,以增加可讀性;
- docker-compose中YAML常用的字段:
字段 | 描述 |
build dockerfile context |
指定dockerfile文件名構建鏡像上下文路徑 |
image | 指定鏡像 |
command | 執行命令,覆蓋默認命令 |
container_name | 指定容器名稱,由於容器名稱唯一,如果指定自定義名稱,則無發scale |
deploy | 指定部署和運行服務相關配置,只能在swarm模式中使用 |
environment | 添加環境變量 |
networks | 加入網絡,引用頂級networks下條目 |
ports | 映射端口,與-p功能相同,但是端口不能低於60 |
volumes | 掛載宿主機路徑或命名卷。如果命名卷在頂級volumes定義卷名稱 |
restart | 重啓策略,默認爲no,always | on-failure | unless-stopped |
hostname | 定義容器主機名 |
編排nginx容器的具體步驟
- 使用tree命令查看具體的文件以及目錄
[root@192 ~]# tree /compose_nginx/
/compose_nginx/
├── docker-compose.yml
├── nginx
│?? ├── Dockerfile
│?? ├── nginx-1.12.2.tar.gz
│?? └── run.sh
└── wwwroot
├── 1.gif
└── index.html
2 directories, 6 files
[root@192 ~]#
//創建compose_nginx這個目錄用來存放相關的編排文件以及素材
//創建docker-compose.yml這個目錄用來編排服務
//創建nginx這個目錄用來存放Dockerfile文件以及源碼包
//船艦wwwroot用作數據卷,作爲nginx的站點目錄
- nginx目錄下的Dockerfile配置以及run.sh文件的配置(鏡像製作參考上一篇博文)
[root@192 nginx]# cat Dockerfile
FROM guyton/centos6
MAINTAINER this is nginx image <xu>
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@192 nginx]# cat run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@192 nginx]#
- docker-compose.yml自動編排文件的配置(注意使用docker-compse.yml不能用Tab鍵,可以使用空格鍵)
[root@192 ~]# cd /compose_nginx/
[root@192 compose_nginx]# cat docker-compose.yml
version: '3.3' ##定義compose的版本號,可用docker-compose version 命令查看docker-py version
services: ##定義具體的服務
nginx:
hostname: nginx ##定義編排的容器名字
build: ##指定創建容器服務的路徑
context: ./nginx
dockerfile: Dockerfile
ports: ##映射容器服務的端口,相當於docker run中的 -p
- 1216:80
- 1217:443
networks: ##定義網絡名稱
- cluster
volumes: ##設置數據卷
- ./wwwroot/:/usr/local/nginx/html
networks: ##定義全局網絡名稱
cluster:
[root@192 compose_nginx]#
- 編排容器服務
//-f必須指定具體的文件路徑,所以在/compose_nginx目錄下直接使用文件
[root@192 compose_nginx]# docker-compose -f docker-compose.yml up -d
Successfully built 64a6a18722f0
Successfully tagged compose_nginx_nginx:latest
WARNING: Image for service nginx was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating compose_nginx_nginx_1 ... done
[root@192 compose_nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
compose_nginx_nginx latest 64a6a18722f0 45 seconds ago 672MB
guyton/centos6 latest 5f3e1df89d22 15 months ago 228MB
[root@192 compose_nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30d2416ae0eb compose_nginx_nginx "/run.sh" About a minute ago Up About a minute 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
//使用docker-compose編排之後會生產鏡像文件,和容器
- 檢測容器服務