基於Docker搭建LNPM環境

轉載至個人博客php

​ 做爲一隻iOS前端工程師,最近對PHP產生了興趣,我認爲這不屬於遊手好閒,做爲一個程序員不該該把本身侷限在一個封閉的領域當中,應該時刻保持好奇心,因此我對「世界上最好的語言」開始了探索~html

​ 工欲善其事,必先利其器,首先就要搭建開發環境,因爲本人不喜歡由於開發環境把本身的電腦搞得亂七八糟,亂安裝一些有的沒的依賴開發包,因此我選擇虛擬機+Docker來搭建環境~前端

​ 下面咱們開始:mysql

Docker準備

​ 我選擇了徹底兼容Redhat系統的CentOS7發行版Linux系統,下載Linux而且虛擬機安裝系統這裏就省略了,準備好Linux系統就能夠開始安裝Docker了。linux

刪除舊版本

若是之前安裝過想從新安裝新版本請先使用下面的命令卸載舊版本的Docker,第一次安裝請直接到第二步nginx

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
複製代碼

Docker安裝設置

Docker提供兩種安裝方式,官方推薦使用軟件倉庫的方式安裝Docker,方便更新等操做,另外一種是以RPM的方式安裝,這裏不作介紹~git

直接用官方推薦的方式安裝,首先設置Docker的軟件倉庫程序員

設置Docker的官方軟件倉庫

  1. 先安裝Docker依賴的軟件包github

    $ sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    複製代碼
  2. 設置穩定版本的Docker倉庫地址,Docker還提供了測試版本的地址,這裏咱們不須要,只要穩定版本就能夠了。sql

    $ sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    複製代碼

正式安裝Docker

  1. 安裝Docker的最新版本

    $ sudo yum install docker-ce
    複製代碼
  2. 啓動Docker服務

    $ sudo systemctl start docker
    複製代碼
  3. 測試Docker是否工做正常

    $ sudo docker run hello-world
    複製代碼

    若是輸出了 hello world說明Docker已經安裝正常了

編寫Dockerfile

Dockerfile是用來製做鏡像使用的一系列Docker命令的腳本文件,docker build命令會根據Dockerfile中的設置生成咱們自定義的鏡像。

​ 首先準備好一個目錄結構以下:

testphp								#你自定義的一個目錄名
├── html 							#用做Nginx的站點目錄
│   └── phptest							#子目錄能夠自定義
│       ├── index.php					        #一段簡單的PHP代碼,好比<?php phpinfo();?>
├── mysql							#Mysql數據庫相關的目錄
│   ├── conf							#Mysql配置文件目錄
│   └── data							#Mysql數據目錄
├── nginx							#Nginx相關目錄
│   ├── conf							#Nginx配置文件目錄
│   └── logs							#Nginx日記目錄
└── php-mysqli							#咱們須要根據官方鏡像生成支持mysqli的鏡像,此爲自定義目錄
    └── Dockerfile						#生成自定義鏡像的Dockerfile
複製代碼

​ 在php-mysqli目錄下的Dockerfile文件中,輸入以下內容:

FROM php:7.2.11-fpm						#基於PHP官方鏡像7.2.11-fpm版本製做自定義鏡像

RUN docker-php-ext-install mysqli		                #安裝PHP擴展支持mysqli
複製代碼

完成之後不用手動運行docker build命令生成鏡像,稍後使用docker-compose自動幫咱們構建鏡像。

安裝docker-compose

docker-composeDocker提供的用於管理多個Docekr容器的工具,Docker推薦的理念是,一個容器運行一個服務進程,這裏咱們搭建的環境包括,一個PHP服務進程、一個Nginx服務進程、一個phpadmin進程(用於方便的操做mysql數據庫的工具)、一個mysql服務進程,總共4個,因此須要先安裝docker-compose

  1. 下載docker-compose命令文件

    sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    複製代碼
  2. docker-compose命令文件賦予可執行權限

    sudo chmod +x /usr/local/bin/docker-compose
    複製代碼
  3. 測試安裝是否正確

    $ sudo docker-compose --version
    複製代碼

    若是正常輸出版本號說明安裝完成

編寫docker-compose.yml

docker-compose命令能夠根據咱們編寫的docker-compose.yml文件自動的管理Docker鏡像。

​ 在咱們本身創建的根目錄下面新建一個docker-compose.yml,輸入以下內容:

version: '3'							#指定docker-compose文件的版本,低版本不支持services、
services:							#networks等標籤
  phpmyadmin:
    image: phpmyadmin/phpmyadmin		                #使用的鏡像
    ports:							#端口映射
      - "8080:80"
    depends_on:							#此服務要依賴於mysql服務
      - mysql
    links:							#鏈接到mysql服務
      - mysql:db
    networks:							#指定內部網絡
      - app_net
  nginx:
    image: nginx:latest
    ports:
      - "80:80"							#容器中的80端口映射到HOST的80端口
    depends_on:
      - "php"
    volumes:							#指定掛載的文件或目錄
      - "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
      - "./html:/home:ro"
    networks:
      - app_net
    container_name: "compose-nginx"		                #指定容器名字
  php:
    build: ./php-mysqli					        #這裏指定Dockerfile的路徑 會幫咱們自動構建鏡像
    image: php:7.2.11-fpm-mysqli		
    ports:
      - "9000:9000"
    depends_on:
      - mysql
    volumes:							#這裏的掛載目錄要和nginx中的同樣,不然找不到php文件
      - "./html:/home"
    networks:
      - app_net
    container_name: "compose-php"
  mysql:
    image: mysql:5.7.24					        #數據庫鏡像版本
    ports:
          - "3306:3306"
    volumes:
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/conf/my.cnf:/etc/mysql/my.cnf"
    environment:						#鏡像內部使用的環境變量,這裏用來摺紙數據庫的密碼
      - MYSQL_ROOT_PASSWORD=zhaofucheng
    networks:
      app_net:
        ipv4_address: 10.10.10.1		                #指定內部網絡中的IP地址
    container_name: "compose-mysql"
networks:
  app_net:
    driver: bridge						#網絡模式用橋接
    ipam:
      config:
        - subnet: 10.10.0.0/16			                #使用CIDR方式子網劃分
複製代碼

準備Nginx和Mysql的配置文件

​ 這裏咱們須要把配置文件放到咱們的指定的目錄中,稍後更改配置不須要進入到容器內部,也能更好的管理配置咱們的服務。

​ 有兩種方式準備鏡像文件,一是本身從頭編寫,而是從鏡像當中複製一個默認的再根據本身的須要去修改,這裏咱們選擇從鏡像當中複製。

Nginx配置文件

​ 準備Nginx配置文件

複製Nginx文件

  1. 啓動一個臨時容器

    $ sudo docker run --name tmp-nginx-container -d nginx
    複製代碼
  2. 從臨時nginx鏡像當中複製配置文件 放到咱們本身創建的nginx/conf目錄中

    $ sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf ./nginx/conf/nginx.conf
    複製代碼
  3. 刪除創建的臨時容器

    $ sudo docker rm -f tmp-nginx-container
    複製代碼

編輯Nginx配置文件

編輯文件內容以下:

user  nginx;
worker_processes  2;				                        #根據CPU核心數量指定工做線程的數量,這裏個人虛擬機爲2核心

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;			#監聽端口
        server_name  test.ng;		#虛擬主機的名稱,稍後要寫入到本機的host文件當中
        root /home/phptest;			#項目php的路徑

        access_log  /var/log/nginx/access.log  main;
        error_log /var/log/nginx/error.log error;

        location / {
                index  index.html index.htm index.php;
        }
									#配置全部訪問php的請求都交給PHP: FastCGI 進程管理器處理
        location ~ \.php$ {
                fastcgi_pass   php:9000;#這裏是在docker-compose.yml文件中指定的服務名和端口號
                fastcgi_index  index.php;	#默認尋找的php入口頁面
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params; #網絡上還有另外一種方式 include fastcgi.conf; 因爲要引入一個新的配置文件 這裏我就嫌麻煩就使用這種方式了 根據我的喜愛本身選擇吧
        }
    }
}
複製代碼

Mysql配置文件

​ 一樣複製Mysql的配置文件

  1. 啓動一個臨時的Mysql容器

    $ sudo docker run --name tmp-mysql-container -d mysql:5.7.24
    複製代碼
  2. 從臨時的Mysql容器中複製配置文件到咱們指定的目錄

    $ sudo docker cp tmp-mysql-container:/etc/mysql/my.cnf ./mysql/conf/my.conf
    複製代碼
  3. 刪除臨時的Mysql容器

    $ sudo docker rm -f tmp-mysql-container
    複製代碼

    這裏咱們使用默認的mysql配置就能夠了。

查看虛擬機的IP地址加入到host文件當中

​ 在虛擬機的終端中輸入:

$ ifconfig eth0 #查看默認網卡的信息

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.150  netmask 255.255.255.0  broadcast 192.168.31.255
        inet6 fe80::caec:3251:7864:4814  prefixlen 64  scopeid 0x20<link>
        ether 00:1c:42:a4:5b:ef  txqueuelen 1000  (Ethernet)
        RX packets 2341561  bytes 1335991534 (1.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 520557  bytes 56885302 (54.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

複製代碼

​ 其中的inet 192.168.31.150就是咱們虛擬機的IP地址,我本人的電腦是Mac系統,因此回到在個人Mac系統電腦的終端中輸入:

$ sudo vim /etc/hosts
複製代碼

​ 將咱們指定的虛擬主機名和IP地址以以下格式加入到host文件中 而後保存退出。

192.168.31.150 test.ng					#Ngxin服務地址
192.168.31.150:8080 phpadmin.net		        #用於訪問PhpAdmin服務
複製代碼

​ 稍後咱們就能夠直接在瀏覽器中輸入http://test.ng/訪問Nginx測試了。

啓動咱們的服務

​ 回到虛擬機中,咱們目前爲止的文件結構以下:

testphp
├── docker-compose.yml
├── html
│   └── phptest
│       ├── index.php
│       ├── testmysql.php
├── mysql
│   ├── conf
│   │   └── my.cnf
│   └── data
├── nginx
│   ├── conf
│   │   └── nginx.conf
│   └── logs
└── php-mysqli
    └── Dockerfile
複製代碼

​ 編輯咱們的index.php文件,輸入以下內容:

<?php
phpinfo();
?>
複製代碼

有些人不輸入<?php 而是直接寫<?,致使出現錯誤,還得修改什麼php.ini配置項,這裏我建議就別給本身找麻煩,按照標準寫法就能夠了,別起什麼幺蛾子~

編輯testmysql.php文件用來測試可否鏈接到Mysql數據庫,輸入以下內容:

<?php
  $db = new mysqli('10.10.10.1:3306','root','zhaofucheng','testdatabase');
  if (mysqli_connect_errno()) {
    echo 'Error: Could not connect to database. Please try again later.';
    exit;
  } else {
    echo 'The connection is successful.';
  }
  $db->close();
?>
複製代碼

​ 確保咱們在本身定義的根目錄中輸入:

testphp]$ sudo /usr/local/bin/docker-compose up -d
testphp]$ sudo docker ps
複製代碼

​ 若是輸入完成後能夠看到四個容器都啓動了,那麼表明咱們成功了,若是出現了錯誤,請回到上面仔細對照配置項,或者GoogleBaidu以及留言給我一塊兒解決~

測試咱們的服務

先在咱們本身電腦的瀏覽器中輸入地址http://test.ng/,成功頁面以下圖:

PHP信息

以上表明咱們的NginxPHP已經配合完美了~~

再來測試phpMyAdmin是否也成功啓動了,在瀏覽器中輸入地址http://phpadmin.net訪問,成功頁面以下圖:

phpMyAdmin登錄

​ 出現上圖表明phpMyAdmin啓動成功,若是輸入咱們配置的Mysql密碼能夠正常登錄,表明phpMyAdminMysql配合完美了~

這裏若是登錄成功了,如今數據庫中新建一個名叫testdatabase數據庫,用來給咱們測試PHP是否能正常鏈接到Mysql

如今見證奇蹟的時刻到了~,在瀏覽器中輸入http://test.ng/testmysql.php訪問,若是頁面顯示The connection is successful.那就表明成功了~,能夠盡情的玩耍了~~。

Mysql8.0更改默認密碼驗證方式的致使PHP鏈接報錯的問題

我在使用Mysql8.0版本的鏡像來配置時,發現PHP默認的配置不能登陸到Mysql,致使鏈接報錯,原來是Mysql8.0改了密碼驗證方式,若是想要正常鏈接,須要在Mysql數據庫中把要登錄的用戶密碼的驗證方式從caching_sha2_password改成mysql_native_password,這裏就不費那個勁了,練習環境5.7版本的Mysql就能夠了~

相關文章
相關標籤/搜索