author by dzh 2019-10-31

前言:

起初是身边同事搞过一个个人网站,然后一个意外的情况,知乎推荐了一个专栏("自己拥有一台服务器可以做哪些很酷的事情")给我,然后一发不可收拾,感兴趣的可以去搜搜。

搭建过程很坎坷,因为对linux上搭建环境不熟,一开始也是在网上找教程按照教程走。但是试过多个教程不是这里有问题就是那里有问题,对于一个小白来说,遗漏任何一个步骤都有可能让用户奔溃。经历种种问题后,我决定亲自写一篇教程,就是希望能让小白走进这个大门,而不是在门外来回试探,最终放弃。本文使用lnmp(linux+nginx+mysql+php)的环境,全部采用是docker部署,涉及docker安装,编排部署,nginx配置等,并尽可能的写下每个步骤。(网上很多一键lnmp部署包,或者宝塔面板工具,我也尝试过lnmp集成部署包,但是没有成功,遇到问题也无人指定,最终选择docker,从0开始搭建,提升一下自己。docker作为当前主流虚拟容器,谁用谁知道)

下面开始分享我的服务器创建血泪史(一步一步挖坑填坑形成的这篇教程,总之不易)

好的,不多说,搭建文档如下

1.安装linux(此处选择的是ubuntu),略

2.进入ubuntu命令行,略

3.安装docker

参见官网安装教程见 https://docs.docker.com/install/

3.1.更新apt包索引:

$ sudo apt-get update

3.2.安装软件包以允许apt通过HTTPS使用存储库:

$ sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg-agent \
   software-properties-common

命令中途提示输入y,回车
3.3.添加Docker的官方GPG密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

验证执行结果

$ sudo apt-key fingerprint 0EBFCD88

得到如下信息

 > pub   rsa4096 2017-02-22 [SCEA]
 >       9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
 > uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
 > sub   rsa4096 2017-02-22

3.4.使用以下命令来设置稳定的存储库.

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

3.5.再次更新Update the apt package index.

$ sudo apt-get update

3.6.继续安装DOCKER ENGINE- COMMUNITY。中间提示输入y,回车

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

3.7.通过运行hello-world 映像来验证是否正确安装了Docker Engine-Community.此命令下载测试图像并在容器中运行。容器运行时,它会打印参考消息并退出

$ sudo docker run hello-world

3.8.可以查看docker版本,打印出版本号代表安装成功

$ docker -v

3.9.按照docker官方文档装完, 在/etc/docker/的下面会有deamon.json文件,daemon.json 文件是对 Docker Engine 进行配置,因为docke云服务器很慢,添加国内镜像,更改一下docker镜像仓库
如果没有daemon.json ,可以新建一个拖进去, 内容添加

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

拖进去时可能没有权限, 需要加目录权限

$ sudo chmod 777 /etc/docker 即可,然后就能拖进去了

4.安装docker-compose

官方安装教程见 https://docs.docker.com/compose/install/

4.1.下载Docker Compose的当前稳定版本:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

4.2.将可执行权限应用于二进制文件:

$ sudo chmod +x /usr/local/bin/docker-compose

4.3.测试安装.

$ docker-compose --version

5.构建php镜像

选择带有pdo_mysql的php镜像(pdo_mysql 是PHP用来访问mysql服务的扩展)
可以使用dockerfile文件构建,内容如下(一般选择放在home/用户名/的下面,并需在该路径下执行docker build)
dockerfile文件内容:

#格式:FROM <image>或 FROM <image>:<tag>
FROM php:7.2.3-fpm
#指定维护者的信息
MAINTAINER dingzhenhua
#RUN 每条指令将在当前镜像基础上执行,并提交为新的镜像。(可以用“\”换行)
RUN apt-get update
RUN docker-php-ext-install pdo pdo_mysql

执行如下命令构建并生成自己的镜像 (镜像名称此处为dingzhenhua/php)

$ docker build -t dingzhenhua/php .

注意 上面命令最后有个小点,请带上执行,否则会报错,如下图哦!!!
报错截图

5.1查看生成的镜像

$ sudo docker images

5.2 如果想要运行执行,这里先不执行,后面统一用docker-compose 编排执行

$ docker run -p 192.168.0.105:8080:8080 --name php  dingzhenhua/php

6.启动和运行typecho

6.1在opt目录下新建文件夹app(名称自由取,但下面会用到,需要记住哦),在下面在新建mysqldata和typecho文件夹,放入如下东西

typecho文件夹里放官网下载的typecho程序包

(切换到根目录下 cd / ; 然后再chmod 777权限。删除文件夹rm -rf /root/app 删除app整个文件夹)
- . 这个表示docker-compose.yml当前目录位置开始创建这个文件
6.2.以下放送上面需要的文件内容

docker-compose 文件

version: '2'
services:
  nginx:
    image: nginx:1.13.9-alpine
    ports:
      - "80:80"
    restart: always
    volumes:
      - ./typecho:/app #前面是宿主机的,后面是容器内部的
      - ./nginxTypecho.conf:/etc/nginx/conf.d/default.conf #- . 这个表示docker-compose.yml所在路径
      - logs:/var/log/nginx 
    links:
      - php-fpm
    depends_on:
      - php-fpm
  php-fpm:
    image: dingzhenhua/php
    restart: always
    volumes:
      - ./typecho:/app
    stdin_open: true
    tty: true
    links:
      - db
    depends_on:
      - db
  db:
    image: mysql:5.7.21
    restart: always
    ports:
      - 0.0.0.0:3306:3306 #前面是宿主机的,后面是容器内部的
    volumes:
      - ./mysqldata:/var/lib/mysql  # 挂载数据目录
      #- ./conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf # 把mysql的配置文件映射到容器的相应目录
      - logs:/var/logs/mysql
    env_file:
      - mysql.env
volumes:
  logs:

mysql.env 文件

# MySQL的root用户默认密码,这里自行更改
MYSQL_ROOT_PASSWORD=*****
# MySQL镜像创建时自动创建的数据库名称
MYSQL_DATABASE=typecho
# MySQL镜像创建时自动创建的用户名
MYSQL_USER=typecho
# MySQL镜像创建时自动创建的用户密码
MYSQL_PASSWORD=*****

nginxTypecho.conf 文件

server {
    listen 0.0.0.0:80;
    server_name ***.**; #填写自己的域名
    root /app; #对应的是nginx容器里面的路径
    index index.php;

    access_log  /var/log/nginx/typecho_access.log  main;
    if (!-e $request_filename){
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ .*\.php(\/.*)*$ {
       include        fastcgi_params;
             fastcgi_split_path_info ^(.+?.php)(/.*)$;
       fastcgi_param  PATH_INFO $fastcgi_path_info;
       fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
       fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
       fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
       fastcgi_index  index.php;
    set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                set $real_script_name $1;
                set $path_info $2;
        }


       fastcgi_pass   php-fpm:9000;
    }
}

6.3.在docker-compose.yml所在路径下执行docker-compose up -d 启动运行
6.4.停止 docker-compose stop
6.5.查看 docker ps -a

7.使用ip访问即可(数据库地址写主机的)

FAQ

因为涉及图文较多,这里就省略啦,嫌麻烦,对不住啦,老铁们!
附上链接FAQ