docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

逸兴
逸兴
逸兴
57
文章
25
评论
2020-03-1410:03:452 10275字阅读34分15秒
摘要

在一台ecs上使用docker compose 部署nginx + php + mysql 服务。

最近想在把博客迁移到docker上,本想图省事的看了许多网上的博客,照着做了做,不是少着就是缺那,就重新写了compose.yml , 并把具体步骤整理了下,方便以后使用。

安装环境:

# 在一台初始的 阿里云 ECS 上,未做其他设置
[root mcabana 22:10:12] ~
-- $ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root mcabana 22:10:15] ~
-- $ uname -a
Linux mcabana.node.example 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root mcabana 22:10:18] ~
-- $ docker -v
Docker version 19.03.8, build afacb8b
[root mcabana 22:10:21] ~
-- $ 

安装的版本:nginx 1.7.0,php 7.3.5,mysql 5.7.29

1.0 docker安装

1.0.1 使用yum 仓库直接安装

cd /etc/yum.repos.d/

# yum 安装可以使用阿里yum源,这样安装包下载会很快

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 也可以使用官方源
wget https://download.docker.com/linux/centos/docker-ce.repo

# 然后直接安装即可

yum install -y docker-ce
systemctl start docker
systemctl enable docker

# 查看docker版本

docker --version

/etc/yum.repos.d 
-- $ docker --version 
Docker version 19.03.8, build afacb8b 

1.0.2 docker配置阿里镜像加速

https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hsrkaqbh.mirror.aliyuncs.com"],
  "dns": ["223.6.6.6","223.5.5.5"],
  "data-root": "/data/docker"
}
EOF
# data-root 是设置docker的数据存储目录,可以单独建立一个分区
sudo systemctl daemon-reload
sudo systemctl restart docker

这样可以提升获取docker官方镜像的速度。

1.1 docker compose 安装

Docker Compose 是 docker 的一个命令行工具,可以将多个容器组成项目,来进行创建和运行。
使用 docker-compose,我们可以通过 YAML 文件定义应用程序的各个服务,它可以调用Dockerfile 来构建容器,然后将一组类容器构建成一个项目,然后docker compose 对这个项目进行生命周期管理。
docker compose 由pyhton实现,实际上是调用了docker api 来进行容器管理。
他使用单个命令完成应用的创建和启动,极大的方便了docekr使用。
 
这里使用pip方式安装,pip 可以自动对于版本问题。
# 先安装pip
yum -y install epel-release
yum -y install python-pip
# 检查pip版本
[root mcabana 17:13:11] /etc/yum.repos.d
-- $ pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)




pip install --upgrade pip 

[root mcabana 17:13:11] /etc/yum.repos.d 
-- $ pip --version 
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
# 安装docker compose
pip install docker-compose

查看版本:

docker-compose version

# 出现报错

ImportError: 'module' object has no attribute 'check_specifier'
docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

此时需要升级setuptools

pip install --upgrade setuptools
docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

1.2 docker compose 构建项目

目录结构:

mkdir -p /data/mcabana/{nginx,php,mysql}/{conf,log,data}
-- $ tree /data/mcabana/
/data/mcabana/
├── mysql
│   ├── conf
│   ├── data
│   └── log
├── nginx
│   ├── conf
│   ├── data
│   └── log
└── php
    ├── conf
    ├── data
    └── log

12 directories, 0 files

1.2.1 关于php安装

php需要安装libzip,这个需要单独装,所以先准备 libzip-1.5.2cmake-3.15.7的源码文件。另外php的拓展是通过docker-php-ext-enable 和 pecl安装的, 所以需要更改 php 容器的npm源 sources.list,不然连接ubuntu的官方源,速度极慢。

创建文件目录:

mkdir /data/mcabana/php/build-file
cd /data/mcabana/php/build-file
# 将下载的文件放到这个目录
wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/cmake-3.15.7.tar.gz
wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/sources.list
wget --no-check-certificate https://share.mcabana.com/share/php7.3.5/libzip-1.5.2.tar.gz

准备php的Dockerfile

# 这个dockerfile文件最好先复制到notepad++,然后在复制到服务器,以免出现格式问题。
FROM php:7.3.5-fpm
COPY ./build-file/sources.list /etc/apt/sources.list
COPY ./build-file/libzip-1.5.2.tar.gz /usr/local/src/
COPY ./build-file/cmake-3.15.7.tar.gz /usr/local/src/
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && >/etc/apt/sources.list.d/buster.list
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        libmemcached-dev \
        zlib1g-dev \
        libcurl4-openssl-dev \
        libxml2-dev \
		libmagickwand-dev \
		libmagickcore-dev \
        --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN cd /usr/local/src/ \
	&& tar xvf libzip-1.5.2.tar.gz \
	&& tar xvf cmake-3.15.7.tar.gz \
	&& cd cmake-3.15.7 \
	&& ./bootstrap \
	&& make \
	&& make install \
	&& cd /usr/local/src/libzip-1.5.2 \
	&& mkdir build \
	&& cd build \
	&& cmake .. \
	&& make \
	&& make install

RUN pecl install imagick \
	&& pecl install mcrypt-1.0.2 \
	&& docker-php-ext-enable mcrypt \
	&& docker-php-ext-enable imagick 

RUN docker-php-ext-install -j$(nproc) \
        iconv gettext curl mysqli pdo pdo_mysql zip \
        mbstring bcmath opcache xml simplexml sockets hash soap \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

RUN cd /usr/local/etc/php \
	&& mv php.ini-production php.ini \
	&& echo "extension=mcrypt.so" >>php.ini \
	&& echo "extension=imagick.so" >>php.ini

CMD ["php-fpm", "-F"]

1.3 准备docker compose 文件

# 这里定义的mysql的root密码是123456安装完成后记得改。
[root mcabana 18:08:45] /data/mcabana
-- $ cd /data/mcabana/
[root mcabana 18:08:52] /data/mcabana
-- $ cat docker-compose.yml 
version: "3"

services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-config:/etc/mysql
      - mysql-log:/var/log/mysql
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: www
      MYSQL_PASSWORD: user123
  php:
    hostname: php
    restart: always
    container_name: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - "9000:9000"
    links:
      - mysql:mysql
    volumes:
      - nginx-html:/var/www/html
      - php-config:/usr/local/etc
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      - "php:php"
    volumes:
      - nginx-config:/etc/nginx
      - nginx-log:/var/log/nginx
      - nginx-html:/usr/share/nginx/html

volumes:
  mysql-config:
  mysql-log:
  mysql-data:
  nginx-html:
  php-config:
  nginx-config:
  nginx-log:
# 现在的目录结构是这样的
[root mcabana 18:10:24] /data/mcabana
-- $ pwd
/data/mcabana
[root mcabana 18:10:25] /data/mcabana
-- $ tree
.
├── docker-compose.yml
├── mysql
│   ├── conf
│   ├── data
│   └── log
├── nginx
│   ├── conf
│   ├── data
│   └── log
└── php
    ├── build-file
    │   ├── cmake-3.15.7.tar.gz
    │   ├── libzip-1.5.2.tar.gz
    │   └── sources.list
    ├── conf
    ├── data
    ├── Dockerfile
    └── log

13 directories, 5 files
[root mcabana 18:10:26] /data/mcabana

1.4 运行docker compose

[root mcabana 18:11:49] /data/mcabana
-- $ cd /data/mcabana/
[root mcabana 18:11:53] /data/mcabana
-- $ docker-compose up

# 已经在下载镜像了

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

其中安装php中,需要编译安装插件,会比较慢!!!

2.0 项目结构

安装完成后,输入docker ps, 可以看到运行了三个容器 php,nginx,mysql

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

可以通过docker exec -it php bash 分别进行登录。

2.0.1 关于数据持久化

这次的安装,使用的是docker volume,将容器内的目录映射成了一个个卷组,在docker官方的介绍中volume的方式是优于 bind mount  。volume如下:

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

如果要查看卷具体信息可使用:

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

这种卷组使用的本地文件存储,此外开可以使用nfs,tmpfs,进行挂载。

创建volume时并没有指定宿主机路径,为了方便使用可以建立一些软连接

# nginx 配置文件
rm -rf /data/mcabana/nginx/data
ln -s /data/docker/volumes/mcabana_nginx-html/_data /data/mcabana/nginx/data
[root mcabana 20:41:24] /var/lib
-- $ ll /data/mcabana/nginx/data/
total 8
-rw-r--r-- 1 root root 494 May 21  2019 50x.html
-rw-r--r-- 1 root root 612 May 21  2019 index.html
[root mcabana 20:41:32] 

# nginx 日志文件
rm -rf /data/mcabana/nginx/log
ln -s /data/docker/volumes/mcabana_nginx-log/_data /data/mcabana/nginx/log
[root mcabana 20:45:01] /var/lib
-- $ ll /data/mcabana/nginx/log/
total 0
lrwxrwxrwx 1 root root 11 Jun 11  2019 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jun 11  2019 error.log -> /dev/stderr
[root mcabana 20:45:12]

# nignx 配置文件
rm -rf /data/mcabana/nginx/conf
ln -s /data/docker/volumes/mcabana_nginx-config/_data /data/mcabana/nginx/conf
[root mcabana 20:46:35] /var/lib
-- $ ll /data/mcabana/nginx/conf/
total 40
drwxr-xr-x 2 root root 4096 Mar 21 20:23 conf.d
-rw-r--r-- 1 root root 1007 May 21  2019 fastcgi_params
-rw-r--r-- 1 root root 2837 May 21  2019 koi-utf
-rw-r--r-- 1 root root 2223 May 21  2019 koi-win
-rw-r--r-- 1 root root 5231 May 21  2019 mime.types
lrwxrwxrwx 1 root root   22 May 21  2019 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  643 May 21  2019 nginx.conf
-rw-r--r-- 1 root root  636 May 21  2019 scgi_params
-rw-r--r-- 1 root root  664 May 21  2019 uwsgi_params
-rw-r--r-- 1 root root 3610 May 21  2019 win-utf
[root mcabana 20:46:45] 
# php 配置文件
rm -rf /data/mcabana/php/conf
ln -s /data/docker/volumes/mcabana_php-config/_data /data/mcabana/php/conf
[root mcabana 21:20:07] /var/lib
-- $ ll /data/mcabana/php/conf/
total 28
-rw-r--r-- 1 root ftp 1195 May  8  2019 pear.conf
drwxr-sr-x 3 root ftp 4096 Mar 21 20:23 php
-rw-r--r-- 1 root ftp 5346 May  8  2019 php-fpm.conf
-rw-r--r-- 1 root ftp 5351 May  8  2019 php-fpm.conf.default
drwxr-sr-x 2 root ftp 4096 Mar 21 20:23 php-fpm.d
[root mcabana 21:20:10] 
# mysql 配置文件
rm -rf /data/mcabana/mysql/*
ln -s /data/docker/volumes/mcabana_mysql-config/_data /data/mcabana/mysql/conf
ln -s /data/docker/volumes/mcabana_mysql-data/_data /data/mcabana/mysql/data
ln -s /data/docker/volumes/mcabana_mysql-log/_data /data/mcabana/mysql/log
[root mcabana 21:22:21] /var/lib
-- $ ll /data/mcabana/mysql/
total 0
lrwxrwxrwx 1 root root 47 Mar 21 21:21 conf -> /data/docker/volumes/mcabana_mysql-config/_data
lrwxrwxrwx 1 root root 45 Mar 21 21:22 data -> /data/docker/volumes/mcabana_mysql-data/_data
lrwxrwxrwx 1 root root 44 Mar 21 21:22 log -> /data/docker/volumes/mcabana_mysql-log/_data
[root mcabana 21:22:30] 

安装完成后,就是进行测试了~

3.0 结果测试

3.0.1 nignx 测试

检查服务器安全组,防火墙,放行80 , 443 端口,然后浏览器访问80端口

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

3.0.2 测试php

首先要改下nginx配置文件,添加上php的转发

# 删除默认配置文件
rm -f /data/mcabana/nginx/conf/conf.d/default.conf

vi /data/mcabana/nginx/conf/conf.d/www.conf 
# 写入内容
server {
    listen       80;

    client_max_body_size 20m;

    location / {
        root   /usr/share/nginx/html/www/;
        index  index.php index.html;
    }

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

        
    location ~ \.php$ {
        root          /var/www/html/;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}


# 测试下添加的文件语法是否正确
docker exec -it nginx nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# 如果没问题,就reload配置
docker exec -it nginx nginx -s reload
2020/03/21 13:28:44 [notice] 17#17: signal process started

写一个php测试文件

[root mcabana 21:33:40] /var/lib
-- $ cat /data/mcabana/nginx/data/test_php.php
<?php phpinfo(); ?>

# 添加执行权限
[root mcabana 21:33:49] 
-- $ chmod +x /data/mcabana/nginx/data/test_php.php

浏览器访问IP/test_php.php

docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

出现这个php info 页面,nignx 连接 php 就算基本成功了。

3.0.3 测试php 连接 mysql

# 写一个php 连接mysql的脚本,放到网站目录下
vi /data/mcabana/nginx/data/test_mysql.php
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
 
// 创建连接
$conn = new mysqli($servername, $username, $password);
  
// 检测连接
if ($conn->connect_error) {
	die("连接失败: " . $conn->connect_error);
} 
    echo "连接成功";
?>

chmod +x  /data/mcabana/nginx/data/test_mysql.php
docker-compose 部署nginx1.7 + php7.3.5 + MySQL5.7

至此,nignx 连接 php mysql 就基本完成了,要删除 测试文件

rm -f /data/mcabana/nginx/data/test_*

3.1 修改容器时区

这里用的官方镜像中的时区需要改为上海时区,不然会导致日志中的时间慢八个小时

[root mcabana 22:02:57] ~
-- $ docker exec -it nginx bash 
root@nginx:/# echo 'Asia/Shanghai' > /etc/timezone
root@nginx:/# cat /etc/timezone
Asia/Shanghai
root@nginx:/# exit
exit

[root mcabana 22:06:00] ~
-- $ docker exec -it mysql bash 
root@mysql:/# echo 'Asia/Shanghai' > /etc/timezone
root@mysql:/# cat /etc/timezone
Asia/Shanghai
root@mysql:/# exit
exit

# php 的时区在Dockerfile中已经更改了,这里不需要修改。

3.2 关于php-fpm 7.3.5 镜像中的npm源修改问题

在官方镜像中默认使用的是debian的官方源,在国内连接速度极慢,通常做法就是修改为国内源比如 阿里源,清华源。

看了许多网上的文章,基本上都是修改 /etc/apt/sources.list 文件,将里面的debian替换掉,这种做法其实并不全面,我试验了几次,还是会连接debian官方源,原因在于/etc/apt/sources.list.d/ 这个目录下还有一个 buster.list 文件,里面记录的也是debian源,在执行 apt-get update 时,容器还是会读取这个文件,并且连接。

我平常并不使用apt也不清楚为什么会这样,总之清空或替换 /etc/apt/sources.list.d/ buster.list 文件后,就不会有干扰了。

4.0 使用脚本管理

为了方便使用,用shell脚本来控制docker-compose的启停。

为了分类管理,脚本放到这里了

简单控制docker-compose启停




https://www.hugbg.com/archives/1482.html
逸兴
  • 本文由 发表于 2020-03-1410:03:45
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
自动更新SSL证书 默认分类

自动更新SSL证书

现在免费的SSL证书只有三个月有效期,有一个博客和图床都用的ssl证书到期需要重新签发,挺麻烦的。原本想着写个脚本通过阿里云的 OpenAPI 进行证书的签发和部署,但是偶然发现了 ACME 这个项目...
推导式、生成式与生成器 基础语法

推导式、生成式与生成器

推导式 概述 Python中的推导式是一种快速、简洁的数据结构创建方式,不需要手动创建数据结构中的每一个元素,类似于给出一个规律,python会根据这个规律自动填充数据结构。支持有列表推导式、字典推导...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  2   博主  0
    • root root

      数星星的孩子,是在和夜晚的星空交谈,而不是为了得到一个数字。 —来自网络

      • root root

        如果不能忠于自己的心,胜负又有什么价值呢? —塔希里亚故事集