使用 Docker-compose 搭建lnmp的詳細過程
服務編排:
應用編排:
- 單機環(huán)境下:shell/python腳本
- 多機/集群環(huán)境下:ansible、saltstack、pubbet
docker容器編排:
- 單機:docker-compose
- 多機/集群:docker swarm,mesos+ marathon,kubernetes
一、Docker-Compose簡介
1.1 為什么使用 Docker-compose
我們知道使用一個Dockerfile模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術(shù)方案,今天給大家介紹Docker 官方產(chǎn)品Docker Compose。
Dockerfile可以讓用戶管理一個單獨的應用容器;而Compose則 允許用戶在一個模板(YAML格式) 中定義一組相關(guān)聯(lián)的應用容器( 被稱為一個project,即項目),例如一個Web服務容器再加上后端的數(shù)據(jù)庫服務容器等。
1.2 Docker-compose概述
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。
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來進行編排管理。
二、compose 部署
2.1 Docker Compose 環(huán)境安裝
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)中。 cd /opt/ ls chmod +x docker-compose mv docker-compose /usr/local/bin/ docker-compose --version
2.2 YAML文件格式及編寫注意事項
2.2.1 YAML文件格式
YAML是一種標記語言,它可以很直觀的展示數(shù)據(jù)序列化格式,可讀性高。類似于 json 數(shù)據(jù)描述語言,語法比 json簡單的很多。
- YAML數(shù)據(jù)結(jié)構(gòu)通過縮進來表示
- 連續(xù)的項目通過減號來表示
- 鍵值對用冒號分隔
- 數(shù)組用中括號 [ ] 括起來
- hash 用花括號 { } 括起來
#一個鍵如果有多個值。符號可以不縮進,但值要縮進。 name: - zhangsan - lisi - wangwu ? name: - zhangsan - lisi - wangwu name: ["zhangsan", "lisi", "wangwu"]
2.2.2 使用YAML時需要注意下面事項
- 大小寫敏感
- 通過縮進表示層級關(guān)系
- 不支持制表符tab鍵縮進T只能使用空格縮進
- 縮進的空格數(shù)目不重要,只要相同層級左對齊,通常開頭縮進2個空格
- 用 # 號注釋
- 符號字符后縮進1個空格,如"冒號 : "、 "逗號 ,"、"橫杠 - "
- 如果包含特殊字符用單引號(' ')引起來會作為普通字符串處理,雙引號(" "):特殊字符作為本身想表示的意思
#雙引號示例: name: "hello, \nworld" 最后name值是兩行內(nèi)容 name: hello, world ? #單引號示例: name: 'hello, \nworld',只會作為普通字符 name: hello,\nworld
2.2.3 數(shù)據(jù)結(jié)構(gòu)
#對象: 鍵值對的字典 animal: pets ? #數(shù)組: 一組按次序排列的列表 - cat - dog - goldfish ? #布爾值 debug: "true" debug: "false" ? ? #Yaml示例 languages: #序列的映射 - Java - Golang - Python websites: #映射的映射(鍵的值,仍然是鍵值對) Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #或者 languages: ["Java","Golong","Python"] websites: Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #Json格式 { languages: [ 'Java', 'Golong', 'Python', ], websites: [ Baidu: 'www.baidu.com', Wangyi: 'www.163.com', Souhu: 'www.souhu.com', ] }
2.3 Docker Compose 配置常用字段
字段 | 描述 |
---|---|
build | 使用Dockerfile構(gòu)建鏡像。指定Dockerfile 文件名,要指定Dockerfile文件需要在bui ld標簽的子級標簽中使用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 | 設置容器的網(wǎng)絡模式,如 host,bridge |
ports | 暴露容器端口,與-p相同,但端口不能低于60 |
volumes | 掛載一個宿主機目錄或命令卷到容器中,命令卷要在頂級volumes定義卷名稱 |
volumes_from | 從另一個服務或容器掛載卷,可選參數(shù):ro 和:rw。僅版本'2' 支持 |
hostname | 容器主機名 |
sysctls | 在容器內(nèi)設置內(nèi)核參數(shù) |
links | 連接到另外一個容器,- 服務名稱[:服務別名] (類似于容器互聯(lián)) |
privileged | 用來給容器root權(quán)限,注意是不安全的,只有兩個值:true或false |
restart | 設置重啟策略,never,always, no-failure, unless-stopped |
never,默認策略,在容器退出時不重啟容器。 | |
on-failure,在容器非正常退出時(退出狀態(tài)非0),才會重啟容器。 | |
on-failure:3,在容器非正常退出時重啟容器,最多重啟3次。 | |
always,在容器退出時總是重啟容器。 | |
unless-stopped,在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經(jīng)停止了的容器。 | |
depends_on | 在使用Compose時,最大的好處就是少打啟動命令,但一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,可能會因為容器依賴問題而啟動失敗。例如在沒啟動數(shù)據(jù)庫容器的時候啟動應用容器,應用容器會因為找不到數(shù)據(jù)庫而退出。depends_on標簽用于解決容器的依賴、啟動先后的問題。 |
(1)depends_on 指定依賴關(guān)系和啟動順序
php: depends_on: - apache - mysql
(2)使用鏡像
- 如果想使用已存在的鏡像,使用image。
- 如果想使用自己構(gòu)建的鏡像,使用build、dockerfile、context。
(3)引用網(wǎng)絡
在頂級層設置兩個網(wǎng)絡模式,在服務中引用不同的網(wǎng)絡,可以實現(xiàn)網(wǎng)絡的隔離,和網(wǎng)絡的兼容。(可以理解為vlan)
networks: lnmp lamp service: nginx: networks:lnmp apache: networks:lamp mysql: networks: lnmp lamp php: networks: lnmp lamp
(4)命令卷
在 version 3
,可以在頂級層中定義一個命令卷(例如:db-data),db-data 作為一個中間件,實際并不存在,只是為了做數(shù)據(jù)同步。(可以理解為vlan)
version: "3" ? services: ? nginx: volumes: - db_data:/var/lib/db mysql: volumes: - db_data:/var/lib/backup/data ? volumes: #在頂級層定義一個命令卷 db_data:
2.4 Docker Compose 常用命令
命令 | 描述 |
---|---|
build | 重新構(gòu)建服務 |
ps | 列出容器 |
up | 創(chuàng)建和啟動容器 |
exec | 在容器里面執(zhí)行命令 |
scale | 指定一個服務容器啟動數(shù)量 |
top | 顯示容器進程 |
logs | 查看容器輸出 |
down | 刪除容器、網(wǎng)絡、數(shù)據(jù)卷和鏡像 |
stop/start/restart | 停止/啟動/重啟服務 |
三、使用Docker-compose 搭建lnmp
3.1 Docker Compose 文件結(jié)構(gòu)
[root@zy7 compose_lnmp]# yum -y install tree ? [root@zy7 compose_lnmp]# tree /opt/compose_lnmp/ -L 2 /opt/compose_lnmp/ ├── docker-compose.yml ├── mysql #創(chuàng)建模板腳本 │ ├── Dockerfile #創(chuàng)建容器腳本 │ ├── my.cnf #復制配置文件 │ └── mysql-boost-5.7.20.tar.gz #復制源碼包 ├── nginx │ ├── Dockerfile │ └── nginx-1.12.0.tar.gz ├── php │ ├── Dockerfile │ └── php-7.1.10.tar.bz2 └── wwwroot ├── index.html #站點網(wǎng)頁 ├── wordpress └── wordpress-4.9.4-zh_CN.tar.gz
3.2 準備依賴文件,配置nginx
#創(chuàng)建項目目錄 compose_lnmp; #創(chuàng)建服務子目錄 [root@zy7 ~]# mkdir /opt/compose_lnmp/ [root@zy7 ~]# cd /opt/compose_lnmp [root@zy7 compose_lnmp]# mkdir nginx mysql php wwwroot ? #上傳wordpress軟件包,準備測試頁面 [root@zy7 compose_lnmp]# cd /opt/compose_nginx/wwwroot/ [root@zy7 wwwroot]# ls wordpress-4.9.4-zh_CN.tar.gz [root@zy7 wwwroot]# tar xf wordpress-4.9.4-zh_CN.tar.gz [root@zy7 wwwroot]# echo "<h1>this is test web</h1>" > /opt/compose_lnmp/wwwroot/index.html ? ? #上傳nginx軟件包 [root@zy7 compose_lnmp]# cd nginx/ [root@zy7 nginx]# ls nginx-1.12.0.tar.gz ? ? #編寫nginx的Dockerfile文件 [root@zy7 nginx]# vim Dockerfile #基于基礎(chǔ)鏡像 FROM centos:7 #用戶信息 MAINTAINER this is nginx image <yuji> #添加環(huán)境包 RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make RUN useradd -M -s /sbin/nologin nginx #上傳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 -j8&& make install ENV PATH /usr/local/nginx/sbin:$PATH #修改nginx配置文件 RUN sed -i 's/#charset koi8-r;/charset utf-8;/' /usr/local/nginx/conf/nginx.conf \ && sed -i '45 s/index index.html index.htm;/index index.html index.php;/' /usr/local/nginx/conf/nginx.conf \ && sed -i '65,71 s/#//' /usr/local/nginx/conf/nginx.conf \ && sed -i 's/fastcgi_pass 127.0.0.1:9000;/fastcgi_pass 172.18.0.30:9000;/' /usr/local/nginx/conf/nginx.conf \ && sed -i 's#/scripts#/usr/local/nginx/html#' /usr/local/nginx/conf/nginx.conf #也可以提前將修改好nginx.conf,放入nginx目錄下,之后使用ADD指令復制到鏡像中。則可避免在鏡像中修改。 #暴露端口 EXPOSE 80 EXPOSE 443 #前臺啟動nginx ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
3.3 配置mysql
#進入mysql子目錄 [root@zy7 ~]# cd /opt/compose_lnmp/mysql/ #將mysql包上傳到此目錄 [root@zy7 mysql]# ls mysql-boost-5.7.20.tar.gz ? #編寫mysql的Dockerfile文件 [root@zy7 mysql]# vim Dockerfile FROM centos:7 MAINTAINER this is mysql image <zhi> RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make RUN useradd -M -s /sbin/nologin mysql 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 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 && make -j8 && make install RUN chown -R mysql:mysql /usr/local/mysql/ ADD my.cnf /etc/ RUN chown mysql:mysql /etc/my.cnf ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH WORKDIR /usr/local/mysql/ RUN bin/mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ EXPOSE 3306 CMD /usr/local/mysql/bin/mysqld
編寫myslq主配置文件my.cnf
#配置myslq主配置文件my.cnf(用來復制到容器) [root@zy7 mysql]# vim my.cnf [client] port = 3306 socket = /usr/local/mysql/mysql.sock ? [mysql] port = 3306 socket = /usr/local/mysql/mysql.sock ? [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 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.4 配置php
[root@zy7 compose_lnmp]# cd /opt/compose_lnmp/php/ #將php包上傳 [root@zy7 php]# ls php-7.1.10.tar.bz2 ? #編寫php的Dockerfile [root@zy7 php]# vim Dockerfile FROM centos:7 MAINTAINER this is php image <yuji> 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 RUN 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 && make install ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH ? RUN \cp /usr/local/src/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini \ && sed -i 's#mysqli.default_socket =#mysqli.default_socket = /usr/local/mysql/mysql.sock#' /usr/local/php/lib/php.ini \ && sed -i '939 s#;date.timezone =#date.timezone = Asia/Shanghai#' /usr/local/php/lib/php.ini ? RUN \cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf \ && sed -i '17 s/^;//' /usr/local/php/etc/php-fpm.conf ? RUN \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \ && sed -i 's#user = nobody#user = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \ && sed -i 's#group = nobody#group = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \ && sed -i 's#listen = 127.0.0.1:9000#listen = 172.18.0.30:9000#' /usr/local/php/etc/php-fpm.d/www.conf ? #也可以提前準備好php.ini、php-fpm.conf、www.conf這三個文件,放入php目錄下,之后使用ADD指令復制到鏡像中 ? EXPOSE 9000 ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
3.5 編寫docker-compose.yml
#先拉取鏡像centos:7 [root@zy7 compose_lnmp]# docker pull centos:7 ? [root@zy7 compose_lnmp]# vim /opt/compose_lnmp/docker-compose.yml #使用版本2(3版本不支持指令volumes_from) version: '2' ? #使用services定義服務 services: #配置nginx服務 nginx: #設置容器名 container_name: nginx #設置主機名為nginx hostname: nginx #使用dockerfile創(chuàng)建鏡像。Dockerfile文件在當前目錄的nginx目錄下,文件名為Dockerfile build: #指定Dockerfile文件所在位置 context: ./nginx dockerfile: Dockerfile #映射端口 ports: - 1315:80 - 1316:443 #加入到lnmp網(wǎng)絡中,使用ip172.18.0.0.10 networks: lnmp: ipv4_address: 172.18.0.10 #將當前目錄下的wwwroot目錄掛載到容器的/usr/local/nginx/html目錄 volumes: - ./wwwroot/:/usr/local/nginx/html #配置服務mysql mysql: container_name: mysql hostname: mysql build: context: ./mysql dockerfile: Dockerfile ports: - 3306:3306 networks: lnmp: ipv4_address: 172.18.0.20 #設置/usr/local/mysql目錄為數(shù)據(jù)卷 volumes: - /usr/local/mysql #配置服務php php: hostname: php build: context: ./php dockerfile: Dockerfile container_name: php ports: - 9000:9000 networks: lnmp: ipv4_address: 172.18.0.30 #從nginx容器和mysql容器獲取數(shù)據(jù)卷 volumes_from: - nginx - mysql #php容器需要在nginx和mysql之后啟動 depends_on: - nginx - mysql #php和容器nginx,容器mysql連接 links: - nginx - mysql #設置網(wǎng)絡為自定義網(wǎng)絡 #配置網(wǎng)絡模式和網(wǎng)絡名 networks: #設置網(wǎng)絡名lnmp lnmp: #網(wǎng)絡模式為bridge橋接模式 driver: bridge ipam: config: #使用的網(wǎng)段為172.18.0.0/16 - subnet: 172.18.0.0/16
運行docker-compose
#在工作目錄使用此命令。 #-f: --file-name, 指定模板文件。默認為docker-compose.yml #-p: --project-name NAME ,指定項目名稱,默認使用目錄名 #-d: 在后臺運行 [root@zy7 compose_lnmp]# docker-compose -f docker-compose.yml up -d ? #在工作目錄,使用 docker-compose ps 可以看到啟動的容器狀態(tài) [root@zy7 compose_lnmp]# docker-compose ps
進入mysql容器,進行用戶授權(quán)
#進入mysql容器,進行用戶授權(quán)。 [root@zy7 mysql]# docker exec -it mysql /bin/bash [root@mysql mysql]# mysql ? mysql> create database wordpress; ? mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123'; ? mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123'; ? mysql> flush privileges;
3.6 瀏覽器訪問測試
http://192.168.126.27:1315/wordpress/index.php #在yaml文件中nginx端口映射為1315
http://192.168.126.27:1315/ #直接訪問,可以看見創(chuàng)建的測試網(wǎng)頁
到此這篇關(guān)于使用 Docker-compose 搭建lnmp的文章就介紹到這了,更多相關(guān)Docker-compose 搭建lnmp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
centos7搭建docker私人倉庫的方法(kubernetes)
這篇文章主要介紹了centos7搭建docker私人倉庫的方法(kubernetes),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03在Docker容器中使用iptables時的最小權(quán)限的開啟方法
這篇文章主要介紹了在Docker容器中使用iptables時的最小權(quán)限的開啟方法的相關(guān)資料,需要的朋友可以參考下2017-01-01Docker?創(chuàng)建centos容器集群并實現(xiàn)遠程登錄功能
這篇文章主要介紹了Docker?創(chuàng)建centos容器集群并實現(xiàn)遠程登錄,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03ssh 直接登錄docker容器的操作方法(不用通過宿主機進入)
這篇文章主要介紹了ssh 直接登錄docker容器的操作方法(不用通過宿主機進入),本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06