zoukankan      html  css  js  c++  java
  • 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中,实现自动化构建,动态升级,动态收缩扩容等

  • 相关阅读:
    07_Python语法示例(基础语法,文件操作,异常处理)
    练习js——自动化实现12306火车票查询
    【转】app自动化问题点整理
    TouchAction的花式应用——APP九宫格绘制
    【转】web 自动化文件上传不要太简单
    阶段小测试我的作业
    Mac Chrome浏览器取消自动升级
    Mac下安装selenium及Chromedrive驱动
    【转】Jenkins配置Git push后自动构建
    函数使用练习
  • 原文地址:https://www.cnblogs.com/charles1ee/p/11772926.html
Copyright © 2011-2022 走看看