二、Docker Compose 項目

compose項目簡介

compose項目來源于之前的Fig項目,使用python代碼編寫。compose項目主要用于編排部署基于docker的應用。本身與dockerswarm配合度很高。

Docker Compose Docker 編排服務的一部分,可以讓用戶在其它平臺快速安裝DockerSwarm 可以讓 Docker 容器在集群中高效運轉,而 Compose 可以讓用戶在集群中部署分布式應用。簡單的說,Docker Compose 屬于一個“應用層”的服務,用戶可以定義哪個容器組運行哪個應用,它支持動態改變應用,并在需要時擴展。?
相對于kubernetes來說功能比較簡單,相當于kubernetes的一個子集。

?

dockerfile可以讓用戶管理一個單獨的應用容器,Compose則允許用戶在一個模板(yaml格式)中定義一組相關聯的應用容器(被稱為一個Project,即項目),例如一個調度器,兩個web服務容器再加上后端的數據庫服務容器等。

wKiom1mpXD-TpYEmAACkQBf4p9k834.png-wh_50


安裝Compose之前,要先安docker,里就不說了,

安裝Docker-compose

先安裝pip

注:pip類似RedHat里面的yum,安裝Python包非常方便

[root@localhost?apache]#?cat?dockerfile?
FROM?docker.wang.com/centos:centos7
MAINTAINER?from?cyh@example.com
RUN?yum?-y?install?python-setuptools
RUN?yum?-y?install?openssh-server??httpd??sudo
RUN?yum??-y??install??sudo??net-tools
RUN???yum?-y??install??sudo?bind-utils
RUN?useradd?admin
RUN?echo?"admin:admin"?|?chpasswd
RUN?echo?"admin?ALL=(ALL)?ALL"?>>?/etc/sudoers
RUN?ssh-keygen?-t?dsa?-f?/etc/ssh/ssh_host_dsa_key
RUN?ssh-keygen?-t?rsa?-f?/etc/ssh/ssh_host_rsa_key
RUN?ssh-keygen?-t?ed25519?-f?/etc/ssh/ssh_host_ed25519_key
RUN?ssh-keygen?-t?ecdsa?-f?/etc/ssh/ssh_host_ecdsa_key
RUN?mkdir?-p?/var/run/sshd
RUN?mkdir?-p?/home/admin/.ssh
RUN?sed?-ri?'s/session????required?????pam_loginuid.so/#session????required?????pam_loginuid.so/g'?/etc/pam.d/sshd
RUN?sed?-ri?'s/#ServerName?www.example.com:80/ServerName?www.benet.com/g'?/etc/httpd/conf/httpd.conf
COPY?supervisord.conf?/etc/supervisor/supervisord.conf
EXPOSE?22?80?
CMD?["/bin/bash","/run.sh"]
[root@localhost?apache]#?cat?supervisord.conf?
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd?-D[program:httpd]
command=/usr/sbin/httpd?-DFOREGROUND
[root@localhost?apache]#?ls
centos7.tar??dockerfile??supervisord.conf

root@localhost apache]# docker build -t centos:supervisord .

wKiom1mpXO_xmWtaAAAYSX2-rZw207.png-wh_50

#wget ?https://bootstrap.pypa.io/get-pip.py??開始安裝

#python get-pip.py

wKioL1mpXOiwL1TiAAAefzMA9ZQ772.png-wh_50

再安裝compose

wKiom1mpXQygfyX7AAAkr09kgAg113.png-wh_50

[root@localhost?apache]#?ln?-s?/usr/bin/docker-compose?/usr/local/bin/

安裝成功后,可以查看 ?docker-compose 的版本和 命令的用法。

#docker-compose ?-v

[root@localhost?apache]#?docker-compose?-v
docker-compose?version?1.16.0,?build?ea60ca1

#docker-compose ?-h???查看幫助

首先介紹幾個術語。

服務(service):一個應用容器,實際上可以運行多個相同鏡像的實例。

項目(project):由一組關聯的應用容器組成的一個完整業務單元。

可見,一個項目可以由多個服務(容器)關聯而成,Compose 面向項目進行管理。

?

docker-compose 命令說明

大多數Compose命令都是運行于一個或多個服務的,如果服務沒有指定,該命令將會應用到所有服務,如果要獲得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說明:

build?
創建或者再建服務?
服務被創建后會標記為project_service(比如composetest_db),如果改變了一個服務的Dockerfile或者構建目錄的內容,可以使用docker-compose build來重建它

?

help?
顯示命令的幫助和使用信息

?

kill?
通過發送SIGKILL的信號強制停止運行的容器,這個信號可以選擇性的通過,比如:?
docker-compose kill -s SIGKINT

?

logs?
顯示服務的日志輸出

?

port?
為端口綁定輸出公共信息

?

ps?
顯示容器

?

pull?
拉取服務鏡像

?

rm?
刪除停止的容器

?

run?
在服務上運行一個一次性命令,比如:?
docker-compose run web?Python?manage.py shell

?

scale?
設置為一個服務啟動的容器數量,數量是以這樣的參數形式指定的:service=num,比如:?
docker-compose scale web=2 worker=3

?

start?
啟動已經存在的容器作為一個服務

?

stop?
停止運行的容器而不刪除它們,它們可以使用命令docker-compose start重新啟動起來

?

up?
為一個服務構建、創建、啟動、附加到容器?
連接的服務會被啟動,除非它們已經在運行了?

運行docker-compose up -d會在后臺啟動容器并使它們運行?

?

–verbose?
顯示更多輸出

?

–version?
顯示版本號并退出

?

-f,–file FILE?
指定一個可選的Compose yaml文件(默認:docker-compose.yml

?

-p,–project-name NAME?
指定可選的項目名稱(默認:當前目錄名稱)

?

docker-compose.yml命令說明 ?

每一個定義在docker-compose.yml中的服務必須明確指定一個p_w_picpath或者build選項,這與docker run命令行中輸入的是對應相同的,對于docker run,在Dockerfile文件中指定的選項(比如CMDEXPOSEVOLUMEENV)是默認的,因此不必在docker-compose.yml中再指定一次 ?

?

p_w_picpath ??

標明p_w_picpathID,這個p_w_picpath ID可以是本地也可以是遠程的,如果本地不存在,Compose會嘗試去pull下來

p_w_picpath: ubuntu ???

p_w_picpath: orchardup/postgresql ???

p_w_picpath: a4bc65fd ???

?

build ??

該參數指定Dockerfile文件的路徑,該目錄也是發送到守護進程的構建環境(這句有點),Compose將會以一個已存在的名稱進行構建并標記,并隨后使用這個p_w_picpath ?

build: /path/to/build/dir ???

?

command ??

重寫默認的命令,覆蓋容器啟動后默認執行的命令

command:?要執行的命令????

?

links ??

連接到其他服務中的容器,可以指定服務名稱和這個鏈接的別名,或者只指定服務名稱 ?

links: ???

?- db ???

?- db:database ???

?- redis ???

此時,在容器內部,會在/etc/hosts文件中用別名創建一個條目,就像這樣: ?

172.17.2.186 ?db ???

172.17.2.186 ?database ???

172.17.2.186 ?redis ???

?

環境變量也會被創建,關于環境變量的參數,會在后面講到 ?

?

external_links ??

連接到在這個docker-compose.yml文件或者Compose外部啟動的容器,特別是對于提供共享和公共服務的容器。在指定容器名稱和別名時,external_links遵循著和links相同的語義用法 ?

external_links: ???

?- redis_1 ???

?- project_db_1:mysql ???

?- project_db_1:postgresql ???

?

ports ??

暴露端口,指定兩者的端口(主機:容器),或者只是容器的端口(主機會被隨機分配一個端口) ?

注:當以 主機:容器 的形式來映射端口時,如果使容器的端口小于60,那可能會出現錯誤,因為YAML會將 xx:yy這樣格式的數據解析為六十進制的數據,基于這個原因,時刻記得要將端口映射明確指定為字符串 ?

ports: ???

?- "3000" ???

?- "8000:8000" ???

?- "49100:22" ???

?- "127.0.0.1:8001:8001" ???

?

expose ??

暴露端口而不必向主機發布它們,而只是會向鏈接的服務(linked service)提供,只有內部端口可以被指定 ?

?

expose: ???

?- "3000" ???

?- "8000" ???

?

volumes ??

掛載路徑最為卷,可以選擇性的指定一個主機上的路徑(主機:容器),或是一種可使用的模式(主機:容器:ro) ?

volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

?

volumes_from: ???

從另一個服務或容器掛載它的所有卷。

volumes_from: ?

- service_name ???

?- container_name ???

?

environment ??

加入環境變量,可以使用數組或者字典,只有一個key的環境變量可以在運行Compose的機器上找到對應的值,這有助于加密的或者特殊主機的值 ?

environment: ???

??RACK_ENV: development ???

??SESSION_SECRET: ???

environments: ???

??- RACK_ENV=development ???

??- SESSION_SECRET ???

??

env_file ??

從一個文件中加入環境變量

如果通過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基于模板文件路徑。如果有變量名稱與 environment 指令沖突,則以后者為準。

env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
# common.env: Set Rails/Rack environment
RACK_ENV=development??

?

net ??

網絡模式,可以在docker客戶端的--net參數中指定這些值 ?

net: "bridge" ???

net: "none" ???

net: "container:[name or id]" ???

net: "host" ???

?

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 ???

?

使用Compose只需要簡單的三個步驟:

首先,使用Dockerfiledocker ?commit來定義你的應用環境

第二步,用一個docker-compose.yml來定義你的應用,他們可以在下個互隔離的容器中組成你的應用。

第三步,執行docker-compose up??-d來啟動你的應用,它會根據docker-compose.yml的設置來pull/run相關的容器。

我們創建一個經典的 Web 項目:一個 Haproxy,掛載三個 Web 容器。

docker-haproxy目錄,作為項目工作目錄,并在其中分別創建兩個子目錄: haproxy ?web

[root@localhost?apache]#?mkdir?-p?/root/docker-haproxy/{haproxy,web}

/root/docker-haproxy/目錄下創建docker-compose.yml文件

/root/docker-haproxy/haproxy目錄下創建haproxy的主配置文件haproxy.cfg

/root/docker-haproxy/web目錄下存放web站點網頁文件

目錄結構如下圖所示:

wKioL1mpXVXik-e4AAAMCy2M3G8274.png-wh_50

Web 子目錄:

生成一個index.html文件,其內容:

[root@localhost?docker-haproxy]#?cat?web/index.html?
鑫旺?威武
aproxy?目錄:
在其中生成一個??haproxy.cfg??文件
[root@localhost?haproxy]#?cat?haproxy.cfg?
globallog?127.0.0.1?local0log?127.0.0.1?local1?noticedefaultslog?globalmode?httpoption?httplogoption?dontlognulltimeout?connect?5000mstimeout?client?50000mstimeout?server?50000mslisten?statsbind?0.0.0.0:70stats?enablestats?uri?/frontend?balancerbind?0.0.0.0:80mode?httpdefault_backend?web_backendsbackend?web_backendsmode?httpoption?forwardforbalance?roundrobinserver?weba?weba:80?checkserver?webb?webb:80?checkserver?webc?webc:80?checkoption?httpchk?GET?/
docker-compose.yml

編寫 docker-compose.yml 文件,這個是 Compose 使用的主模板文件。內容十分簡單,指定 3 web 容器,以及 1 haproxy 容器。

[root@localhost?docker-haproxy]#?vim?docker-compose.yml?weba:p_w_picpath:?centos:supervisordvolumes:-?/root/docker-haproxy/web/:/var/www/html/expose:-?80
webb:p_w_picpath:?centos:supervisordvolumes:-?/root/docker-haproxy/web/:/var/www/html/expose:-?80
webc:p_w_picpath:?centos:supervisordvolumes:-?/root/docker-haproxy/web/:/var/www/html/expose:-?80
haproxy:p_w_picpath:?centos:supervisordvolumes:-?/root/docker-haproxy/haproxy/:/etc/haproxy/:rocommand:?/usr/local/haproxy/sbin/haproxy?-f?/etc/haproxy/haproxy.cfglinks:-?weba-?webb-?webcports:-?"80:80"-?"70:70"

運行 compose 項目:

docker-haproxy目錄下執行docker-compose up??-d來啟動你的應用

#cd docker-haproxy

[root@localhost?docker-haproxy]#?docker-compose?up?-d

查看容器啟動情況

[root@localhost?docker-haproxy]#?docker?ps

打開瀏覽器本機本機IP?192.168.100.15

wKioL1mpXfCA6gwfAAG_uB95uo8197.png-wh_50