Docker搭建LNMP環(huán)境實戰(zhàn)(十):腳本化一次性安裝測試净赴、生產環(huán)境

1造挽、生產環(huán)境&測試環(huán)境的規(guī)劃和部署

1.1酌心、說明

系統部署示意圖

1)項目
此處以一個演示項目的形式來進行環(huán)境的規(guī)劃和部署。此項目名稱默認定義為:“demo”东且,且主要功能為前端應用提供 API 接口服務割以,項目下面包含兩個站點:一個測試站點和一個生產站點金度;主要特點如下:

  • 項目支持 http 和 https 訪問
  • 默認按最簡配置傻瓜式安裝、卸載严沥,安裝猜极、卸載簡單
  • 可根據需要添加配置參數,擴展靈活
  • 腳本化執(zhí)行祝峻,在 shell 里運行腳本即可實現自動化的安裝和卸載

2)站點:
站點一般由 nginx + php + mariadb 組成魔吐, nginx 提供路由訪問服務扎筒, php 程序提供業(yè)務處理能力莱找, mariadb 提供 mysql 數據庫服務。此項目有兩個站點:測試站點和生產站點嗜桌,生產站點作為正式發(fā)布的版本奥溺,測試站點提供開發(fā)過程中的功能測試。測試站點的默認名稱為:“test”骨宠,域名為: myapitest.xxxxxx.com 浮定;生產站點的默認名稱為:“prod”,域名為: myapi.xxxxxx.com 层亿;由于本示例中生產環(huán)境和測試環(huán)境架設在同一臺服務器上桦卒,所以采用一個 nginx 為兩個站點提供訪問服務。
3)服務
此項目中使用到的: nginx 匿又、 php 方灾、 mariadb 等,就是服務,包括一個 nginx 裕偿、兩個 php 洞慎、兩個 mariadb ;
4) ssl 證書
此演示項目是在騰訊云服務器上安裝嘿棘,里面用到的 ssl 證書是從騰訊云申請的劲腿,具體申請流程請看騰訊云的相關說明文檔,包含兩個文件鸟妙,具體文件名格式為: 1_myapitest.xxxxxx.com_bundle.crt 和 2_myapitest.xxxxxx.com.key 焦人,其中 myapitest.xxxxxx.com 為申請時使用的域名,此處為非真實的域名重父,請讀者使用自己的域名垃瞧。如果是其他云,也可以從對應的云服務器里找到相關證書申請的訊息坪郭,當然還可以從第三方直接申請免費證書个从,具體就請在網上搜索吧。

1.2歪沃、演示項目安裝完成后的結果

為了使大家對安裝后的環(huán)境有個宏觀的了解嗦锐,也便于講解,所以從結果倒著看沪曙,先看看安裝完成后的情況奕污,了解一下即可,文章最后會給出相關安裝的腳本及配置文件液走。此處約定的參數為:

  • 項目名稱:project_name -->> demo
  • 測試站點名稱:test_site_name -->> test
  • 生產站點名稱:prod_site_name -->> prod

1.2.1碳默、安裝完成后的主機掛載目錄的結構

主機掛載目錄結構

在使用腳本進行安裝時,腳本會先建立相關目錄以及對應的文件缘眶。

1.2.2嘱根、安裝用到的關鍵配置文件

1)docker-compose.yml

version: "3.5"

services:
    demo_test_mariadb:
        container_name: demo_test_mariadb
        image: mariadb:10.3
        restart: always
        privileged: true
        ports:
            - 13306:3306
        volumes:
            - $ROOT_DIR/demo/test/data/mariadb:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: demo_test_db
            MYSQL_USER: demo_test_user
            MYSQL_PASSWORD: 654321
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        networks:
            - demo_test_network

    demo_test_php:
        container_name: demo_test_php
        image: php:7.2.3-fpm
        privileged: true
        restart: always
        networks:
            - demo_test_network
        volumes:
            - $ROOT_DIR/demo/test/www:/var/demo/test/www
        environment:
            - TZ=Asia/Shanghai
        links:
            - demo_test_mariadb




    demo_prod_mariadb:
        container_name: demo_prod_mariadb
        image: mariadb:10.3
        restart: always
        privileged: true
        ports:
            - 23306:3306
        volumes:
            - $ROOT_DIR/demo/prod/data/mariadb:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: demo_prod_db
            MYSQL_USER: demo_prod_user
            MYSQL_PASSWORD: 654321
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        networks:
            - demo_prod_network

    demo_prod_php:
        container_name: demo_prod_php
        image: php:7.2.3-fpm
        privileged: true
        restart: always
        networks:
            - demo_prod_network
        volumes:
            - $ROOT_DIR/demo/prod/www:/var/demo/prod/www
        environment:
            - TZ=Asia/Shanghai
        links:
            - demo_prod_mariadb




    demo_nginx:
        container_name: demo_nginx
        image: nginx:1.13
        privileged: true
        restart: always
        networks:
            - demo_test_network
            - demo_prod_network
        ports:
            - 80:80
            - 443:443
        volumes:
            - $ROOT_DIR/demo/test/www:/var/demo/test/www
            - $ROOT_DIR/demo/prod/www:/var/demo/prod/www
            - $ROOT_DIR/demo/nginx/conf.d:/etc/nginx/conf.d
            - $ROOT_DIR/demo/nginx/ssl:/etc/nginx/ssl
        environment:
            - TZ=Asia/Shanghai
        links:
            - demo_test_php
            - demo_prod_php




networks:
    demo_test_network:
        name: demo_test_network
    demo_prod_network:
        name: demo_prod_network

docker-compose.yml 文件說明:

  • 版本
version: "3.5"

版本選的是3.5,主要是考慮用來支持網卡命名特性巷懈,見docker-compose.yml 文件的末尾部分该抒,networks的定義:

networks:
    demo_test_network:
        name: demo_test_network
    demo_prod_network:
        name: demo_prod_network
  • docker服務、相關參數顶燕、網卡命名規(guī)范
    以服務mariadb的命名為例:demo_test_mariadb凑保,將項目名稱為demo、站點名稱為test涌攻、服務為mariadb的三個名字用下劃線“_”連接起來欧引,就可以保證主機上服務命名的唯一性,主機上的多個服務不會有重復命名的情況出現恳谎,demo_test_mariadb 可以這樣理解:demo項目的test測試站點的mariadb服務芝此;
    同理還有類似的命名有:demo_prod_php(php服務)、demo_test_db(mariadb數據庫)、demo_prod_network(demo項目中生產站點的網卡)
    由于demo項目里的nginx服務同時為生產環(huán)境和測試環(huán)境提供服務癌蓖,所以其命名為:demo_nginx(demo項目的nginx服務)
  • docker目錄規(guī)范
    /dockers/demo/test/www --- 表示 demo項目中測試站點的網頁目錄
    /dockers/demo/prod/data --- 表示 demo項目中生產站點的數據目錄
    /dockers/demo/nginx/ssl --- 表示 demo項目中 nginx 服務的 ssl 證書目錄
  • 環(huán)境變量 ROOT_DIR
    環(huán)境變量 ROOT_DIR 為此腳本作用范圍內的環(huán)境變量瞬哼,用來指定項目目錄的上一級目錄,該環(huán)境變量在 install.sh 里定義租副。
    2)/dockers/demo/nginx/conf.d/default.conf
server {
    listen       80;
    listen       443 ssl;
    server_name  myapitest.xxxxxx.com;

    #ssl on;
    ssl_certificate       /etc/nginx/ssl/1_myapitest.xxxxxx.com_bundle.crt;
    ssl_certificate_key   /etc/nginx/ssl/2_myapitest.xxxxxx.com.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置
    ssl_prefer_server_ciphers on;

    location / {
        root   /var/demo/test/www;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   demo_test_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/demo/test/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen       80;
    listen       443 ssl;
    server_name  myapi.xxxxxx.com;
    
    #ssl on;
    ssl_certificate       /etc/nginx/ssl/1_myapi.xxxxxx.com_bundle.crt;
    ssl_certificate_key   /etc/nginx/ssl/2_myapi.xxxxxx.com.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置
    ssl_prefer_server_ciphers on;

    location / {
        root   /var/demo/prod/www;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   demo_prod_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/demo/prod/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

安裝demo項目的基本流程為:

  • 第一步:將相關文件拷貝到主機掛載目錄(包括docker-compose.yml 和 default.conf)
  • 第二步:配置好 docker-compose.yml
  • 第三步:配置好 default.conf
  • 第四步:運行 docker-compose up -d 安裝
  • 第五步:安裝PDO驅動等

2坐慰、腳本化安裝

2.1、安裝文件目錄結構

項目目錄結構

從上圖可以看出用僧,安裝文件的目錄結構還是很簡單的结胀,其中模版目錄下除了default.conf.tpl、docker-compose.yml.tpl比較重要和相對復雜以外责循,其他模版文件都很簡單糟港,可有可無,不關鍵院仿,只是為了配合測試秸抚。

2.2、自定義變量說明

此項目為了簡化文件生成歹垫,在模版文件中使用了自定義變量剥汤,自定義變量的書寫形式為:{{自定義變量_xxxx}},可以在腳本中根據變量的配置值排惨,對模版文件的自定義變量區(qū)域進行動態(tài)替換吭敢。例如:我們在config.sh文件中定義了變量“project_name”,“test_site_name”

 ["project_name"]="demo"                # 項目名稱
 ["test_site_name"]="test"              # 測試站點名稱

同時暮芭,我們在docker-compose.yml.tpl中使用了自定義變量域{{project_name}}鹿驼、{{test_site_name}}

version: "3.5"

services:
    {{project_name}}_{{test_site_name}}_mariadb:

運行腳本后,生成的配置文件的自定義變量域會被替換辕宏,比如上面的模版對應的配置文件會變成:

version: "3.5"

services:
    demo_test_mariadb:

需要說明的是:在本配置中畜晰,自定義變量實現了“即加即用”,且用戶可以根據需要定義匾效,在congfig.sh文件里定義一個變量舷蟀,在模版文件里加上對應的自定義變量域,不用修改其他代碼面哼,就能自動進行替換。

2.3扫步、關鍵文件說明

2.3.1魔策、config.sh

#!/bin/bash

declare -A config=(
  ["project_name"]="demo"                # 項目名稱
  ["mariadb_image"]="mariadb:10.3"       # mariadb 鏡像名和版本
  ["php_image"]="php:7.2.3-fpm"          # php 鏡像名和版本
  ["nginx_image"]="nginx:1.13"           # nginx 鏡像名和版本
  
  ["test_site_name"]="test"              # 測試站點名稱
  ["mysql_root_password_test"]="123456"  # 測試站點數據庫root密碼
  ["mysql_password_test"]="654321"       # 測試站點數據庫用戶密碼,用戶名會自動生成
  ["mysql_mapped_port_test"]=13306       # 測試站點數據庫管理端口映射河胎,便于客戶端管理
  ["dns_test"]="myapitest.xxxxxx.com"     # 測試站點域名
  # 測試站點 ssl 證書文件名配置
  ["ssl_certificate_test"]="1_myapitest.xxxxxx.com_bundle.crt"
  ["ssl_certificate_key_test"]="2_myapitest.xxxxxx.com.key"
  
  ["prod_site_name"]="prod"              # 生產站點名稱
  ["mysql_root_password_prod"]="123456"  # 生產站點數據庫root密碼
  ["mysql_password_prod"]="654321"       # 生產站點數據庫用戶密碼闯袒,用戶名會自動生成
  ["mysql_mapped_port_prod"]=23306       # 生產站點數據庫管理端口映射,便于客戶端管理
  ["dns_prod"]="myapi.xxxxxx.com"         # 生產站點域名
  # 生產站點 ssl 證書文件名配置
  ["ssl_certificate_prod"]="1_myapi.xxxxxx.com_bundle.crt"
  ["ssl_certificate_key_prod"]="2_myapi.xxxxxx.com.key"
)

配置文件里定義了一個map來存儲相關配置參數,用戶可以根據需要進行修改政敢、增加其徙、刪除配置。

2.3.2喷户、tpl/docker-compose.yml.tpl

version: "3.5"

services:
    {{project_name}}_{{test_site_name}}_mariadb:
        container_name: {{project_name}}_{{test_site_name}}_mariadb
        image: {{mariadb_image}}
        restart: always
        privileged: true
        ports:
            - {{mysql_mapped_port_test}}:3306
        volumes:
            - $ROOT_DIR/{{project_name}}/{{test_site_name}}/data/mariadb:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: {{mysql_root_password_test}}
            MYSQL_DATABASE: {{project_name}}_{{test_site_name}}_db
            MYSQL_USER: {{project_name}}_{{test_site_name}}_user
            MYSQL_PASSWORD: {{mysql_password_test}}
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        networks:
            - {{project_name}}_{{test_site_name}}_network

    {{project_name}}_{{test_site_name}}_php:
        container_name: {{project_name}}_{{test_site_name}}_php
        image: {{php_image}}
        privileged: true
        restart: always
        networks:
            - {{project_name}}_{{test_site_name}}_network
        volumes:
            - $ROOT_DIR/{{project_name}}/{{test_site_name}}/www:/var/{{project_name}}/{{test_site_name}}/www
        environment:
            - TZ=Asia/Shanghai
        links:
            - {{project_name}}_{{test_site_name}}_mariadb




    {{project_name}}_{{prod_site_name}}_mariadb:
        container_name: {{project_name}}_{{prod_site_name}}_mariadb
        image: {{mariadb_image}}
        restart: always
        privileged: true
        ports:
            - {{mysql_mapped_port_prod}}:3306
        volumes:
            - $ROOT_DIR/{{project_name}}/{{prod_site_name}}/data/mariadb:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: {{mysql_root_password_prod}}
            MYSQL_DATABASE: {{project_name}}_{{prod_site_name}}_db
            MYSQL_USER: {{project_name}}_{{prod_site_name}}_user
            MYSQL_PASSWORD: {{mysql_password_prod}}
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        networks:
            - {{project_name}}_{{prod_site_name}}_network

    {{project_name}}_{{prod_site_name}}_php:
        container_name: {{project_name}}_{{prod_site_name}}_php
        image: {{php_image}}
        privileged: true
        restart: always
        networks:
            - {{project_name}}_{{prod_site_name}}_network
        volumes:
            - $ROOT_DIR/{{project_name}}/{{prod_site_name}}/www:/var/{{project_name}}/{{prod_site_name}}/www
        environment:
            - TZ=Asia/Shanghai
        links:
            - {{project_name}}_{{prod_site_name}}_mariadb




    {{project_name}}_nginx:
        container_name: {{project_name}}_nginx
        image: {{nginx_image}}
        privileged: true
        restart: always
        networks:
            - {{project_name}}_{{test_site_name}}_network
            - {{project_name}}_{{prod_site_name}}_network
        ports:
            - 80:80
            - 443:443
        volumes:
            - $ROOT_DIR/{{project_name}}/{{test_site_name}}/www:/var/{{project_name}}/{{test_site_name}}/www
            - $ROOT_DIR/{{project_name}}/{{prod_site_name}}/www:/var/{{project_name}}/{{prod_site_name}}/www
            - $ROOT_DIR/{{project_name}}/nginx/conf.d:/etc/nginx/conf.d
            - $ROOT_DIR/{{project_name}}/nginx/ssl:/etc/nginx/ssl
        environment:
            - TZ=Asia/Shanghai
        links:
            - {{project_name}}_{{test_site_name}}_php
            - {{project_name}}_{{prod_site_name}}_php




networks:
    {{project_name}}_{{test_site_name}}_network:
        name: {{project_name}}_{{test_site_name}}_network
    {{project_name}}_{{prod_site_name}}_network:
        name: {{project_name}}_{{prod_site_name}}_network

2.3.3唾那、tpl/default.conf.tpl

server {
    listen       80;
    listen       443 ssl;
    server_name  {{dns_test}};

    #ssl on;
    ssl_certificate       /etc/nginx/ssl/{{ssl_certificate_test}};
    ssl_certificate_key   /etc/nginx/ssl/{{ssl_certificate_key_test}};

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置
    ssl_prefer_server_ciphers on;

    location / {
        root   /var/{{project_name}}/{{test_site_name}}/www;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   {{project_name}}_{{test_site_name}}_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/{{project_name}}/{{test_site_name}}/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen       80;
    listen       443 ssl;
    server_name  {{dns_prod}};
    
    #ssl on;
    ssl_certificate       /etc/nginx/ssl/{{ssl_certificate_prod}};
    ssl_certificate_key   /etc/nginx/ssl/{{ssl_certificate_key_prod}};

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置
    ssl_prefer_server_ciphers on;

    location / {
        root   /var/{{project_name}}/{{prod_site_name}}/www;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   {{project_name}}_{{prod_site_name}}_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/{{project_name}}/{{prod_site_name}}/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

2.3.4、install.sh

#!/bin/bash

export ROOT_DIR="/dockers"    # 項目發(fā)布目錄的上一級目錄

. config.sh      # 引入配置文件腳本
. common/create_yml.sh  # 引入創(chuàng)建 docker-compose.yml 文件的腳本

project_name=${config["project_name"]}      # 項目名稱
test_site_name=${config["test_site_name"]}  # 測試站點名稱
prod_site_name=${config["prod_site_name"]}  # 生產站點名稱

# 在主機上創(chuàng)建相關掛載目錄褪尝,會在安裝時掛載到 docker 上
mkdir -p $ROOT_DIR/$project_name/$test_site_name/www       # 測試站點頁面目錄
mkdir -p $ROOT_DIR/$project_name/$prod_site_name/www       # 生產站點頁面目錄
mkdir -p $ROOT_DIR/$project_name/nginx/conf.d              # nginx 配置目錄
mkdir -p $ROOT_DIR/$project_name/nginx/ssl                 # ssl 證書文件目錄

# 從安裝模版目錄里拷貝相關模板到掛載目錄下
cp -f tpl/index_1.html.tpl  $ROOT_DIR/$project_name/$test_site_name/www/index.html
cp -f tpl/index_2.html.tpl  $ROOT_DIR/$project_name/$prod_site_name/www/index.html
cp -f tpl/index_1.php.tpl   $ROOT_DIR/$project_name/$test_site_name/www/index.php
cp -f tpl/index_2.php.tpl   $ROOT_DIR/$project_name/$prod_site_name/www/index.php
cp -f tpl/testdb_1.php.tpl  $ROOT_DIR/$project_name/$test_site_name/www/testdb.php
cp -f tpl/testdb_2.php.tpl  $ROOT_DIR/$project_name/$prod_site_name/www/testdb.php
cp -f tpl/default.conf.tpl  $ROOT_DIR/$project_name/nginx/conf.d/default.conf

# 根據模版自動生成相應文件
for key in ${!config[@]}
do
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$test_site_name/www/index.html
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$prod_site_name/www/index.html
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$test_site_name/www/index.php
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$prod_site_name/www/index.php
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$test_site_name/www/testdb.php
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/$prod_site_name/www/testdb.php
  sed -i "s/{{$key}}/${config[$key]}/g" $ROOT_DIR/$project_name/nginx/conf.d/default.conf
done

# 將安裝源 ssl 目錄里的證書文件分發(fā)到對應的掛載目錄下
cp -f ssl/*.* $ROOT_DIR/$project_name/nginx/ssl/.
cp -f ssl/*.* $ROOT_DIR/$project_name/nginx/ssl/.

#安裝 docker
docker-compose up -d

#向測試站點的 php 容器里安裝 PDO 擴展
echo "往 $project_name_$test_site_name 的php容器里安裝 PDO擴展..."
docker cp common/install_pdo_in_container.sh ${project_name}_${test_site_name}_php:/var/$project_name/$test_site_name/. # 將 pdo 安裝腳本文件由屬主機拷入 php 容器里的/var/homework_test 目錄下
docker exec -i ${project_name}_${test_site_name}_php bash /var/$project_name/$test_site_name/install_pdo_in_container.sh # 在 php 容器里運行 pdo 腳本闹获,安裝 mysq 的 pdo 驅動
docker restart ${project_name}_${test_site_name}_php # 重啟 php 容器里的 php 服務
echo "往php容器里安裝 PDO擴展結束!"

#向生產站點的 php 容器里安裝 PDO 擴展
echo "往 $project_name_$prod_site_name 的php容器里安裝 PDO擴展..."
docker cp common/install_pdo_in_container.sh ${project_name}_${prod_site_name}_php:/var/$project_name/$prod_site_name/. # 將 pdo 安裝腳本文件由屬主機拷入 php 容器里的/var/homework_test 目錄下
docker exec -i ${project_name}_${prod_site_name}_php bash /var/$project_name/$prod_site_name/install_pdo_in_container.sh # 在 php 容器里運行 pdo 腳本河哑,安裝 mysq 的 pdo 驅動
docker restart ${project_name}_${prod_site_name}_php # 重啟 php 容器里的 php 服務
echo "往php容器里安裝 PDO擴展結束避诽!"

2.3.5、uninstall.sh

#!/bin/bash

export ROOT_DIR="/dockers"    # 項目發(fā)布目錄的上一級目錄

. config.sh      # 引入配置文件腳本
. common/create_yml.sh  # 引入創(chuàng)建 docker-compose.yml 文件的腳本

# 卸載 docker
docker-compose down

2.3.6璃谨、common/create_yml.sh

#!/bin/bash

# 從安裝模版目錄里拷貝 docker 編排文件模板到掛載目錄下
cp -f tpl/docker-compose.yml.tpl docker-compose.yml

# 根據 docker 編排模版自動生成 docker 編排文件
for key in ${!config[@]}
do
  echo $key
  sed -i "s/{{$key}}/${config[$key]}/g" docker-compose.yml
done

2.3.7沙庐、common/install_pdo_in_container.sh

#!/bin/bash

# 以下操作是進入 php 的 docker 容器里執(zhí)行的
cd /usr/local/bin
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysql
exit

2.3.8、其他幾個測試網頁模板文件

1)tpl/index_1.html.tpl

{{dns_test}}/index.html

2)tpl/index_1.php.tpl

<?php
  echo "{{dns_test}}/index.php";
?>

3)tpl/testdb_1.php.tpl

<?php
$PDO = new PDO('mysql:host={{project_name}}_{{test_site_name}}_mariadb;dbname=mysql', 'root', '{{mysql_root_password_test}}');
var_dump($PDO);
$stmt=$PDO->prepare('select count(*) as userCount from user');
$stmt->execute();
echo '<br>';
echo 'rowCount='.$stmt->rowCount().'<br>';
while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {
      echo 'userCount='.$row['userCount'].'<br>';
}
?>

4)tpl/index_2.html.tpl

{{dns_prod}}/index.html

5)tpl/index_2.php.tpl

<?php
  echo "{{dns_prod}}/index.php";
?>

6)tpl/testdb_2.php.tpl

<?php
$PDO = new PDO('mysql:host={{project_name}}_{{prod_site_name}}_mariadb;dbname=mysql', 'root', '{{mysql_root_password_prod}}');
var_dump($PDO);
$stmt=$PDO->prepare('select count(*) as userCount from user');
$stmt->execute();
echo '<br>';
echo 'rowCount='.$stmt->rowCount().'<br>';
while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {
      echo 'userCount='.$row['userCount'].'<br>';
}
?>

2.4佳吞、運行安裝腳本

為了便于說明轨功,我按照我的安裝目錄結構來進行安裝,您可以根據自己的喜好來選擇容达。安裝目錄為:/dockers/demo_install古涧,該目錄下包含的文件如下圖:


安裝目錄下的文件結構

在 shell 里運行命令,檢查 dockers 安裝情況

[root@VM_16_17_centos demo_install]# docker ps

發(fā)現我的電腦里目前沒有 docker 容器在運行


docker列表

運行 install.sh

[root@VM_16_17_centos demo_install]# ./install.sh

如果不出意外花盐,會自動完成安裝羡滑!安裝結果如下圖:


安裝完成后 docker 列表

2.5、瀏覽器訪問測試

利用瀏覽器訪問網址:

同理可以測試卸載:

[root@VM_16_17_centos demo_install]# ./uninstall.sh

以上腳本安裝柒昏、卸載測試成功。請參考熙揍!

至此职祷,已經完全實現了Docker在一臺服務器上搭建支持80、443端口訪問的測試届囚、生產雙站點系統有梆。下面的工作就是利用git給兩個網站進行代碼開發(fā)和部署工作了!

本實例代碼已上傳到 github 意系,敬請下載試用泥耀、參考。地址為:
https://github.com/tanbushi/DNMP


上一篇:Docker搭建LNMP環(huán)境實戰(zhàn)(九):安裝mariadb
下一篇:完結
所屬文集:Docker搭建LNMP環(huán)境實戰(zhàn)


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蛔添,一起剝皮案震驚了整個濱河市痰催,隨后出現的幾起案子兜辞,更是在濱河造成了極大的恐慌,老刑警劉巖夸溶,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逸吵,死亡現場離奇詭異,居然都是意外死亡缝裁,警方通過查閱死者的電腦和手機扫皱,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压语,“玉大人啸罢,你說我怎么就攤上這事√ナ常” “怎么了扰才?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厕怜。 經常有香客問我衩匣,道長,這世上最難降的妖魔是什么粥航? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任琅捏,我火速辦了婚禮,結果婚禮上递雀,老公的妹妹穿的比我還像新娘柄延。我一直安慰自己,他們只是感情好缀程,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布搜吧。 她就那樣靜靜地躺著,像睡著了一般杨凑。 火紅的嫁衣襯著肌膚如雪滤奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天撩满,我揣著相機與錄音蜒程,去河邊找鬼。 笑死伺帘,一個胖子當著我的面吹牛昭躺,可吹牛的內容都是我干的。 我是一名探鬼主播曼追,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼窍仰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了礼殊?” 一聲冷哼從身側響起驹吮,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶伦,沒想到半個月后碟狞,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡婚陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年族沃,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泌参。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡脆淹,死狀恐怖,靈堂內的尸體忽然破棺而出沽一,到底是詐尸還是另有隱情盖溺,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布铣缠,位于F島的核電站烘嘱,受9級特大地震影響,放射性物質發(fā)生泄漏蝗蛙。R本人自食惡果不足惜蝇庭,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捡硅。 院中可真熱鬧哮内,春花似錦、人聲如沸壮韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泰涂。三九已至鲫竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逼蒙,已是汗流浹背从绘。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留是牢,地道東北人僵井。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像驳棱,于是被迫代替她去往敵國和親批什。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容