Docker Compose編排工具部署lnmp實踐及理論(詳細)

[toc]php

1、理論概述

Docker Compose是一個定義及運行多個Docker容器的工具,它自身咱們能夠簡單的理解爲就是一個二進制文件(命令),是咱們能夠更方便易於管理的構建基於docker的複雜應用html

  • 使用Compose的過程:三步
  1. 使用Dock而file定義單個應用程序的環境,以便在任何地方進行復制。
  2. 在docker-compose.yml中定義組成該應用程序的服務,將單個應用程序組成一個總體,它們各自處在相對隔離的環境中,卻能夠經過端口映射來進行協同工做。
  3. 運行docker-compose開始撰寫後並運行整個應用程序

編排

指揮的角色地位,根據被部署的對象之間的耦合關係,以及被部署對象的環境依賴,制定部署流程中各個動做的執行順序和獲取防止;這些信息都會在編排工具中以指定的格式在配置文件中定義,保證這個流程能夠隨時在全新環境可靠有序重現mysql

部署

具體實施的角色地位,按照編排指定的內容和流程,在目標容器執行,一切都是按照編排中制定好的來進行具體實施。linux

Compose原理

簡單概述下:如用戶執行docker-compose up指令表示運行在docker-compose.yml中定義好的各項任務,進行構建鏡像或者運行容器,等一些列操做。
那麼若是在當前宿主機中已經存在了與該應用對應的容器(即重複了),docker-compose會進行邏輯判斷,若是用戶指定了能夠從新啓動已有服務,其就會執行service模塊的容器重啓方法
不然將直接啓動已有的容器。二者區別在於前者是重啓,會建立新容器,就容器會移除掉。
該過程當中建立容器的各項定義參數都是compose指令和.yml文件中指定好的。nginx

2、使用docker compose 部署lnmp

  • 部署社區版docker
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
#安裝依賴

[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
#下載docker的repo

[root@localhost ~]# yum -y install docker-ce

[root@localhost ~]# mkdir /etc/docker
[root@localhost ~]# vim /etc/docker/daemon.json

{
        "registry-mirrors":["https://*******.mirror.aliyuncs.com"]
}
#阿里雲鏡像加速

地址須要我的前往阿里雲得到,參考這篇文檔c++

  • 安裝compose工具
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose 


[root@localhost ~]# mkdir compose_lnmp
[root@localhost ~]# cd compose_lnmp/
  • 編寫compose文件和dockerfile格式嚴謹
[root@localhost compose_lnmp]# tree
.
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf
│   └── data
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.1.tar.gz
│   ├── nginx.conf
│   └── run.sh
├── php
│   ├── Dockerfile
│   ├── php-5.6.39.tar.gz
│   └── php.ini
└── wwwroot
    ├── index.html
    └── index.php


[root@localhost compose_lnmp]# cat docker-compose.yml 
version: 3
services:
  nginx:
#在 services 標籤下的第二級標籤是 web,這個名字是用戶本身自定義,它就是服務名稱。
    hostname: nginx
#至關於提早預約義容器的主機名,會寫入到容器的/etc/hostname中
 
    build:
#該標籤標示基於dockerfile來構建一個鏡像
      context: ./nginx
#指定構建鏡像所需的dockerfile目錄,我這裏指定的是相對目錄,該文件(docker-compose.yml)所處位置,也能夠絕對目錄,
      dockerfile: Dockerfile

    ports:
      - 80:80
#和宿主機映射的端口

    networks:
      - lnmp
#指定的網絡環境????

    volumes:
      - ./wwwroot:/usr/local/nginx/html:ro
#將宿主機目錄掛載到該容器當中(只讀)

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - 9000:9000
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6
#image標籤表示是基於mysql:5.6鏡像構建一個新的
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
#???mysql中root用戶密碼
      MYSQL_DATABASE: wordpress
#新建一個數據庫名爲WordPress
      MYSQL_USER: user
#新建一個用戶名爲user
      MYSQL_PASSWORD: user123
#新建user用戶密碼爲user123

networks:
  lnmp:
#建立一個網絡,lnmp爲該網絡的別名
  • Nginx的dockerfile編寫
[root@localhost compose_lnmp]# cat nginx/Dockerfile 
FROM centos:7
#若是有該docker鏡像則基於該鏡像進行構建,沒有則自行從鏡像倉庫pull
MAINTAINER joinbestbest
ENV TIME_ZOME Asia/Shanghai
RUN useradd -s /sbin/nologin -M nginx && yum -y install gcc gcc-c++ make openssl-devel pcre-devel
#運行的命令,安裝依賴
ADD nginx-1.12.1.tar.gz /tmp
#將宿主機源碼包傳送到容器內tmp目錄
RUN cd /tmp/nginx-1.12.1 && \
        ./configure --prefix=/usr/local/nginx && \
        make -j 2 && \
        make install
#編譯;make -j 2使用兩個進程來make,加速
RUN rm -rf /tmp/nginx* && yum clean all && \
        echo "${TIME_ZOME}" > /etc/timezone && \
        ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime 

EXPOSE 80
COPY nginx.conf /usr/local/nginx/conf/
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
#一系列命令操做
  • Nginx配置文件,直接複製到容器內使用
user nginx nginx;
worker_processes 1;
worker_rlimit_nofile 102400;
error_log logs/error.log;
pid logs/nginx.pid; 

events {
	use epoll;
	worker_connections 4096;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    
	server {
        listen       80;
        server_name  localhost;
	charset utf-8;

        location / {
            root   html;
            index  index.php index.html index.htm;
        }
        location ~ \.php$ {
            root html;
			fastcgi_index index.php;
            fastcgi_pass 192.168.111.3:9000;
            #ip修改成宿主機的,端口是php程序映射到宿主機的端口
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

daemon off;


[root@localhost compose_lnmp]# vim nginx/run.sh 
#在dockerfile中指定運行的腳本傳送到容器中
#!/bin/bash

/usr/local/nginx/sbin/nginx
  • mysql配置文件 mysql操做比較少,基本都是在compose制定好的,因此比較簡便
[root@localhost compose_lnmp]# cat mysql/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/tmp/mysql.pid
  • PHP相關文件
[root@localhost compose_lnmp]# cat php/Dockerfile 
FROM centos:7
MAINTAINER crushlinux
ENV TIME_ZOME Asia/Shanghai
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
ADD php-5.6.39.tar.gz /tmp/

RUN cd /tmp/php-5.6.39 && \
        ./configure --prefix=/usr/local/php \
        --with-config-file-path=/usr/local/php/etc \
        --with-mysql --with-mysqli \
        --with-openssl --with-zlib --with-curl --with-gd \
        --with-jpeg-dir --with-png-dir --with-iconv \
        --enable-fpm --enable-zip --enable-mbstring && \
        make -j 4 && \
        make install

RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
        sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf && \
        sed -i "21a daemonize=no" /usr/local/php/etc/php-fpm.conf && \
        echo "${TIME_ZOME}" > /etc/timezone && \
        ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime

COPY php.ini /usr/local/php/etc/
RUN rm -rf /tmp/php* && yum clean all
WORKDIR /usr/local/php/
EXPOSE 9000
#將容器內該端口進行映射
CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
  • wwwroot目錄爲網頁測試文件
[root@localhost compose_lnmp]# cat wwwroot/index.html 
www.join.com

[root@localhost compose_lnmp]# cat wwwroot/index.php 
<?php
phpinfo();
?>

3、測試

  • 部署WordPress
直接將相應的代碼文件放到宿主機的wwwroot目錄下便可,由於這裏已經作好了映射

[root@localhost compose_lnmp]# tar xf wordpress-5.0.2-zh_CN.tar.gz 

[root@localhost compose_lnmp]# mv wordpress wwwroot/

而後在測試瀏覽器上訪問192.168.111.3/wordpress進行操做 git

4、總結

  1. 之前學的docker知識印象都模糊了
  2. dockercompose工具生產環境大都不會採用
  3. 無論如何,docker的基礎知識必定要積極跟上
  4. dockercompose的弊端以及和其餘工具的區別隨後會發布到博客
  5. 將docker的基礎理論整理髮布到博客
相關文章
相關標籤/搜索