docker部署mysql,nginx,php,并上传镜像到私有仓库

前言

最近公司准备把现有环境全部搞成容器化,所以笔者就先了解了一下docker,并搞了一搞,并把自己搞的过程记录下来.话不多说直接开干

环境说明

Centos7

Docker version 18.06.3-ce, build d7080c1

Nginx:1.14.1

PHP:7.2.11

Mysql:5.7.20

所有安装过程除php外全是源码安装,php因为扩展问题不得不使用官方镜像在进行二次build

下述Dockerfile所依赖的软件下载:点击这里

docker环境的安装过程我这边就不在累述,下面直接上代码

操作过程

生成mysql的镜像

由于mysql的源码包比较大,仓库上传不上去,请大家自行下载,并按照名字修改对应文件与配置

FROM centos:7

RUN ping -c 1 www.baidu.com
RUN yum remove -y libnuma.so.1
RUN yum install -y vim net-tools cmake numactl bison bison-devel libaio-devel gcc gcc-c++ git  ncurses-devel
RUN groupadd mysql && useradd mysql -g mysql && mkdir /home/mysql/mydata/ && mkdir /home/mysql/mysql_logs  && mkdir /home/mysql/scripts
ADD ./mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz /home/mysql/
RUN chown mysql:mysql -R /home/mysql/ && cd /home/mysql/ &&  \
mv mysql-5.7.20-linux-glibc2.12-x86_64 mysql-5.7
ENV PATH /home/mysql/mysql-5.7/bin:$PATH

COPY ./scripts /home/mysql/scripts/
RUN  /bin/sh /home/mysql/scripts/create_mycnf.sh && rm -rf /home/mysql/scripts/create_mycnf.sh

RUN chown mysql:mysql -R /home/mysql/
RUN /bin/sh /home/mysql/scripts/init_password.sh

USER mysql 

进入当前目录下执行build命令

docker build -t mysql:v1 .

输出内容这边就不做展示了,第一次安装时间会慢一些,如果在执行过程中出现问题,可以检测dockerfile,看命令是否合理

查看生成镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               v1                  0b15859ba617        3 minutes ago       8.33GB
centos              7                   67fa590cfc1c        2 months ago        202MB 

后续操作

创建容器
docker run -dit -p 3306:3306 --name mysql mysql:v1

进入容器执行初始化命令, cd ~ && sh scripts/init_password.sh

修改密码set password=password("");

设置root授权用户并允许远程连接
update user set authentication_string = password('root') where user = 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

 进入scripts目录下执行start.sh脚本启动mysql

后续的操作,配置远程连接等操作,我这边就不在累述,将数据目录挂载到宿主机上只需要创建容器时执行-v即可,将容器里面的目录外挂出来

生成nginx的镜像

FROM centos:7

RUN ping -c 1 www.baidu.com
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib openssl openssl-devel initscripts vim
RUN mkdir -p /data/soft/ &&  mkdir -p /data/logs/nginx/ && mkdir -p /usr/local/cpgroup/nginx
RUN echo "NETWORKING=yes" >/etc/sysconfig/network
ADD nginx-1.14.1.tar.gz /data/soft/
ADD headers-more-nginx-module-0.33.tar.gz /data/soft/

RUN cd /data/soft/nginx-1.14.1 && ./configure --prefix=/usr/local/cpgroup/nginx --http-log-path=/data/logs/logs/nginx/access.log --error-log-path=/data/logs/logs/nginx/error.log --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-http_sub_module --with-http_stub_status_module --http-uwsgi-temp-path=/usr/local/cpgroup/nginx/ --add-module=/data/soft/headers-more-nginx-module-0.33 && make && make install

COPY ./nginx.conf /usr/local/cpgroup/nginx/conf
RUN  mkdir /usr/local/cpgroup/nginx/conf/vhosts


RUN rm -rf /data/soft/nginx-1.14.1

RUN /usr/local/cpgroup/nginx/sbin/nginx.sh start

CMD /bin/sh -c '/usr/local/cpgroup/nginx/sbin/nginx -g "daemon off;"'
EXPOSE 80

 

进入当前目录下执行build命令

docker build -t nginx:v1 .

 

 

安装完nginx后直接安装php,不然在创建容器的时候会报错,因为我们在生成镜像的时候将我们自定义的nginx.conf上传到镜像中,里面已经配置了php,但是php的容器还没有创建所以会报错

生成php的镜像

下述文件在生成镜像的时候扩展了orecal,之前在生成php的镜像时,考虑过用源码自己编译,但是在生成扩展的时候,无法添加,后来在网上查询时了解到

docker for php需要扩展时需使用'docker-php-ext-enable' 来添加扩展,所以我这边为了不那么麻烦,直接FROM 官方的镜像,并添加自己的扩展

FROM php:7.2-fpm

RUN docker-php-source extract \
        # do important things \
        && docker-php-source delete

RUN apt-get update && apt-get -y install \
        libaio-dev \
        unzip \
        vim \
        net-tools \
        inetutils-ping \
        procps

RUN mkdir -p /data/soft/ && mkdir -p /data/logs/php
COPY ./instantclient* /data/soft/
RUN cd /data/soft && unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
RUN unzip -d /usr/lib /data/soft/instantclient-basic-linux.x64-12.2.0.1.0.zip
RUN cp -rf /data/soft/instantclient_12_2/sdk/ /usr/lib/instantclient_12_2/


ENV ORACLE_HOME /usr/lib/instantclient_12_2/
ENV LD_LIBRARY_PATH /usr/lib/instantclient_12_2/
ENV PATH $ORACLE_HOME:$LD_LIBRARY_PATH:$PATH

RUN cd /usr/lib/instantclient_12_2 && ln -s /usr/lib/instantclient_12_2/libclntsh.so.12.1 /usr/lib/instantclient_12_2/libclntsh.so && ln -s /usr/lib/instantclient_12_2/libclntshcore.so.12.1 /usr/lib/instantclient_12_2/libclntshcore.so

RUN echo instantclient,/usr/lib/instantclient_12_2/ |pecl install oci8 && \
docker-php-ext-enable oci8

RUN cd /usr/src/ && \
tar -xvf php.tar.xz && \
cd php-7.2.24/ext/pdo_oci && \
phpize && \
./configure --with-php-config=/usr/local/bin/php-config --with-pdo-oci=instantclient,/usr/lib/instantclient_12_2 && \
make && \
make install
RUN docker-php-ext-enable pdo_oci

RUN mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.d/www.conf
RUN sed -i 's/listen.allowed_clients = 127.0.0.1/;listen.allowed_clients = 127.0.0.1/' /usr/local/etc/php-fpm.d/www.conf
RUN sed -i 's/;access.log = log\/$pool.access.log/access.log=\/data\/logs\/php\/access.log/' /usr/local/etc/php-fpm.d/www.conf

EXPOSE 9000 

我使用的基础镜像是php-7.2-fpm在build之后会将镜像下载到本地,第一次在生成镜像时会很慢,原因是基础镜像的环境为Ubuntu并且在下载软件是使用的源为国外,这个具体怎么换成国内的我搞了半天也没处理好,如果有那个朋友知道请知会一下

创建容器,并指定外挂目录

docker run --name php -dit -v /home/www/:/var/www/html php:v1

启动nginx,并配置php

先启动php-fpm,并指定html文件路径
在启动nginx 使用--link 并指定端口与html文件路径, 路径应与php指定路径一致
docker run --name nginx_php --link php:php -p 80:80 -v /home/www/:/usr/local/cpgroup/nginx/html -dit nginx:v1

测试 

 

 

镜像上传

配置docker本地私有镜像仓库

{
  "insecure-registries":["主机的IP地址或者域名:5000"],
   "registry-mirrors": ["https://registry.docker-cn.com"]
}

下载镜像直接docker pull registry

#启动私有仓库
docker run -d -p 5000:5000 \
    --name=docker_registry \
    --restart=always \
    --privileged=true  \
    -v /data/docker_registry:/var/lib/registry  \
    -v /etc/docker/certs:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
         -e REGISTRY_STORAGE_DELETE_ENABLED=true \
    docker.io/registry

 

标红部分添加https,如果不添加在pull镜像的时候回报错

Error response from daemon: Get https://10.10.10.55/v2/: x509: cannot validate certificate for 10.10.10.55 because it doesn't contain any IP SANs
添加证书
mkdir -p certs && openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 3650 -out certs/domain.crt

Common Name (e.g. server FQDN or YOUR name) []:10.10.10.55:5000
将刚生成的certs/domain.crt复制到/etc/docker/certs.d/10.10.10.55:5000/ca.crt,之后重启docker并运行

如果在拉取私有仓库镜像时报如下错误

报错Error response from daemon: Get https://10.10.10.55:5000/v2/: x509: certificate signed by unknown authority
将要pull的机器上面也要将ca.crt拷贝到相同路径 并创建vim /etc/docker/daemon.json
{
  "insecure-registries": ["10.10.10.55:5000"]
}

结语

  本篇博客到这来就结束了,如果在构建过程中遇到什么问题,可以及时评论,我也会及时给您反馈.

  后续我也会再更一些docker相关的博客,之后会通过jenkins将docker整合到k8s中,实现自动化构建,动态升级,动态收缩扩容等

 

posted @ 2019-11-02 18:17  沧澜猛兽  阅读(1601)  评论(0编辑  收藏  举报