Docker-compose詳解和LNMP搭建全過(guò)程
一、Docker-compose簡(jiǎn)介
1.前言
我們知道使用一個(gè)Dockerfile模板文件可以定義一個(gè)單獨(dú)的應(yīng)用容器,如果需要定義多個(gè)容器就需要服務(wù)編排。服務(wù)編排有很多種技術(shù)方案,如Docker 官方產(chǎn)品Docker Compose。
Dockerfile可以讓用戶管理一個(gè)單獨(dú)的應(yīng)用容器;而Compose則允許用戶在一個(gè)模板(YAML格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個(gè)project,即項(xiàng)目),例如一個(gè)Web服務(wù)容器再加上后端的數(shù)據(jù)庫(kù)服務(wù)容器等。
2.概述
- Docker-Compose項(xiàng)目是Docker官方的開(kāi)源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排。
- Docker-Compose將所管理的容器分為三層,分別是工程(project),服務(wù)(service) 以及容器(container)。
- Docker-Compose運(yùn)行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個(gè)工程,若無(wú)特殊指定工程名即為當(dāng)前目錄名。
一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)、依賴。
一個(gè)服務(wù)當(dāng)中可包括多個(gè)容器實(shí)例,Docker-Compose并沒(méi)有解決負(fù)載均衡的問(wèn)題,因此需要借助其它工具實(shí)現(xiàn)服務(wù) 發(fā)現(xiàn)及負(fù)載均衡,比如Consul。
- project:代表多個(gè)service組成的項(xiàng)目,默認(rèn)是用工作目錄的名稱作為project的工程名稱。
- service:一個(gè) service 可以包含一個(gè)或多個(gè)容器,在里面可以定義網(wǎng)絡(luò)模式端口鏡像數(shù)據(jù)卷等參數(shù)。
- container:可以直接由一個(gè)已存在的鏡像運(yùn)行實(shí)現(xiàn),也可以通過(guò)dockerfile構(gòu)建鏡像實(shí)現(xiàn)。
Docker-Compose的工程配置文件默認(rèn)為docker-compose. yml,可通過(guò)環(huán)境變量COMPOSE_FILE 或 -f 參數(shù)自定義配置文件,其定義了多個(gè)有依賴關(guān)系的服務(wù)及每個(gè)服務(wù)運(yùn)行的容器。
使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。在工作中,經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來(lái)完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)Web項(xiàng)目,除了Web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫(kù)服務(wù)容器,甚至還包括負(fù)載均衡容器等。
Compose允許用戶通過(guò)一個(gè)單獨(dú)的docker-compose. yml模板文件(YAML格式)來(lái)定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目 (project) 。
Docker-Compose項(xiàng)目由Python編寫(xiě),調(diào)用Docker服 務(wù)提供的API來(lái)對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API,就可以在其上利用Compose來(lái)進(jìn)行編排管理。
二、Docker-compose安裝
注意:Docker Compose是 Docker 的獨(dú)立產(chǎn)品,因此需要安裝 Docker 之后再單獨(dú)安裝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 #安裝,給予執(zhí)行權(quán)限 chmod +x /usr/local/bin/docker-compose #查看版本 docker-compose --version
安裝包下載
#下載好安裝包,直接上傳到系統(tǒng),給執(zhí)行權(quán)限,放在指定目錄 chmod +x docker-compose mv docker-compose /usr/local/bin/
三、YAML文件格式及編寫(xiě)注意事項(xiàng)
1.簡(jiǎn)介
YAML 是一種標(biāo)記語(yǔ)言,它可以很直觀的展示數(shù)據(jù)序列化格式,可讀性高。類似于 json 數(shù)據(jù)描述語(yǔ)言,語(yǔ)法比 json 簡(jiǎn)單的很多。
YAML 數(shù)據(jù)結(jié)構(gòu)通過(guò)縮進(jìn)來(lái)表示,連續(xù)的項(xiàng)目通過(guò)減號(hào)來(lái)表示,鍵值對(duì)用冒號(hào)分隔,數(shù)組用中括號(hào) [ ] 括起來(lái), hash用花括號(hào) { } 括起來(lái)。
使用 YAML 時(shí)需要注意下面事項(xiàng)
- 大小寫(xiě)敏感;
- 通過(guò)縮進(jìn)表示層級(jí)關(guān)系,不支持制表符 tab 鍵縮進(jìn),只能使用空格縮進(jìn);
- 縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)左對(duì)齊,通常開(kāi)頭縮進(jìn)2個(gè)空格;
- 用 # 號(hào)注釋;
- 符號(hào)字符后縮進(jìn)1個(gè)空格,如冒號(hào)":" 、逗號(hào) "," 、橫杠"-";
- 如果包含特殊字符用單引號(hào)' '引起來(lái),會(huì)作為普通字符串處理;雙引號(hào)" "引用起來(lái),特殊字符作為本身想表示的意思。
2.使用方法
(1)數(shù)據(jù)結(jié)構(gòu)
animals: pets #對(duì)象映射: 鍵值對(duì)的字典
(2)序列數(shù)組
pets: #對(duì)象映射: - cat - 序列值 - dog - pig pets: ["cat", "dog", "pig"] #另一種表達(dá)格式
示例
#序列的映射,是指針對(duì)一個(gè)對(duì)象,序列中的值都屬于該對(duì)象,如蔬菜包含包菜、胡蘿卜、土豆等。 vegetables: - potato - carrot - cabbage #映射的映射,是指針對(duì)一個(gè)對(duì)象有多個(gè)子對(duì)象,分別有他們的值,如系統(tǒng)狀態(tài)包含cpu、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán)等。 vmstat: cpu: 2 memory: 4G disk: 100G network: ipv4: 192.168.1.1 netmask: 255.255.255.0 gateway: 192.168.1.254 dns: 8.8.8.8
都是通過(guò)左對(duì)齊的層級(jí)關(guān)系來(lái)表示的
(3)布爾值
debug: true #真true,假false,不能用引號(hào)引用 debug: false
(4)文本塊
value: | # | 代表保留輸出文本的換行和回車(chē)符,不加的話即使文本換行也會(huì)在同一行顯示 hello #這種情況就是輸出 hello ,不加 | 就是 helloworld! world! world! | - #不保留文本塊末尾的換行 | + #會(huì)保留文本塊末尾的換行 value: > hello #將 > 后的字符串和之后的字符串用空格分開(kāi),即 hello world! world!
(5)打錨點(diǎn)和引用
type: &a string #&是打錨點(diǎn),后面跟的是錨點(diǎn)名稱,&a 代表的就是 string type: *a #*a 代表引用錨點(diǎn),此處輸出結(jié)果就是 type: string types: #此處就是輸出 types: - int - int - *a - string - double - double
(6)組合yaml文件
pets: - cat - dog - pig --- #可以將多個(gè)yml文件寫(xiě)入一個(gè)yml文件中,使用 --- 作為分隔符 vegetables: - potato - carrot - cabbage
四、Docker Compose 常用命令
命令 | 描述 | |
---|---|---|
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ù) | |
-f,--file | 使用特定的 compose 模板文件,默認(rèn)為 docker-compose.yml | |
-p,--project-name | 指定項(xiàng)目名稱,默認(rèn)使用目錄名稱 | |
-d | 在后臺(tái)運(yùn)行 |
五、Docker Compose 配置常用字段
字段 | 含義 |
---|---|
build | 使用Dockerfile構(gòu)建鏡像。指定Dockerfile 文件名,要指定Dockerfile文件需要在build標(biāo)簽的子級(jí)標(biāo)簽中使用dockerfile標(biāo)簽指定 |
dockerfile | 構(gòu)建鏡像上下文路徑(指定Dockerfile文件) |
context | 可以是dockerfile 的路徑,或者是指向git 倉(cāng)庫(kù)的url地址 |
image | 指定鏡像。 |
command | 執(zhí)行命令,覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令(類似于 docker run) |
container_name | 指定容器名稱,由于容器名稱是唯一的, 如果指定自定義名稱,則無(wú)法scale指定容器數(shù)量(同一個(gè)鏡像指定多個(gè)容器數(shù)量) |
deploy | 指定部署和運(yùn)行服務(wù)相關(guān)的配置,只能在Swarm模式使用 |
environment | 添加環(huán)境變量 |
networks | 加入網(wǎng)絡(luò),引用頂級(jí)networks下條目 |
networks_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ù)別名] (類似于容器互聯(lián)) |
privileged | 用來(lái)給予容器root權(quán)限,注意是不安全的,只有兩個(gè)值:true或false |
restart | 設(shè)置重啟策略,never,always, no-failure, unless-stopped never——默認(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 | 此標(biāo)簽用于解決容器的依賴、啟動(dòng)先后問(wèn)題 |
六、Docker-compose搭建LNMP實(shí)戰(zhàn)
整體文件結(jié)構(gòu)
1.準(zhǔn)備依賴文件,配置nginx
#創(chuàng)建nginx工作目錄,上傳nginx-1.12.0的軟件包 mkdir /opt/compose_lnmp/nginx/ [root@localhost1 ~]#ls /opt/compose_lnmp/nginx/ Dockerfile nginx-1.12.0.tar.gz nginx.conf #編寫(xiě)nginx的Dockerfile vim Dockerfile FROM centos:7 MAINTAINER this is nginx image <chips> RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin nginx ADD nginx-1.12.0.tar.gz /usr/local/src/ WORKDIR /usr/local/src/nginx-1.12.0 RUN ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module && make -j2 && make install ENV PATH /usr/local/nginx/sbin:$PATH ADD nginx.conf /usr/local/nginx/conf/ RUN chmod 777 -R /usr/local/nginx/html/ EXPOSE 80 EXPOSE 443 ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ] #修改nginx配置文件(只做了基礎(chǔ)配置,后續(xù)可以修改) #修改45行,添加php項(xiàng) location / { root html; index index.html index.php; } #66~71行取消注釋,修改 location ~ \.php$ { 66 root html; 67 fastcgi_pass 172.18.0.30:9000; 68 fastcgi_index index.php; 69 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_sc ript_name; 70 include fastcgi_params; 71 }
2.準(zhǔn)備依賴文件,配置mysql
#創(chuàng)建mysql工作目錄,上傳mysql-boost-5.7.20的軟件包 mkdir /opt/compose_lnmp/mysql/ [root@localhost1 mysql]#ls Dockerfile my.cnf mysql-boost-5.7.20.tar.gz #編寫(xiě)Dockerfile vim Dockerfile FROM centos:7 MAINTAINER this is mysql image <chips> RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make ADD mysql-boost-5.7.20.tar.gz /usr/local/src/ WORKDIR /usr/local/src/mysql-5.7.20/ RUN cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 && make -j2 && make install ADD my.cnf /etc/ ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH RUN useradd -M -s /sbin/nologin mysql && chown mysql:mysql /etc/my.cnf && chown -R mysql:mysql /usr/local/mysql/ && /usr/local/mysql/bin/mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ EXPOSE 3306 CMD ["/usr/local/mysql/bin/mysqld"] #修改my.cnf [client] port = 3306 socket=/usr/local/mysql/mysql.sock [mysql] port = 3306 socket = /usr/local/mysql/mysql.sock auto-rehash [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
3.準(zhǔn)備依賴文件,配置php
#創(chuàng)建php工作目錄,上傳php-7.1.10的軟件包 mkdir /opt/compose_lnmp/php/ [root@localhost1 php]#ls Dockerfile php-7.1.10.tar.bz2 php-fpm.conf php.ini www.conf #編寫(xiě)Dockerfile FROM centos:7 MAINTAINER this is php image <chips> RUN yum -y install gd \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel \ gcc gcc-c++ make pcre-devel && useradd -M -s /sbin/nologin nginx ADD php-7.1.10.tar.bz2 /usr/local/src/ WORKDIR /usr/local/src/php-7.1.10 RUN ./configure \ --prefix=/usr/local/php \ --with-mysql-sock=/usr/local/mysql/mysql.sock \ --with-mysqli \ --with-zlib \ --with-curl \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-openssl \ --enable-fpm \ --enable-mbstring \ --enable-xml \ --enable-session \ --enable-ftp \ --enable-pdo \ --enable-tokenizer \ --enable-zip && make -j2 && make install ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH ADD php.ini /usr/local/php/lib/ ADD php-fpm.conf /usr/local/php/etc/ ADD www.conf /usr/local/php/etc/php-fpm.d/ EXPOSE 9000 ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ] #修改php.ini文件 #1170行 mysqli.default_socket = /usr/local/mysql/mysql.sock #939行 date.timezone = Asia/Shanghai #修改php-fpm.conf文件 #19行取消注釋 pid = run/php-fpm.pid #修改www.conf文件 #23,24行修改 user = nginx group = nginx #36行修改為監(jiān)聽(tīng)php地址的9000端口 listen = 172.18.0.30:9000 #62行允許的客戶端,添加監(jiān)聽(tīng)地址為nginx的地址 listen.allowed_clients = 127.0.0.1,172.18.0.10
4.編寫(xiě)docker-compose.yml文件
#docker-compose.yml放在服務(wù)同級(jí)目錄 [root@localhost1 compose_lnmp]#ls docker-compose.yml mysql nginx php wwwroot #編寫(xiě) vim docker-compose.yml #定義docker-compose版本,可以是2 或 3 version: '3' #使用services定義服務(wù) services: #第一個(gè)service nginx: #設(shè)置容器名 container_name: nginx #使用dockerfile來(lái)構(gòu)建鏡像 build: #指定Dockerfile文件所在位置 context: ./nginx #指定文件名 dockerfile: Dockerfile #映射端口 ports: - 80:80 - 443:443 #設(shè)置數(shù)據(jù)卷掛載 volumes: - ./wwwroot:/usr/local/nginx/html #加入網(wǎng)絡(luò) networks: lnmp: ipv4_address: 172.18.0.10 mysql: container_name: mysql build: context: ./mysql dockerfile: Dockerfile ports: - 3306:3306 networks: lnmp: ipv4_address: 172.18.0.20 volumes: - db-data:/usr/local/mysql privileged: true php: container_name: php build: context: ./php dockerfile: Dockerfile ports: - 9000:9000 networks: lnmp: ipv4_address: 172.18.0.30 volumes: - db-data:/usr/local/mysql - ./wwwroot:/usr/local/nginx/html #指定依賴,php需要最后啟動(dòng) depends_on: - nginx - mysql #設(shè)置網(wǎng)絡(luò)為自定義網(wǎng)絡(luò) networks: lnmp: driver: bridge ipam: config: - subnet: 172.18.0.0/16 volumes: db-data:
5.準(zhǔn)備測(cè)試項(xiàng)目WordPress
6.docker-compose構(gòu)建項(xiàng)目(等待約30min)
查看狀態(tài)(全up則成功)
7.授權(quán)數(shù)據(jù)庫(kù),訪問(wèn)192.168.116.10/wordpress/index.php/
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于ROS2安裝與docker環(huán)境使用
大家好,本篇文章主要講的是關(guān)于ROS2安裝與docker環(huán)境使用,感興趣的同學(xué)趕快來(lái)看看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Docker本地鏡像發(fā)布到阿里云的實(shí)現(xiàn)
本文主要介紹了Docker本地鏡像發(fā)布到阿里云的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像
這篇文章主要介紹了Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Docker容器間通訊直接路由方式實(shí)現(xiàn)網(wǎng)絡(luò)通訊
今天小編就為大家分享一篇關(guān)于Docker容器間通訊直接路由方式實(shí)現(xiàn)網(wǎng)絡(luò)通訊,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Docker命令行入門(mén)大全(這18條,你不得不知)
Docker有成千上百萬(wàn)的命令行。因此Docker文檔內(nèi)容十分豐富,同時(shí)又讓剛?cè)腴T(mén)的新手感到不知所措。在本文中,我將重點(diǎn)介紹運(yùn)行Docker的關(guān)鍵命令。2019-09-09關(guān)于Dockerfile鏡像制作完整實(shí)例
本文詳細(xì)介紹了如何使用Docker制作鏡像,并通過(guò)實(shí)際應(yīng)用發(fā)版展示了制作過(guò)程,主要內(nèi)容包括創(chuàng)建和啟動(dòng)Docker容器的腳本(init.sh、start.sh、stop.sh、restart.sh),以及配置目錄,文章還討論了Docker容器IP地址的作用,并總結(jié)了制作新鏡像的基本步驟2024-11-11