1. 程式人生 > >docker:搭建年輕人第一個LNMP網站平臺

docker:搭建年輕人第一個LNMP網站平臺

docker docker lnmp docker nginx docker php

1.背景

?LNMP為(linux系統、nginx服務、mysql服務、php服務)組合而成,本次練習所使用的鏡像均為docker官方鏡像源 https://hub.docker.com ,鏡像介紹如下:

鏡像名稱 官方鏡像地址
nginx php鏡像 https://hub.docker.com/r/richarvey/nginx-php-fpm/
mysql鏡像 https://hub.docker.com/_/mysql/

?我這裏的nginx php用的是richarve/nginx-php-fpm 這個集成在一起的鏡像,你也可以把nginx、php這兩個鏡像獨立出來(就是使用兩個鏡像)。還要說明一下,大家在練習的時候盡量不要復制命令,自己手動多敲敲這些命令,本文的練習環境是在centos7.4上進行的。

2.開始部署

2.1部署流程

  • 先安裝docker,本文當中不著重介紹這一步;
  • 創建自定網絡為lnmp;
  • 創建mysql數據庫容器和數據庫;
  • 創建nginx/php容器;
  • 下載wordpress博客系統來測試;

2.2查看版本信息

[root@ganbing ~]# cat  /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@ganbing ~]# docker version
Client:
 Version:   17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:10:14 2017
 OS/Arch:   linux/amd64

Server:
 Engine:
  Version:  17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:    Wed Dec 27 20:12:46 2017
  OS/Arch:  linux/amd64
  Experimental: false

?建議用centos 7.4的版本,docker用的是17.12.0-ce 版本(ce是docker社區版、ee是docker企業版)。

2.3創建自定義網絡lnmp

[root@ganbing ~]# docker  network  create  lnmp
baa8fe1582a7c38f9663668c4abbf1863e45d2c9ad6c140a93a8b1a41b78e2f6

[root@ganbing ~]# docker network  ls
NETWORK ID          NAME                DRIVER              SCOPE
4e09a7db5303        bridge              bridge              local
d77497b635bb        host                host                local
baa8fe1582a7        lnmp               bridge              local
637e45b21ed3        none                null                local

說明:從上面顯示可以看出,docker服務運行後,默認有bridge、host、none這3個網絡,網絡介紹不是本文的重點,可以看到lnmp網絡已創建好了。

2.4修改鏡像源

我們默認去下載鏡像走的是國外的源,下載會很慢,建議配置國內的鏡像源來下載:

[root@ganbing ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": [ "https://registry.docker-cn.com"]
}

修改改鏡像源後,還需要重啟docker服務:

[root@ganbing ~]# systemctl  restart docker

2.5創建mysql數據庫容器

下載mysql鏡像:

[root@ganbing ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
8176e34d5d92: Pull complete 
17e372a8ec90: Pull complete 
47b869561d3a: Pull complete 
c90ab4483f28: Pull complete 
d6af16572c5c: Pull complete 
6d16794d04ac: Pull complete 
aaf442a8fe75: Pull complete 
7c6fa8f07ec4: Pull complete 
ece17b689642: Pull complete 
c55b06e76eaf: Pull complete 
661fabfb4fc2: Pull complete 
Digest: sha256:227d5c3f54ee3a70c075b1c3013e72781564000d34fc8c7ec5ec353c5b7ef7fa
Status: Downloaded newer image for mysql:latest

[root@ganbing ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              5d4d51c57ea8        2 days ago          374MB

說明:可以看到mysql鏡像下載了最新latest版本,總大小為374MB。

運行mysql容器:

[root@ganbing ~]# docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql --character-set-server=utf8
f187cd6feb9e2ca3ef39b51317e7ea0568f9c84d52e2538ff1a3fe9c57bea890

參數說明:
-itd:在容器中打開一個偽終端進行交互操作,並在後臺運行;
--name:為容器分配一個名字lnmp_mysql;
--net:為容器指定一個網絡環境為lnmp網絡;
-p:容器暴露端口映射,把宿主機的3306端口映射到容器的3306端口;
--mout:把數據卷mysql-vol掛載到容器的/var/lib/mysql目錄,掛載也相當於數據持久化;
-e:設置一個變量MYSQL_ROOT_PASSWORD;
mysql:指定剛才下載的mysql鏡像來啟動容器;

查看mysql容器是否運行:

[root@ganbing ~]# docker top  lnmp_mysql 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             16488               16473               0                   11:31               pts/0               00:00:00            mysqld --character-set-server=utf8
[root@ganbing ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f187cd6feb9e        mysql               "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        0.0.0.0:3306->3306/tcp   lnmp_mysql

創建一個數據庫wp:

數據庫可以任意命名,我這裏用exec來創建一個數據庫為wp,創建好了有一條警告信息,不用管它:

[root@ganbing ~]# docker exec lnmp_mysql sh  -c ‘exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"‘ 
mysql: [Warning] Using a password on the command line interface can be insecure.

然後我們查看一下數據庫是否創建:

[root@ganbing ~]# docker exec lnmp_mysql sh -c ‘exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"show databases"‘ 
mysql: [Warning] Using a password on the command line interface can be insecure.
Database
information_schema
mysql
performance_schema
sys
wp

查看mysql-vol卷:

[root@ganbing ~]# ll /var/lib/docker/volumes/mysql-vol/_data/
total 188484
-rw-r----- 1 polkitd input       56 Mar  1 11:31 auto.cnf
-rw------- 1 polkitd input     1675 Mar  1 11:31 ca-key.pem
-rw-r--r-- 1 polkitd input     1107 Mar  1 11:31 ca.pem
-rw-r--r-- 1 polkitd input     1107 Mar  1 11:31 client-cert.pem
-rw------- 1 polkitd input     1675 Mar  1 11:31 client-key.pem
-rw-r----- 1 polkitd input     1335 Mar  1 11:31 ib_buffer_pool
-rw-r----- 1 polkitd input 79691776 Mar  1 11:31 ibdata1
-rw-r----- 1 polkitd input 50331648 Mar  1 11:31 ib_logfile0
-rw-r----- 1 polkitd input 50331648 Mar  1 11:31 ib_logfile1
-rw-r----- 1 polkitd input 12582912 Mar  1 11:31 ibtmp1
drwxr-x--- 2 polkitd input     4096 Mar  1 11:31 mysql
drwxr-x--- 2 polkitd input     8192 Mar  1 11:31 performance_schema
-rw------- 1 polkitd input     1675 Mar  1 11:31 private_key.pem
-rw-r--r-- 1 polkitd input      451 Mar  1 11:31 public_key.pem
-rw-r--r-- 1 polkitd input     1107 Mar  1 11:31 server-cert.pem
-rw------- 1 polkitd input     1675 Mar  1 11:31 server-key.pem
drwxr-x--- 2 polkitd input     8192 Mar  1 11:31 sys
drwxr-x--- 2 polkitd input       20 Mar  1 11:43 wp

從上面顯示可以看到wp庫也同步到了mysql-vol數據卷中來了。

2.6創建nginx、php容器

下載鏡像:

[root@ganbing ~]# docker pull richarvey/nginx-php-fpm

運行容器:

先創建一個/app/wwwroot目錄,把這個目錄掛載到容器中的/var/www/html:

[root@ganbing ~]# mkdir /app/wwwroot -p

然後運行容器,以下運行的參數不做解釋了,和上文中運行mysql時的參數差不多:
[root@ganbing ~]# docker run -itd --name lnmp_web --net lnmp -p 80:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
aaea1b4543d34522a9e0d06353f6c65fe858a445c963743ec223bc6a364d0167

查看容器運行是否正常:

[root@ganbing ~]# docker ps -l
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                   NAMES
aaea1b4543d3        richarvey/nginx-php-fpm   "docker-php-entrypoi…"   2 hours ago         Up 2 hours          443/tcp, 0.0.0.0:80->80/tcp, 9000/tcp   lnmp_web

弄個頁面測試一下容器:

先在/app/wwwroot/目錄下生成一個index.html頁面,這個目錄已經掛載到了容器的/var/www/html,所以生成的index.html會同步到容器中:

[root@ganbing /]# echo  "lnmp" > /app/wwwroot/index.html

然後,訪問這臺容器宿主機Ip:
技術分享圖片

2.7下載wordpress博客系統測試

下載至/app/wwwroot目錄下:

[root@ganbing /]# cd /app/wwwroot/
[root@ganbing wwwroot]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
--2018-03-01 13:52:05--  https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
Resolving cn.wordpress.org (cn.wordpress.org)... 198.143.164.252
Connecting to cn.wordpress.org (cn.wordpress.org)|198.143.164.252|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8507412 (8.1M) [application/octet-stream]
Saving to: ‘wordpress-4.7.4-zh_CN.tar.gz’

100%[=========================================================>] 8,507,412   1.08MB/s   in 8.9s   

2018-03-01 13:52:14 (933 KB/s) - ‘wordpress-4.7.4-zh_CN.tar.gz’ saved [8507412/8507412]

[root@ganbing wwwroot]# 

解壓並訪問測試:

[root@ganbing wwwroot]# tar -zxvf wordpress-4.7.4-zh_CN.tar.gz

解壓完了之後用瀏覽器訪問:
http://容器宿主機IP/wordpress
技術分享圖片

配置wordpress博客:

技術分享圖片

數據庫名稱用docker ps可以查看:
技術分享圖片

然後,寫入配置文件進行安裝:
技術分享圖片
從上圖可以看到,需要手工創建wp-config.php文件並將以上信息貼入這個新建的文件中

[root@ganbing wordpress]# vim /app/wwwroot/wordpress/wp-config.php
<?php
/**
 * WordPress基礎配置文件。
 *
 * 這個文件被安裝程序用於自動生成wp-config.php配置文件,
 * 您可以不使用網站,您需要手動復制這個文件,
 * 並重命名為“wp-config.php”,然後填入相關信息。
 *
 * 本文件包含以下配置選項:
 *
 * * MySQL設置
 * * 密鑰
 * * 數據庫表名前綴
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
 *
 * @package WordPress
......
省略部分內容

安裝wordpress:
技術分享圖片

登錄wordpress:
技術分享圖片
技術分享圖片

到此,年輕人的第一個lnmp容器練習就成功搭建完畢了。

3.總結

  • 要熟悉容器、鏡像的概念
  • 要熟悉docker常用的基礎命令docker run、docker ps、docker rm、docker image、docker top、docker network等,由其是docker run中的很多參數要理解
  • 要學會活用--help進行幫助,比如docker run --help
  • 還有就是本文中數據持久化的概念(也就是掛載)要理解,用了兩種掛載方式,一種是數據卷掛載、一種是目錄掛載。數據卷掛載不需要你手動創建數據卷,目錄掛載的前提源掛載目錄你要存在或者你要創建好

docker:搭建年輕人第一個LNMP網站平臺