前言

最近公司准备把现有环境全部搞成容器化,所以笔者就先了解了一下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中,实现自动化构建,动态升级,动态收缩扩容等

docker部署mysql,nginx,php,并上传镜像到私有仓库的更多相关文章

  1. [python](Docker SDK)上传镜像到私有仓库(tls、身份认证)

    (Docker SDK)上传镜像到私有仓库(tls.身份认证) API:https://docker-py.readthedocs.io/en/stable/ 环境:python:3.7.3 配置参数 ...

  2. [Docker]Docker拉取,上传镜像到Harbor仓库

    需求 因为项目的需求,需要制作一个基于tomcat的镜像.那么前提就是,需要有tomcat的基础镜像. 怎么做 我的思路跑偏了,本来以为是需要将tomcat下载下来,然后通过docker命令,让它成为 ...

  3. docker 私有仓库上传镜像,其他docker服务器从私有镜像下载

    <pre name="code" class="cpp">docker:/data# docker ps CONTAINER ID IMAGE CO ...

  4. docker 创建新的镜像到私有仓库

    docker:/data# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd6db4127a9e centos &q ...

  5. 【原创】运维基础之Docker(2)通过docker部署zookeeper nginx tomcat redis kibana/elasticsearch/logstash mysql kafka mesos/marathon

    通过docker可以从头开始构建集群,也可以将现有集群(配置以及数据)平滑的迁移到docker部署: 1 docker部署zookeeper # usermod -G docker zookeeper ...

  6. 2. Docker部署tomcat, nginx, redis,及docker私有仓库

    1. 部署tomcat 1.1 下载tomcat       docker pull tomcat:7-jre8 1.2 部署容器  docker run -di --name=tomcat -p 8 ...

  7. docker(部署常见应用):docker部署mysql

    上节回顾:docker(部署常见应用):docker部署nginx docker部署mysql:5.7.26 # 下载镜像 docker pull mysql: # 查看镜像 docker image ...

  8. springboot多数据源配合docker部署mysql主从实现读写分离

    本篇主要有两部分: 1.使用docker部署mysql主从 实现主从复制 2.springboot项目多数据源配置,实现读写分离 一.使用docker部署mysql主从 实现主从复制 此次使用的是wi ...

  9. Docker 容器更新,打包,上传到阿里云

    上几章讲了镜像的拉取和运行. 这次来尝试如何将已经运行的容器打包,封装成镜像,并且上传到阿里云上,为了别的地方下载和使用更加的方便. 首先,进入镜像,如果不清楚地,可以看下上一章. [root@VM_ ...

随机推荐

  1. elasticsearch集群健康状态查看

    1. 查看ES集群健康状态 http://localhost:9200/_cluster/health?pretty 响应: { "cluster_name" : "if ...

  2. 走进JavaWeb技术世界10:从JavaBean讲到Spring

    Java 帝国之Java bean (上) 转自: 刘欣 码农翻身 2016-05-27 前言: 最近看到到spring 的bean 配置, 突然想到可能很多人不一定知道这个叫bean的东西的来龙去脉 ...

  3. mysql8安装与卸载

    参考: https://www.cnblogs.com/zxwen/p/9448797.html https://blog.csdn.net/weixin_30073553/article/detai ...

  4. log4j.xml简单配置实现在控制台打印sql执行语句【加注释】

    转: log4j.xml简单配置实现在控制台打印sql执行语句 2017年09月27日 13:02:34 艾然丶 阅读数 8804   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协 ...

  5. Qt编写自定义控件53-自定义宽高下拉框

    一.前言 默认的qcombobox控件,如果元素item中的内容过长超过控件本身的宽度的话,会自动切掉变成省略号显示,有些应用场景不希望是省略号显示,希望有多长就显示多长,还有一种应用场景是需要设置下 ...

  6. 利用Python获取cookie的方法,相比java代码简便不少

    1.通过urllib库,是python的标准库,不需要另外引入,直接看代码,注意代码的缩进: # coding=UTF-8import cookielibimport urllib2 class Ry ...

  7. (二)Centos之在VM虚拟机中安装Centos操作系统

    一.下载 阿里云镜像 https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下载那个 DVD版本即可. 二.安装 在安装操作系统之前 我们来给这个“机器”搞 ...

  8. python 函数、参数及参数解构

    函数 数学定义 y=f(x), y是x函数,x是自变量.y=f(x0,x1...xn) Python函数 由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单位 完成一定的功能 函数作 ...

  9. Python3之匿名函数

    当我们在传入函数时,有些时候,不需要显式定义函数.直接传入匿名函数更方便,例如 >>> list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])) [1, ...

  10. demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理

    //durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...