Docker Compose 项目
二、Docker Compose 項目
compose項目簡介
compose項目來源于之前的Fig項目,使用python代碼編寫。compose項目主要用于編排部署基于docker的應(yīng)用。本身與docker/swarm配合度很高。
Docker Compose 是 Docker 編排服務(wù)的一部分,可以讓用戶在其它平臺快速安裝Docker,Swarm 可以讓 Docker 容器在集群中高效運轉(zhuǎn),而 Compose 可以讓用戶在集群中部署分布式應(yīng)用。簡單的說,Docker Compose 屬于一個“應(yīng)用層”的服務(wù),用戶可以定義哪個容器組運行哪個應(yīng)用,它支持動態(tài)改變應(yīng)用,并在需要時擴(kuò)展。?
相對于kubernetes來說功能比較簡單,相當(dāng)于kubernetes的一個子集。
?
dockerfile可以讓用戶管理一個單獨的應(yīng)用容器,而Compose則允許用戶在一個模板(yaml格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個Project,即項目),例如一個調(diào)度器,兩個web服務(wù)容器再加上后端的數(shù)據(jù)庫服務(wù)容器等。
安裝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.confroot@localhost apache]# docker build -t centos:supervisord .
#wget ?https://bootstrap.pypa.io/get-pip.py??開始安裝
#python get-pip.py
再安裝compose
[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???查看幫助
首先介紹幾個術(shù)語。
服務(wù)(service):一個應(yīng)用容器,實際上可以運行多個相同鏡像的實例。
項目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個完整業(yè)務(wù)單元。
可見,一個項目可以由多個服務(wù)(容器)關(guān)聯(lián)而成,Compose 面向項目進(jìn)行管理。
?
docker-compose 命令說明
大多數(shù)Compose命令都是運行于一個或多個服務(wù)的,如果服務(wù)沒有指定,該命令將會應(yīng)用到所有服務(wù),如果要獲得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說明:
build?
創(chuàng)建或者再建服務(wù)?
服務(wù)被創(chuàng)建后會標(biāo)記為project_service(比如composetest_db),如果改變了一個服務(wù)的Dockerfile或者構(gòu)建目錄的內(nèi)容,可以使用docker-compose build來重建它
?
help?
顯示命令的幫助和使用信息
?
kill?
通過發(fā)送SIGKILL的信號強(qiáng)制停止運行的容器,這個信號可以選擇性的通過,比如:?
docker-compose kill -s SIGKINT
?
logs?
顯示服務(wù)的日志輸出
?
port?
為端口綁定輸出公共信息
?
ps?
顯示容器
?
pull?
拉取服務(wù)鏡像
?
rm?
刪除停止的容器
?
run?
在服務(wù)上運行一個一次性命令,比如:?
docker-compose run web?Python?manage.py shell
?
scale?
設(shè)置為一個服務(wù)啟動的容器數(shù)量,數(shù)量是以這樣的參數(shù)形式指定的:service=num,比如:?
docker-compose scale web=2 worker=3
?
start?
啟動已經(jīng)存在的容器作為一個服務(wù)
?
stop?
停止運行的容器而不刪除它們,它們可以使用命令docker-compose start重新啟動起來
?
up?
為一個服務(wù)構(gòu)建、創(chuàng)建、啟動、附加到容器?
連接的服務(wù)會被啟動,除非它們已經(jīng)在運行了?
運行docker-compose up -d會在后臺啟動容器并使它們運行?
?
–verbose?
顯示更多輸出
?
–version?
顯示版本號并退出
?
-f,–file FILE?
指定一個可選的Compose yaml文件(默認(rèn):docker-compose.yml)
?
-p,–project-name NAME?
指定可選的項目名稱(默認(rèn):當(dāng)前目錄名稱)
?
docker-compose.yml命令說明 ?
每一個定義在docker-compose.yml中的服務(wù)必須明確指定一個p_w_picpath或者build選項,這與docker run命令行中輸入的是對應(yīng)相同的,對于docker run,在Dockerfile文件中指定的選項(比如CMD、EXPOSE、VOLUME、ENV)是默認(rèn)的,因此不必在docker-compose.yml中再指定一次 ?
?
p_w_picpath ??
標(biāo)明p_w_picpath的ID,這個p_w_picpath ID可以是本地也可以是遠(yuǎn)程的,如果本地不存在,Compose會嘗試去pull下來
p_w_picpath: ubuntu ???
p_w_picpath: orchardup/postgresql ???
p_w_picpath: a4bc65fd ???
?
build ??
該參數(shù)指定Dockerfile文件的路徑,該目錄也是發(fā)送到守護(hù)進(jìn)程的構(gòu)建環(huán)境(這句有點),Compose將會以一個已存在的名稱進(jìn)行構(gòu)建并標(biāo)記,并隨后使用這個p_w_picpath ?
build: /path/to/build/dir ???
?
command ??
重寫默認(rèn)的命令,覆蓋容器啟動后默認(rèn)執(zhí)行的命令
command:?要執(zhí)行的命令????
?
links ??
連接到其他服務(wù)中的容器,可以指定服務(wù)名稱和這個鏈接的別名,或者只指定服務(wù)名稱 ?
links: ???
?- db ???
?- db:database ???
?- redis ???
此時,在容器內(nèi)部,會在/etc/hosts文件中用別名創(chuàng)建一個條目,就像這樣: ?
172.17.2.186 ?db ???
172.17.2.186 ?database ???
172.17.2.186 ?redis ???
?
環(huán)境變量也會被創(chuàng)建,關(guān)于環(huán)境變量的參數(shù),會在后面講到 ?
?
external_links ??
連接到在這個docker-compose.yml文件或者Compose外部啟動的容器,特別是對于提供共享和公共服務(wù)的容器。在指定容器名稱和別名時,external_links遵循著和links相同的語義用法 ?
external_links: ???
?- redis_1 ???
?- project_db_1:mysql ???
?- project_db_1:postgresql ???
?
ports ??
暴露端口,指定兩者的端口(主機(jī):容器),或者只是容器的端口(主機(jī)會被隨機(jī)分配一個端口) ?
注:當(dāng)以 主機(jī):容器 的形式來映射端口時,如果使容器的端口小于60,那可能會出現(xiàn)錯誤,因為YAML會將 xx:yy這樣格式的數(shù)據(jù)解析為六十進(jìn)制的數(shù)據(jù),基于這個原因,時刻記得要將端口映射明確指定為字符串 ?
ports: ???
?- "3000" ???
?- "8000:8000" ???
?- "49100:22" ???
?- "127.0.0.1:8001:8001" ???
?
expose ??
暴露端口而不必向主機(jī)發(fā)布它們,而只是會向鏈接的服務(wù)(linked service)提供,只有內(nèi)部端口可以被指定 ?
?
expose: ???
?- "3000" ???
?- "8000" ???
?
volumes ??
掛載路徑最為卷,可以選擇性的指定一個主機(jī)上的路徑(主機(jī):容器),或是一種可使用的模式(主機(jī):容器:ro) ?
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
?
volumes_from: ???
從另一個服務(wù)或容器掛載它的所有卷。
volumes_from: ?
- service_name ???
?- container_name ???
?
environment ??
加入環(huán)境變量,可以使用數(shù)組或者字典,只有一個key的環(huán)境變量可以在運行Compose的機(jī)器上找到對應(yīng)的值,這有助于加密的或者特殊主機(jī)的值 ?
environment: ???
??RACK_ENV: development ???
??SESSION_SECRET: ???
environments: ???
??- RACK_ENV=development ???
??- SESSION_SECRET ???
??
env_file ??
從一個文件中加入環(huán)境變量
如果通過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基于模板文件路徑。如果有變量名稱與 environment 指令沖突,則以后者為準(zhǔn)。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
# common.env: Set Rails/Rack environment
RACK_ENV=development??
?
net ??
網(wǎng)絡(luò)模式,可以在docker客戶端的--net參數(shù)中指定這些值 ?
net: "bridge" ???
net: "none" ???
net: "container:[name or id]" ???
net: "host" ???
?
dns ??
自定義DNS服務(wù),可以是一個單獨的值或者一張列表 ?
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只需要簡單的三個步驟:
首先,使用Dockerfile或docker ?commit來定義你的應(yīng)用環(huán)境
第二步,用一個docker-compose.yml來定義你的應(yīng)用,他們可以在下個互隔離的容器中組成你的應(yīng)用。
第三步,執(zhí)行docker-compose up??-d來啟動你的應(yīng)用,它會根據(jù)docker-compose.yml的設(shè)置來pull/run相關(guān)的容器。
我們創(chuàng)建一個經(jīng)典的 Web 項目:一個 Haproxy,掛載三個 Web 容器。
docker-haproxy目錄,作為項目工作目錄,并在其中分別創(chuàng)建兩個子目錄: haproxy ?和web。
[root@localhost?apache]#?mkdir?-p?/root/docker-haproxy/{haproxy,web}在/root/docker-haproxy/目錄下創(chuàng)建docker-compose.yml文件
在/root/docker-haproxy/haproxy目錄下創(chuàng)建haproxy的主配置文件haproxy.cfg
在/root/docker-haproxy/web目錄下存放web站點網(wǎng)頁文件
目錄結(jié)構(gòu)如下圖所示:
Web 子目錄:
生成一個index.html文件,其內(nèi)容:
[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 使用的主模板文件。內(nèi)容十分簡單,指定 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目錄下執(zhí)行docker-compose up??-d來啟動你的應(yīng)用
#cd docker-haproxy
[root@localhost?docker-haproxy]#?docker-compose?up?-d查看容器啟動情況
[root@localhost?docker-haproxy]#?docker?ps打開瀏覽器本機(jī)本機(jī)IP?192.168.100.15
轉(zhuǎn)載于:https://blog.51cto.com/chaixinwang/1962048
總結(jié)
以上是生活随笔為你收集整理的Docker Compose 项目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机关机又自动重启,为什么w7电脑关机
- 下一篇: 学习笔记(11月08日)--异常