Docker容器:Docker-Compose
一.Docker-Compose概念
1.Docker-Compose使用場(chǎng)景
一個(gè)Dockerfile模板文件可以定義一個(gè)單獨(dú)的應(yīng)用容器,如果需要定義多個(gè)容器就需要服務(wù)編排。服務(wù)編排有很多種技術(shù)方案,今天是介紹 Docker 官方產(chǎn)品 Docker Compose 。
docker swarm(管理跨節(jié)點(diǎn))。
Dockerfile可以讓用戶管理一個(gè)單獨(dú)的應(yīng)用容器;而Compose則允許用戶在一個(gè)模板(YAML格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個(gè) project,即項(xiàng)目),例如一個(gè) Web 服務(wù)容器再加上后端的數(shù)據(jù)庫服務(wù)容器等。
2.Docker-Compose介紹
2.1 Docker-Compose功能
Docker-Compose項(xiàng)目是Docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排。
2.2 Docker-Compose組成
(1)Docker-Compose將所管理的容器分為三層,分別是工程(project),服務(wù)(service)以及容器(container)。
(2)Docker-Compose運(yùn)行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個(gè)工程,若無特殊指定工程名即為當(dāng)前目錄名。一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)、依賴。一個(gè)服務(wù)當(dāng)中可包括多個(gè)容器實(shí)例,Docker-Compose并沒有解決負(fù)載均衡的問題,因此需要借助其它工具實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及負(fù)載均衡,比如 Consul。
(3)Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml,可通過環(huán)境變量COMPOSE_FILE或-f參數(shù)自定義配置文件,其定義了多個(gè)有依賴關(guān)系的服務(wù)及每個(gè)服務(wù)運(yùn)行的容器。
(4)使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。在工作中,經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)Web項(xiàng)目,除了Web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等。
Compose允許用戶通過一個(gè)單獨(dú)的docker-compose.yml模板文件(YAML 格式)來定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目(project)。
Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API, 就可以在其上利用Compose來進(jìn)行編排管理。
3.Docker-Compose安裝部署
#注意必須是在安裝docker的基礎(chǔ)上
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#下載安裝包單獨(dú)安裝DockerCompose
chmod +x /usr/local/bin/docker-compose
#docker-compose添加執(zhí)行權(quán)限
docker-compose --version
#查看docker-compose版本
4.YML文件編寫注意事項(xiàng)
YML是標(biāo)記語言可以很直觀的展示數(shù)據(jù)序列化格式,可讀性高,類似于XML數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)通過縮進(jìn)表示,連續(xù)的項(xiàng)目通過減號(hào)來表示,鍵值對(duì)用冒號(hào)分隔,數(shù)組用中括號(hào)括起來,hash用花括號(hào)括起來{}
注意事項(xiàng):
(1)大小寫明確
(2)通過縮進(jìn)表示層級(jí)關(guān)系
(3)不支持制表符tab鍵縮進(jìn),只能使用空格縮進(jìn)
(4)縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)左右對(duì)齊,通常開頭縮進(jìn)2個(gè)空格
(5)#號(hào)注釋
(6)符號(hào)字符后縮進(jìn)1個(gè)空格,如冒號(hào):逗號(hào),橫杠-后面空一個(gè)格
(7)如果包含特殊字符用單引號(hào)和雙引號(hào)引起來會(huì)作為字符串處理,單引號(hào)不識(shí)別變量,雙引號(hào)識(shí)別變量。
#yml 格式
languages: #序列的映射
- Java
- Golang
- Python
websites: #映射的映射
cpu: 2
memory: 1024M
swap: 2048M
disk: 60G
數(shù)據(jù)結(jié)構(gòu):
對(duì)象映射: 鍵值對(duì)的字典
animal: pets
序列數(shù)組: 一組按次序排列的列表
- Cat
- Dog
- Goldfish
["Cat", "Dog", "Goldfish"]
布爾值
debug: true
debug: false
示例:
# yaml 格式
languages: #序列的映射
- Java
- Golang
- Python
websites: #映射的映射
cpu: 2
memory: 1024M
swap: 2048M
disk: 60G
鍵:{值}
# Json 格式
{
languages: [
'Java',
'Golang',
'Python'
],
resources: {
cpu: '2',
memory: '1024M',
swap: '2048M',
disk: '60G'
},
}
5.Compose配置常用字段
字段 | 描述 | 字段 | 描述 |
---|---|---|---|
build | 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build標(biāo)簽的子級(jí)標(biāo)簽中使用dockerfile標(biāo)簽指定 | dockerfile | 構(gòu)建鏡像上下文路徑 dockerfile-nginx |
context | 可以是 dockerfile 的路徑,或者是指向 git 倉庫的 url 地址 指定 Dockerfile在哪個(gè)目錄當(dāng)中 | image | 指定鏡像 |
command | 執(zhí)行命令,覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令 | container_name | 指定容器名稱,由于容器名稱是唯一的,如果指定自定義名稱,則無法scale指定容器數(shù)量 |
deploy | 指定部署和運(yùn)行服務(wù)相關(guān)配置,只能在 Swarm 模式使用 | environment | 添加環(huán)境變量 |
networks | 加入網(wǎng)絡(luò),引用頂級(jí)networks下條目 | network_mode | 設(shè)置容器的網(wǎng)絡(luò)模式,如 host,bridge,… |
ports | 暴露容器端口,與 -p 相同,但端口不能低于 60 | volumes | 掛載一個(gè)宿主機(jī)目錄或命令卷到容器,命名卷要在頂級(jí) volumes 定義卷名稱 |
volumes_from | 從另一個(gè)服務(wù)或容器掛載卷,可選參數(shù) :ro 和 :rw,僅版本 ‘2’ 支持 | hostname | 容器主機(jī)名 |
sysctls | 在容器內(nèi)設(shè)置內(nèi)核參數(shù) | links | 連接到另外一個(gè)容器,- 服務(wù)名稱[:服務(wù)別名] |
privileged | 用來給容器root權(quán)限,注意是不安全的,true | false | restart | 設(shè)置重啟策略,no,always,no-failure,unless-stoped no,默認(rèn)策略,在容器退出時(shí)不重啟容器。 on-failure,在容器非正常退出時(shí)(退出狀態(tài)非0),才會(huì)重啟容器。 on-failure:3,在容器非正常退出時(shí)重啟容器,最多重啟3次。 always,在容器退出時(shí)總是重啟容器。 unless-stopped,在容器退出時(shí)總是重啟容器,但是不考慮在 Docker 守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器。 |
depends_on | 在使用Compose時(shí),最大的好處就是少打啟動(dòng)命令,但一般項(xiàng)目容器啟動(dòng)的順序是有要求的,如果直接從上到下啟動(dòng)容器,可能會(huì)因?yàn)槿萜饕蕾噯栴}而啟動(dòng)失敗。例如在沒啟動(dòng)數(shù)據(jù)庫容器的時(shí)候啟動(dòng)應(yīng)用容器,應(yīng)用容器會(huì)因?yàn)檎也坏綌?shù)據(jù)庫而退出。depends_on標(biāo)簽用于解決容器的依賴、啟動(dòng)先后的問題。 | 例如 | php: depends_on: |
6.Docker Compose 常用命令
字段 | 描述 |
---|---|
build | 重新構(gòu)建服務(wù) |
ps | 列出容器 |
up | 創(chuàng)建和啟動(dòng)容器 |
exec | 在容器里面執(zhí)行命令 |
scale | 指定一個(gè)服務(wù)容器啟動(dòng)數(shù)量 |
top | 顯示容器進(jìn)程 |
logs | 查看容器輸出 |
down | 刪除容器、網(wǎng)絡(luò)、數(shù)據(jù)卷和鏡像 |
stop/start/restart | 停止/啟動(dòng)/重啟服務(wù) |
7.Docker Compose 文件結(jié)構(gòu)
yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml #創(chuàng)建模板腳本
├── nginx
│?? ├── Dockerfile #創(chuàng)建容器腳本
│?? ├── nginx-1.12.0.tar.gz #復(fù)制源碼包
│?? └── run.sh #啟動(dòng)服務(wù)腳本
└── wwwroot
└── index.html #站點(diǎn)網(wǎng)頁
二.Docker Compose搭建鏡像
1.Docker Compose搭建nginx 鏡像
1.1 準(zhǔn)備依賴文件
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
#將nginx安裝包導(dǎo)入nginx文件夾內(nèi)
cp nginx-1.12.0.tar.gz ./
vim Dockerfile
#基于基礎(chǔ)鏡像
FROM centos:7
#用戶信息
MAINTAINER this is nginx image <nginx>
#添加環(huán)境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上傳nginx軟件壓縮包,并解壓
ADD nginx-1.12.2.tar.gz /usr/local/src/
#指定工作目錄
WORKDIR /usr/local/src/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
#指定http和https端口
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html
#方法二:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #關(guān)閉 nginx 在后臺(tái)運(yùn)行
#添加宿主機(jī)中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
1.2 編寫配置文件docker-compose.yml
cd /opt/compose_nginx
vim docker-compose.yml
#文件內(nèi)容如下:
version: '3'
#docker-compose版本為3
services:
#使用services定義服務(wù)
nginx:
#容器名為nginx
container_name: web1
#使用dockerfile來構(gòu)建鏡像
hostname: nginx-test
#主機(jī)名為nginx-test
build:
context: ./nginx
#指定Dockerfile文件所在位置
dockerfile: Dockerfile
#指定文件名
ports:
#映射端口
- 1216:80
- 1217:443
networks:
lnmp:
ipv4_address: 172.18.0.10
#加入網(wǎng)絡(luò)設(shè)置此容器ip
volumes:
- ./wwwroot:/usr/local/nginx/html
#設(shè)置數(shù)據(jù)卷掛載
networks:
#設(shè)置網(wǎng)絡(luò)為自定義網(wǎng)絡(luò)
lnmp:
driver: bridge
#網(wǎng)絡(luò)模式
ipam:
config:
- subnet: 172.18.0.0/16
#設(shè)置自定義網(wǎng)絡(luò)的網(wǎng)段,設(shè)置完后保存退出
#編寫完畢docker-compose.yml文件后進(jìn)行鏡像創(chuàng)建并啟動(dòng)容器
docker-compose -f docker-compose.yml up -d
注釋:
-f, --file FILE :使用特定的 compose 模板文件,默認(rèn)為 docker-compose.yml
-p, --project-name NAME :指定項(xiàng)目名稱,默認(rèn)使用目錄名稱
-d :在后臺(tái)運(yùn)行
#創(chuàng)建并啟動(dòng)容器,-f指定yml文件,-d表示在后臺(tái)運(yùn)行
docker ps -a
#可以看到容器在運(yùn)行及映射端口
注:
#必須在docker-compose.yml所在目錄執(zhí)行此命令
cd /opt/compose_nginx/
docker-compose ps
#瀏覽器訪問映射端口進(jìn)行測(cè)試成功。
http://192.168.198.11:1216
2. docker Compose搭建tomcat鏡像
#首先創(chuàng)建一個(gè)tomcat的docker_compose文件夾
mkdir -p /opt/compose_tomcat/tomcat
cd /opt/compose_tomcat/tomcat
#將tomcat編譯安裝的jdk包和tomcat包放入tomcat文件夾中
#進(jìn)入tomcat文件夾編寫Dockerfile文件
cd /opt/compose_tomcat/tomcat
vim Dockerfile
#文件內(nèi)容如下
FROM centos:7
#基于centos:7鏡像
ADD jdk-8u201-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.16.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_201 /usr/local/java && mv /usr/local/apache-tomcat-8.5.16 /usr/local/tomcat
#將jdk和tomcat壓縮包復(fù)制到鏡像的/usr/local文件夾下并改名
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ENV PATH $JAVA_BIN:/usr/local/java/jre/bin:$PATH
#定義路徑變量
RUN mkdir /usr/local/tomcat/webapps/lucien \
&& echo -e "<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"UTF-8\"%>\n<html>\n<head>\n<title>JSP test1 page</title>\n</head>\n<body>\n<% out.println(\"123456\");%>\n</body>\n</html>" > /usr/local/tomcat/webapps/lucien/index.jsp \
&& sed -i '71a <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">' /usr/local/tomcat/conf/server.xml \
&& sed -i '72a <Context docBase="/usr/local/tomcat/webapps/lucien" path="" reloadable="true">' /usr/local/tomcat/conf/server.xml \
&& sed -i '73a </Context>' /usr/local/tomcat/conf/server.xml \
&& sed -i '74a </Host>' /usr/local/tomcat/conf/server.xml
#首先創(chuàng)建tomcat主頁存放路徑,然后添加主頁內(nèi)容,修改環(huán)境變量生效
EXPOSE 8080
#定義端口
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
#啟動(dòng)tomcat
④到compose_tomcat路徑下創(chuàng)建tomcat的yml文件
cd /opt/compose_tomcat
vim docker-compose.yml
#內(nèi)容如下:
version: '3'
#docker-compose版本
services:
#定義servers
tomcat:
#容器名tomcat
container_name: web2
hostname: tomcat-test
#主機(jī)名tomcat-test
build:
context: ./tomcat
dockerfile: Dockerfile
#鏡像構(gòu)建dockerfile文件夾位置及名稱
ports:
- 1280:8080
#端口映射
networks:
lnmp:
ipv4_address: 172.19.0.100
#tomcatip定義
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
#自定義網(wǎng)絡(luò)模式和網(wǎng)段,保存退出
version: '3'
services:
tomcat:
container_name: web2
hostname: tomcat-test
build:
context: ./tomcat
dockerfile: Dockerfile
ports:
- 1280:8080
networks:
lnmp:
ipv4_address: 172.19.0.10
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
#創(chuàng)建并啟動(dòng)tomcat容器,注意在/opt/compose_tomcat路徑下執(zhí)行
docker-compose -f docker-compose.yml up -d
#創(chuàng)建后臺(tái)啟動(dòng)tomcat容器
文章來源:http://www.zghlxwxcb.cn/news/detail-672000.html
docker ps -a
#查看容器狀態(tài)及端口映射
#訪問本機(jī)的1280端口查看是否成功
文章來源地址http://www.zghlxwxcb.cn/news/detail-672000.html
到了這里,關(guān)于Docker容器:Docker-Compose的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!