使用Docker Compose 搭建lnmp
文章目錄
- 一: Docker-compose 簡介
- 1.1 為什么使用 Docker-compose
- 1.2 Docker-compose概述
- 二: compose 的部署
- 2.1 Docker Compose 環境安裝
- 2. 2YAML 文件格式及編寫注意事項
- 2.2.1 YAML 文件格式
- 2.2.2 YAML格式的注意事項
- 2.2.3 數據結構
- 2.3 Docker Compose 配置常用字段
- 2.4 Docker compose 常用命令
- 三: 編寫Docker Compose
- 3.1 準備依賴文件,配置nginx
- 3.2 配置mysql
- 3.3 配置php
- 3.4 編寫docker-compose.yml
對docker容器集群的快速編排 Docker-compose
一: Docker-compose 簡介
1.1 為什么使用 Docker-compose
我們知道使用一個Dockerfile模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術方案,今天給大家介紹Docker官方產品Docker Compose 。
Dockerfile可以讓用戶管理一個單獨的應用容器;而Compose則允許用戶在一個模板(YAML格式)中定義一組相關聯的應用容器(被稱為一個project, 即項目) ,例如一個web服務容器再加上后端的數據庫服務容器等。
1.2 Docker-compose概述
Docker-Compose項目是Docker官方的開源項目**,負責實現對Docker容器集群的快速編排**。但是,只能在單機上面實現.
Docker-Compose將所管理的容器分為三層,分別是工程(project) ,服務(service)以及容器(container) 。Docker-Compose運行目錄下的所有文件(docker-compose. yml, extends文件或環境變量文件等)組成一個工程,若無特殊指定工程名即為當前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器運行的鏡像、參數、依賴。一個服務當中可包括多個容器實例, Docker-Compose并沒有解決負載均衡的問題,因此需要借助其它工具實現服務發現及負載均衡,比如Consul
Docker-Compose的工程配置文件默認為docker-compose .yml,可通過環境變量COMPOSE FILE或-1參數自定義配置文件,其定義了多個有依賴關系的服務及每個服務運行的容器。
使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個Web項目,除了web服務容器本身,往往還需要再加上后端的數據庫服務容器,甚至還包括負載均衡容器等。Compose允許用戶通過一個單獨的docker-compose. ym1模板文件(YAMI格式)來定義一組相關聯的應用容器為一個項目(project) 。Docker-Compose項目由Python編寫,調用Docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支持Docker API,就可以在其上利用Compose來進行編排管理。
二: compose 的部署
2.1 Docker Compose 環境安裝
Docker Compose 是Docker 的獨立產品,因此需要安裝Docker 之后在單獨安裝Docker Compose
#下載 [root@host103 ~]# curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose#也可直接將docker compose 上傳 [root@host103 opt]# ls docker-compose docker-compose #修改權限,給與執行權限 [root@host103 opt]# chmod +x docker-compose [root@host103 opt]# ll docker-compose -rwxr-xr-x 1 root root 10867152 10月 15 14:10 docker-compose#將docker-compose 移動到/usr/local/bin root@host103 opt]# mv docker-compose /usr/local/bin/ [root@host103 opt]# docker-compose --version docker-compose version 1.21.1, build 5a3f1a32. 2YAML 文件格式及編寫注意事項
2.2.1 YAML 文件格式
YAML 是一種標記性語言,他可以很直觀的展示數據序列格式,可讀性高。類似于XML數據描述語言,語法比XML簡單的很多。
- YAML 數據結構通過縮進來表示
- 連續的項目通過減號來表示(列表)
- 鍵值對用冒號分隔
- 數組用中括號[ ] 括起來
- hash 用花括號{ } 括起來
2.2.2 YAML格式的注意事項
- 大小敏感
- 通過縮進表示層級關系
- 不支持制表符tab 鍵縮進,只能使用空格縮進
- 縮進的空格數目不重要,只要相同層級左對齊,通常開頭縮進2 個空格
- 用 # 號注釋
- 符號字符后縮進 1 個空格,如 “冒號 :” “逗號 ,” " 短橫杠 -"
- 如果包含特殊字符,用單引號( ‘’) 引起來會作為普通字符串處理,雙引號("") : 特殊字符作為本身想表示的意思
name:空格 “Him,\nTom”
2.2.3 數據結構
對象: 鍵值對的字典 animal: pets數組: 一組按次序排列的列表 - cat - dog - goldfish布爾值 debug: "true" debug: "false"#Yaml示例 languages: - Java- Golang- Python websites: Baidu: www.baidu.comWangyi: www.163.comSouhu: www.souhu.com#或者 languages: ["Java","Golong","Python"] websites: Baidu: www.baidu.comWangyi: www.163.comSouhu: 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文件名(要指定的Dockerfile文件需要在build標簽的子級標簽中用dockerfile標簽指定) |
| dockerfile | 構建鏡像上下文路徑 |
| context | 可以是dockerfile路徑,或者是執行git 倉庫的url地址 |
| image | 指定鏡像(已存在) |
| command | 執行命令,會覆蓋容器啟動后默認執行的命令(會覆蓋Dockerfile的CMD指令) |
| container_name | 指定容器名稱,由于容器名稱是唯一的,如果指定自定義名稱,則無法scale |
| deploy | 指定部署和運行服務相關配置,只能在Swarm模式使用 |
| enviroment | 添加環境變量 |
| networks | 加入網絡,引用頂級networks下條目 |
| ports | 暴露容器端口,與-p 相同,但是端口不能低于60 |
| volumes | 掛載一個宿主機目錄或命令卷到容器,命名卷要在頂級volumes 定義卷名稱 |
| volumes_from | 從另一個服務或容器掛載卷,可選參數 :ro 和 :rw |
| hostname | 容器主機名 |
| sysctls | 在容器內設置內核參數 |
| links | 連接到另一個容器,- 服務名稱[ : ] |
| restart | 重啟策略,定義是否重啟容器; no(默認,不重啟), always(總是重啟), on-failure,(退出狀態非0時重啟), on-failure:3 ,在容器非正常退出時重啟容器,最多重啟3次, unless-stoped 在容器退出時總是重啟容器,但是不考慮在Docker 守護進程啟動時就已經停止了的容器 |
| depends_on | 此標簽用于解決容器的依賴,啟動先后問題。如啟動應用容器,需要先啟動數據庫容器 php: depends_on: - apache - mysql |
2.4 Docker compose 常用命令
| build | 重新構建服務 |
| ps | 列出容器 |
| up | 創建和啟動容器 |
| exec | 在容器里面執行命令 |
| scale | 指定一個服務容器啟動數量 |
| top | 顯示正在運行的容器進程 |
| logs | 查看服務容器的輸出 |
| down | 刪除容器、網絡、數據卷和鏡像 |
| stop/start/restart | 停止/啟動/重啟服務 |
三: 編寫Docker Compose
[root@host103 compose_nginx]# yum -y install tree[root@host103 compose_nginx]# tree /opt/compose_nginx/ -L 2 /opt/compose_nginx/ ├── docker-compose.yml ├── mysql │ ├── Dockerfile │ ├── 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├── wordpress└── wordpress-4.9.4-zh_CN.tar.gz3.1 準備依賴文件,配置nginx
#創建項目目錄 compose_nginx; #創建服務子目錄 [root@host103 ~]# mkdir /opt/compose_nginx/ [root@host103 ~]#cd /opt/compose_nginx [root@host103 compose_nginx]# mkdir nginx mysql php wwwroot#上傳wordpress軟件包 [root@host103 nginx]# cd /opt/compose_nginx/wwwroot/ [root@host103 wwwroot]# ls wordpress-4.9.4-zh_CN.tar.gz wordpress-4.9.4-zh_CN.tar.gz [root@host103 wwwroot]# tar xf wordpress-4.9.4-zh_CN.tar.gz [root@host103 nginx]# tar xf wordpress-4.9.4-zh_CN.tar.gz #上傳nginx軟件包 [root@host103 compose_nginx]# cd nginx/ [root@host103 nginx]# ls nginx-1.12.0.tar.gz nginx-1.12.0.tar.gz #編寫nginx的Dockerfile文件 [root@host103 nginx]# vim Dockerfile FROM centos:7 MAINTAINER this is nginx image <zhi> RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make RUN 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 -j8&& make install ENV PATH /usr/local/nginx/sbin:$PATH 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.confEXPOSE 80 EXPOSE 443 ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]3.2 配置mysql
#進入mysql子目錄 [root@host103 ~]# cd /opt/compose_nginx/mysql/ #將mysql包上傳到此目錄 [root@host103 mysql]# ls mysql-boost-5.7.20.tar.gz mysql-boost-5.7.20.tar.gz#編寫mysql的Dockerfile文件 [root@host103 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(用來復制到容器) [root@host103 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 = 1sql_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_QUOTES3.3 配置php
[root@host103 php]# cd /opt/compose_nginx/php/ #將php包上傳 [root@host103 php]# ls php-7.1.10.tar.bz2 php-7.1.10.tar.bz2#編寫php的dockerfile [root@host103 php]# vim Dockerfile FROM centos:7 MAINTAINER this is php image <zhi> 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:$PATHRUN \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.iniRUN \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.confRUN \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.confEXPOSE 9000 ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]3.4 編寫docker-compose.yml
#先拉取鏡像centos:7 [root@host103 compose_nginx]# docker pull cetos:7[root@host103 ~]# vim /opt/compose_nginx/docker-compose.yml #使用版本2(3版本不支持指令volumes_from) version: '2' services:#配置nginx服務nginx:#設置主機名為nginxhostname: nginx#使用dockerfile創建鏡像。Dockerfile文件在當前目錄的nginx目錄下,文件名為Dockerfilebuild:context: ./nginxdockerfile: Dockerfile#容器名為nginxcontainer_name: nginx#暴露端口80和443ports:- 80:80- 443:443#加入到lnmp網絡中,使用ip172.18.0.0.10networks:lnmp:ipv4_address: 172.18.0.10#將當前目錄的wwwroot目錄掛載到容器的/usr/local/nginx/htmlvolumes:- ./wwwroot/:/usr/local/nginx/html#配置服務mysqlmysql:hostname: mysqlbuild:context: ./mysqldockerfile: Dockerfilecontainer_name: mysqlports:- 3306:3306networks:lnmp:ipv4_address: 172.18.0.20#設置/usr/local/mysql為數據卷volumes:- /usr/local/mysql#配置服務php php:hostname: phpbuild:context: ./phpdockerfile: Dockerfilecontainer_name: phpports:- 9000:9000networks:lnmp:ipv4_address: 172.18.0.30#從nginx容器和mysql容器獲取數據卷 volumes_from:- nginx- mysql#php容器需要在nginx和mysql之后啟動 depends_on:- nginx- mysql#php和容器nginx,容器mysql連接 links:- nginx- mysql #配置網絡模式和網絡名 networks:#設置網絡名lnmplnmp:#網絡模式為bridge橋接莫斯driver: bridgeipam:config:#使用的網段為172.18.0.0/16- subnet: 172.18.0.0/16#在工作目錄使用此命令。 #-f: --file-name, 指定模板文件。默認為docker-compose.yml #-p: --project-name NAME ,指定項目名稱,默認使用目錄名 #-d: 在后臺運行 [root@host103 compose_nginx]# docker-compose -f docker-compose.yml up -d #在工作目錄,使用docker-compose ps 可以看到啟動的容器狀態 [root@host103 compose_nginx]# docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------- mysql /bin/sh -c /usr/local/mysq ... Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp nginx /usr/local/nginx/sbin/ngin ... Up 0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp php /usr/local/php/sbin/php-fpm -F Up 0.0.0.0:9000->9000/tcp,:::9000->9000/tcp #進入mysql容器,配置用戶授權. [root@host103 mysql]# docker exec -it mysql /bin/bash [root@mysql mysql]# mysqlmysql> create database wordpress; Query OK, 1 row affected (0.00 sec)mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123'; Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)#訪問網站 [root@host103 compose_nginx]# firefox http://192.168.23.103/wordpress/index.php 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的使用Docker Compose 搭建lnmp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用docker部署lnmp
- 下一篇: docker 私有仓库与Harbor