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中,实现自动化构建,动态升级,动态收缩扩容等