csphere/php-fpm:5.4

  1. # cd docker-training/php-fpm/
  2. # ls
  3. Dockerfile nginx_nginx.conf supervisor_nginx.conf
  4. nginx_default.conf php_www.conf supervisor_php-fpm.conf

各文件解释:

nginx_nginx.conf 替换默认的nginx.conf文件

nginx_default.conf 替换默认的default.conf文件

php_www.conf 修改apache用户为nginx

supervisor_nginx.conf 添加启动nginx的supervisor文件

supervisor_php-fpm.conf 添加启动php-fpm的supervisor文件

  1. # cat Dockerfile
  2. #
  3. # MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
  4. # DOCKER-VERSION 1.6.2
  5. #
  6. # Dockerizing php-fpm: Dockerfile for building php-fpm images
  7. #
  8. FROM csphere/centos:7.1
  9. MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
  10. # Set environment variable
  11. ENV APP_DIR /app
  12. RUN yum -y install nginx php-cli php-mysql php-pear php-ldap php-mbstring php-soap php-dom php-gd php-xmlrpc php-fpm php-mcrypt && \
  13. yum clean all
  14. ADD nginx_nginx.conf /etc/nginx/nginx.conf
  15. ADD nginx_default.conf /etc/nginx/conf.d/default.conf
  16. ADD php_www.conf /etc/php-fpm.d/www.conf
  17. RUN sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php.ini
  18. RUN mkdir -p /app && echo "<?php phpinfo(); ?>" > ${APP_DIR}/info.php
  19. EXPOSE 80 443
  20. ADD supervisor_nginx.conf /etc/supervisor.conf.d/nginx.conf
  21. ADD supervisor_php-fpm.conf /etc/supervisor.conf.d/php-fpm.conf
  22. ONBUILD ADD . /app
  23. ONBUILD RUN chown -R nginx:nginx /app

命令解析:

ONBUILD ADD . /app

ONBUILD 在生成当前docker镜像的时候不生效,在子镜像生效;ONBUILD在产品发布时起着非常重要的作用!举例

A镜像中有ONBUILD指令,在构建A镜像时ONBUILD指令不执行;B镜像FROM
A
,在构建B镜像时ONBUILD指令开始执行;

如何给docker镜像命名:

  • registry-url: registry服务器的域名或者ip
  • namespace:
  • image-name: docker镜像的名字
  • tag: docker镜像的版本号,推荐使用应用服务的版本号来命名,如php-fpm:5.4

生成php-fpm镜像

docker build -t csphere/php-fpm:5.4 .

  1. Step 12 : ONBUILD add . /app
  2. ---> Running in 9e21ede67350
  3. ---> 7541483a5a76
  4. Removing intermediate container 9e21ede67350
  5. Step 13 : ONBUILD run chown -R nginx:nginx /app
  6. ---> Running in ab55fc7a46a1
  7. ---> c61699e8c237
  8. Removing intermediate container ab55fc7a46a1
  9. Successfully built c61699e8c237

生成website容器:

docker run -d -p 8080:80 --name website csphere/php-fpm:5.4da30b15d3518320f4150b20ef329e59432a65610968977277879578b5fd8f4f7

参数解释:

  • -d 后台运行
  • -p 8080:80 将宿主机的8080端口映射到容器的80端口
  • --name website 给容器命名为website
  • csphere/php-fpm:5.4 使用这个镜像镜像创建docker容器

使用浏览器访问:http://your_ip:8080/info.php

如何进入一个正在运行的docker容器?

docker exec -it website /bin/bash

  1. # supervisorctl 查看当前容器中使用supervisor启动了哪些服务
  2. nginx RUNNING pid 9, uptime 0:23:15
  3. php-fpm RUNNING pid 10, uptime 0:23:15

csphere/mysql:5.5

  1. cat Dockerfile
  2. #
  3. # MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
  4. # DOCKER-VERSION 1.6.2
  5. #
  6. # Dockerizing Mariadb: Dockerfile for building Mariadb images
  7. #
  8. FROM csphere/centos:7.1
  9. MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
  10. ENV DATA_DIR /var/lib/mysql
  11. # Install Mariadb
  12. RUN yum install -y mariadb mariadb-server && \
  13. yum clean all
  14. ADD mysqld_charset.cnf /etc/my.cnf.d/
  15. COPY scripts /scripts
  16. RUN chmod +x /scripts/start
  17. EXPOSE 3306
  18. VOLUME ["/var/lib/mysql"]
  19. ENTRYPOINT ["/scripts/start"]

命令解析:

VOLUME ["/var/lib/mysql"]

VOLUME指令,宿主机文件目录和docker容器文件目录做映射

ENTRYPOINT ["/scripts/start"]

ENTRYPOINT在每次启动docker容器时都会被执行,此例,是运行了一个shell脚本"/scripts/start"

每次启动都会运行/scripts/start脚本,脚本内容如下:

  1. # cat start
  2. #!/bin/bash
  3. set -e
  4. #
  5. # When Startup Container script
  6. #
  7. if [[ -e /scripts/firstrun ]]; then
  8. # config mariadb
  9. /scripts/firstrun_maria
  10. rm /scripts/firstrun
  11. else
  12. # Cleanup previous mariadb sockets
  13. if [[ -e ${DATA_DIR}/mysql.sock ]]; then
  14. rm -f ${DATA_DIR}/mysql.sock
  15. fi
  16. fi
  17. exec /usr/bin/mysqld_safe

脚本解析:

  • set -e 脚本中只要有一行有错误,就会中断脚本执行

  • 如果firstrun文件存在,执行firstrun_maria脚本,如果不存在,删除mysql.sock文件,并启动Mariadb

firstrun_maira脚本是初始化Mariadb,以及设置数据库用户和密码,详情内容请自行阅读脚本文件

构建mysql docker镜像

docker build -t csphere/mysql:5.5 .

docker
volume 保证删除容器后,数据不被删除

  • 保存容器中的数据
  • 数据共享

使用方法:

1.在Dockerfile中定义VOLUME["/data"]

2.通过docker run -d -v <host_dir>:<container_dir>

案例:

  1. 创建mysql容器,不挂载docker volume,删除后,数据是否存在
  2. 创建mysql容器,挂载docker volume,删除后,数据是否存在

运行不挂载docker volume的mysql容器

# docker run -d -p 3306:3306 --name dbserver csphere/mysql:5.50a3092395c1e6a84f0ecd5383799f210519c5aefc82cbb7ee2ed1a471fc463f5

删除docker容器,容器里面的数据都会随着容器被删除而删除

  1. # docker rm dbserver
  2. Error response from daemon: Cannot destroy container dbserver: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
  3. Error: failed to remove containers: [dbserver]

参数解释:

  • docker rm 删除状态为“Exited”的docker容器
  • docker rm -f 强制删除docker容器

运行挂载docker volume的mysql容器

docker run -d -p 3306:3306 -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.5f49165d5e081b8bd8af9cb9c0bbbeb6545d45f857c1a852646c105 docker
exec -it f49 /bin/bash

登陆数据库创建mydb数据库

  1. # mysql
  2. # show databases;
  3. # create database mydb;
  4. Query OK, 1 row affected (0.00 sec)
  5. # show databases;
  6. +--------------------+
  7. | Database |
  8. +--------------------+
  9. | information_schema |
  10. | mydb |
  11. | mysql |
  12. | performance_schema |
  13. | test |
  14. +--------------------+
  15. 5 rows in set (0.00 sec)
  16. # exit
  17. exit

查看主机文件目录下,是否已生成mydb数据库目录文件

  1. # ls /var/lib/docker/vfs/dir/mydata/
  2. aria_log.00000001 ibdata1 ib_logfile1 mysql performance_schema
  3. aria_log_control ib_logfile0 mydb mysql.sock test
  1. 停止docker容器
  2. # docker stop f49165d5e081
  3. f49165d5e081
  4. 删除docker容器,查看`mydb`目录是否被删除
  5. # docker rm f49165d5e081
  6. f49165d5e081
  7. # ls /var/lib/docker/vfs/dir/mydata/ 验证,挂载docker volume后,容器被删除掉,数据还在
  8. aria_log.00000001 ibdata1 ib_logfile1 mysql performance_schema
  9. aria_log_control ib_logfile0 mydb mysql.sock test

新创建一个容器,挂载到刚才的数据目录下,是否可以把之前的数据库加载回来

docker run -d -p 3306:3306 --name newdb -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.529418b93d4d4a00a86169c568b6f952e71d25b155d7f6b8012d953022691b2b8

docker exec -it newdb /bin/bash

  1. # mysql
  2. MariaDB [(none)]> show databases;
  3. +--------------------+
  4. | Database |
  5. +--------------------+
  6. | information_schema |
  7. | mydb |
  8. | mysql |
  9. | performance_schema |
  10. | test |
  11. +--------------------+
  12. 5 rows in set (0.00 sec)

验证结果: 只要保证数据在,重新创建一个容器挂载回之前的数据目录,业务即可恢复(容器可随意删除、创建)

[置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)的更多相关文章

  1. [置顶] Netty学习总结(1)——Netty入门介绍

    1.Netty是什么? Netty是一个基于JAVA NIO类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性. 2.使用Netty能够做什么? 开发异步.非阻 ...

  2. [置顶] Docker学习总结(3)——Docker实战之入门以及Dockerfile(三)

    应用镜像 csphere/wordpress:4.2 # cd docker-training/wordpress/ # ls -a . license.txt wp-config-sample.ph ...

  3. [置顶] Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)

    一.Docker是什么? 首先Docker是软件工业上的集装箱技术 回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: 在运输过程中,货物损坏 装卸.运输货物,效率低下 运输手续繁多及运输环 ...

  4. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  5. DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  6. Docker学习总结之docker安装

    Ubuntu安装指南 以下均翻译自Docker官方文档 ,转载请注明:Vikings翻译 Docker 支持多种平台下的安装运行,现在我们选取结合度最高的ubuntu来说明安装过程. 首先需要明确Do ...

  7. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  8. Docker学习笔记之Docker应用于服务化开发

    0x00 概述 上一节里我们谈到了小型的独立项目如何使用 Docker Compose 来搭建程序的运行环境,对于由多人或多部门参与的中大型服务化架构的项目,仅由一个 Docker Compose 项 ...

  9. docker学习1:docker前世今生

    Docker简介 Docker是2013发起的一个项目,早在2013年,Docker自诞生起,就是整个技术界的明星项目,当时我还在上海实习,就在各种技术媒体上看到了Docker的介绍文章,很多技术媒体 ...

随机推荐

  1. CSS display属性学习

    ---恢复内容开始--- http://www.w3school.com.cn/cssref/pr_class_display.asp 所有主流浏览器都支持 display 属性,如IE,Firefo ...

  2. bzoj1025 [SCOI2009]游戏 动态规划

    题目描述 对于一些长度为n的排列,将其作为一个置换,那么可能有一个自置换的次数使其回到1,2,3,...,n的情况.求对于所有能够回到1,2,3..,n的排列,不同的次数共有多少种. 题解来自黄学长 ...

  3. HDU 2253 Longest Common Subsequence Again

    其实这个题我还不会,学长给了一个代码交上去过了,据说用到了一种叫做位压缩的技术,先贴代码吧,以后看懂了再来写 #include <stdio.h> #include <string. ...

  4. 一起talk C栗子吧(第八十一回:C语言实例--进程停止)

    各位看官们,大家好,上一回中咱们说的是进程相互排斥的样例,这一回咱们说的样例是:进程停止.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了怎样创建进程,只是没有介绍停止进 ...

  5. hdu4691 Front compression(后缀数组)

    Front compression Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) ...

  6. json的键为变量而不是字符串时,怎么写?

    看栗子 /* 首先你创建了一个window的属性叫b, 并给它赋值为'cccddd' * 然后你创建了一个对象"a", 声明了一个它的属性叫b, 并且给b赋值为6 * 注意第一行的 ...

  7. POJ 3622 multiset

    思路: 放一个链接 是我太懒了 http://blog.csdn.net/mars_ch/article/details/52835978 嗯她教的我(姑且算是吧) (一通乱搞就出来了-) //By ...

  8. JavaScript 与Document

    JavaScript JavaScript   是脚本语言, 需要有宿主文件,  他的宿主文件是HTML文件. 可以写在head中  body中 和</heml>之后   一般写在< ...

  9. java.beans.PropertyChangeListener

    import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.P ...

  10. ES6学习笔记(六)数组的扩展

    1.扩展运算符 1.1含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // ...