Docker-compose詳解和LNMP搭建全過程
一、Docker-compose簡介
1.前言
我們知道使用一個Dockerfile模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術(shù)方案,如Docker 官方產(chǎn)品Docker Compose。
Dockerfile可以讓用戶管理一個單獨的應用容器;而Compose則允許用戶在一個模板(YAML格式)中定義一組相關(guān)聯(lián)的應用容器(被稱為一個project,即項目),例如一個Web服務容器再加上后端的數(shù)據(jù)庫服務容器等。
2.概述
- Docker-Compose項目是Docker官方的開源項目,負責實現(xiàn)對Docker容器集群的快速編排。
- Docker-Compose將所管理的容器分為三層,分別是工程(project),服務(service) 以及容器(container)。
- Docker-Compose運行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個工程,若無特殊指定工程名即為當前目錄名。
一個工程當中可包含多個服務,每個服務中定義了容器運行的鏡像、參數(shù)、依賴。
一個服務當中可包括多個容器實例,Docker-Compose并沒有解決負載均衡的問題,因此需要借助其它工具實現(xiàn)服務 發(fā)現(xiàn)及負載均衡,比如Consul。
- project:代表多個service組成的項目,默認是用工作目錄的名稱作為project的工程名稱。
- service:一個 service 可以包含一個或多個容器,在里面可以定義網(wǎng)絡模式端口鏡像數(shù)據(jù)卷等參數(shù)。
- container:可以直接由一個已存在的鏡像運行實現(xiàn),也可以通過dockerfile構(gòu)建鏡像實現(xiàn)。
Docker-Compose的工程配置文件默認為docker-compose. yml,可通過環(huán)境變量COMPOSE_FILE 或 -f 參數(shù)自定義配置文件,其定義了多個有依賴關(guān)系的服務及每個服務運行的容器。
使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。在工作中,經(jīng)常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現(xiàn)一個Web項目,除了Web服務容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務容器,甚至還包括負載均衡容器等。
Compose允許用戶通過一個單獨的docker-compose. yml模板文件(YAML格式)來定義一組相關(guān)聯(lián)的應用容器為一個項目 (project) 。
Docker-Compose項目由Python編寫,調(diào)用Docker服 務提供的API來對容器進行管理。因此,只要所操作的平臺支持Docker API,就可以在其上利用Compose來進行編排管理。
二、Docker-compose安裝
注意:Docker Compose是 Docker 的獨立產(chǎn)品,因此需要安裝 Docker 之后再單獨安裝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文件格式及編寫注意事項
1.簡介
YAML 是一種標記語言,它可以很直觀的展示數(shù)據(jù)序列化格式,可讀性高。類似于 json 數(shù)據(jù)描述語言,語法比 json 簡單的很多。
YAML 數(shù)據(jù)結(jié)構(gòu)通過縮進來表示,連續(xù)的項目通過減號來表示,鍵值對用冒號分隔,數(shù)組用中括號 [ ] 括起來, hash用花括號 { } 括起來。
使用 YAML 時需要注意下面事項
- 大小寫敏感;
- 通過縮進表示層級關(guān)系,不支持制表符 tab 鍵縮進,只能使用空格縮進;
- 縮進的空格數(shù)目不重要,只要相同層級左對齊,通常開頭縮進2個空格;
- 用 # 號注釋;
- 符號字符后縮進1個空格,如冒號":" 、逗號 "," 、橫杠"-";
- 如果包含特殊字符用單引號' '引起來,會作為普通字符串處理;雙引號" "引用起來,特殊字符作為本身想表示的意思。
2.使用方法
(1)數(shù)據(jù)結(jié)構(gòu)
animals: pets #對象映射: 鍵值對的字典
(2)序列數(shù)組
pets: #對象映射: - cat - 序列值 - dog - pig pets: ["cat", "dog", "pig"] #另一種表達格式
示例
#序列的映射,是指針對一個對象,序列中的值都屬于該對象,如蔬菜包含包菜、胡蘿卜、土豆等。 vegetables: - potato - carrot - cabbage #映射的映射,是指針對一個對象有多個子對象,分別有他們的值,如系統(tǒng)狀態(tài)包含cpu、內(nèi)存、網(wǎng)絡、磁盤等。 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ān)系來表示的
(3)布爾值
debug: true #真true,假false,不能用引號引用 debug: false
(4)文本塊
value: | # | 代表保留輸出文本的換行和回車符,不加的話即使文本換行也會在同一行顯示 hello #這種情況就是輸出 hello ,不加 | 就是 helloworld! world! world! | - #不保留文本塊末尾的換行 | + #會保留文本塊末尾的換行 value: > hello #將 > 后的字符串和之后的字符串用空格分開,即 hello world! world!
(5)打錨點和引用
type: &a string #&是打錨點,后面跟的是錨點名稱,&a 代表的就是 string type: *a #*a 代表引用錨點,此處輸出結(jié)果就是 type: string types: #此處就是輸出 types: - int - int - *a - string - double - double
(6)組合yaml文件
pets: - cat - dog - pig --- #可以將多個yml文件寫入一個yml文件中,使用 --- 作為分隔符 vegetables: - potato - carrot - cabbage
四、Docker Compose 常用命令
命令 | 描述 | |
---|---|---|
docker-compose | build | 重新構(gòu)建服務 |
ps | 列出容器 | |
up | 創(chuàng)建和啟動容器 | |
exec | 在容器里面執(zhí)行命令 | |
scale | 指定一個服務容器啟動數(shù)量 | |
top | 顯示容器進程 | |
logs | 查看容器輸出 | |
down | 刪除容器、網(wǎng)絡、數(shù)據(jù)卷和鏡像 | |
stop/start/restart | 停止/啟動/重啟服務 | |
-f,--file | 使用特定的 compose 模板文件,默認為 docker-compose.yml | |
-p,--project-name | 指定項目名稱,默認使用目錄名稱 | |
-d | 在后臺運行 |
五、Docker Compose 配置常用字段
字段 | 含義 |
---|---|
build | 使用Dockerfile構(gòu)建鏡像。指定Dockerfile 文件名,要指定Dockerfile文件需要在build標簽的子級標簽中使用dockerfile標簽指定 |
dockerfile | 構(gòu)建鏡像上下文路徑(指定Dockerfile文件) |
context | 可以是dockerfile 的路徑,或者是指向git 倉庫的url地址 |
image | 指定鏡像。 |
command | 執(zhí)行命令,覆蓋容器啟動后默認執(zhí)行的命令(類似于 docker run) |
container_name | 指定容器名稱,由于容器名稱是唯一的, 如果指定自定義名稱,則無法scale指定容器數(shù)量(同一個鏡像指定多個容器數(shù)量) |
deploy | 指定部署和運行服務相關(guān)的配置,只能在Swarm模式使用 |
environment | 添加環(huán)境變量 |
networks | 加入網(wǎng)絡,引用頂級networks下條目 |
networks_mode | 設(shè)置容器的網(wǎng)絡模式,如 host,bridge |
ports | 暴露容器端口,與-p相同,但端口不能小于60 |
volumes | 掛載一個宿主機目錄或命令卷到容器中,命令卷要在頂級volumes定義卷名稱 |
volumes_from | 從另一個服務或容器掛載卷,可選參數(shù):ro 和:rw。僅版本'2' 支持 |
hostname | 容器主機名 |
sysctls | 在容器內(nèi)設(shè)置內(nèi)核參數(shù) |
links | 連接到另外一個容器,- 服務名稱[:服務別名] (類似于容器互聯(lián)) |
privileged | 用來給予容器root權(quán)限,注意是不安全的,只有兩個值:true或false |
restart | 設(shè)置重啟策略,never,always, no-failure, unless-stopped never——默認策略,在容器退出時不重啟容器 on-failure——在容器非正常退出時(退出狀態(tài)非0),才會重啟容器 on-failure:3——在容器非正常退出時重啟容器,最多重啟3次 always——在容器退出時總是重啟容器 unless-stopped——在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經(jīng)停止了的容器 |
depends_on | 此標簽用于解決容器的依賴、啟動先后問題 |
六、Docker-compose搭建LNMP實戰(zhàn)
整體文件結(jié)構(gòu)
1.準備依賴文件,配置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 #編寫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項 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.準備依賴文件,配置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 #編寫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.準備依賴文件,配置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 #編寫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)聽php地址的9000端口 listen = 172.18.0.30:9000 #62行允許的客戶端,添加監(jiān)聽地址為nginx的地址 listen.allowed_clients = 127.0.0.1,172.18.0.10
4.編寫docker-compose.yml文件
#docker-compose.yml放在服務同級目錄 [root@localhost1 compose_lnmp]#ls docker-compose.yml mysql nginx php wwwroot #編寫 vim docker-compose.yml #定義docker-compose版本,可以是2 或 3 version: '3' #使用services定義服務 services: #第一個service nginx: #設(shè)置容器名 container_name: nginx #使用dockerfile來構(gòu)建鏡像 build: #指定Dockerfile文件所在位置 context: ./nginx #指定文件名 dockerfile: Dockerfile #映射端口 ports: - 80:80 - 443:443 #設(shè)置數(shù)據(jù)卷掛載 volumes: - ./wwwroot:/usr/local/nginx/html #加入網(wǎng)絡 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需要最后啟動 depends_on: - nginx - mysql #設(shè)置網(wǎng)絡為自定義網(wǎng)絡 networks: lnmp: driver: bridge ipam: config: - subnet: 172.18.0.0/16 volumes: db-data:
5.準備測試項目WordPress
6.docker-compose構(gòu)建項目(等待約30min)
查看狀態(tài)(全up則成功)
7.授權(quán)數(shù)據(jù)庫,訪問192.168.116.10/wordpress/index.php/
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于ROS2安裝與docker環(huán)境使用
大家好,本篇文章主要講的是關(guān)于ROS2安裝與docker環(huán)境使用,感興趣的同學趕快來看看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像
這篇文章主要介紹了Dockerfile如何使用alpine系統(tǒng)制作haproxy鏡像問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05Docker容器間通訊直接路由方式實現(xiàn)網(wǎng)絡通訊
今天小編就為大家分享一篇關(guān)于Docker容器間通訊直接路由方式實現(xiàn)網(wǎng)絡通訊,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02