zoukankan      html  css  js  c++  java
  • [置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)

    csphere/php-fpm:5.4

    # cd docker-training/php-fpm/
    # ls 
    Dockerfile          nginx_nginx.conf  supervisor_nginx.conf
    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文件

    # cat Dockerfile 
    #
    # MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
    # DOCKER-VERSION    1.6.2
    #
    # Dockerizing php-fpm: Dockerfile for building php-fpm images
    #
    FROM       csphere/centos:7.1
    MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
    
    # Set environment variable
    ENV APP_DIR /app
    
    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 &&  
        yum clean all
    
    ADD nginx_nginx.conf /etc/nginx/nginx.conf
    ADD nginx_default.conf /etc/nginx/conf.d/default.conf
    
    ADD php_www.conf /etc/php-fpm.d/www.conf
    RUN sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php.ini
    
    RUN mkdir -p /app && echo "<?php phpinfo(); ?>" > ${APP_DIR}/info.php
    
    EXPOSE  80 443
    
    ADD supervisor_nginx.conf /etc/supervisor.conf.d/nginx.conf
    ADD supervisor_php-fpm.conf /etc/supervisor.conf.d/php-fpm.conf
    
    ONBUILD ADD . /app
    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 .

    Step 12 : ONBUILD add . /app
     ---> Running in 9e21ede67350
     ---> 7541483a5a76
    Removing intermediate container 9e21ede67350
    Step 13 : ONBUILD run chown -R nginx:nginx /app
     ---> Running in ab55fc7a46a1
     ---> c61699e8c237
    Removing intermediate container ab55fc7a46a1
    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

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

    csphere/mysql:5.5

    cat Dockerfile 
    #
    # MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
    # DOCKER-VERSION    1.6.2
    #
    # Dockerizing Mariadb: Dockerfile for building Mariadb images
    #
    FROM csphere/centos:7.1
    MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
    
    ENV DATA_DIR /var/lib/mysql
    
    # Install Mariadb
    RUN yum install -y mariadb mariadb-server && 
        yum clean all
    
    ADD mysqld_charset.cnf /etc/my.cnf.d/
    
    COPY scripts /scripts
    RUN chmod +x /scripts/start
    
    EXPOSE 3306
    
    VOLUME ["/var/lib/mysql"]
    
    ENTRYPOINT ["/scripts/start"]
    

    命令解析:

    VOLUME ["/var/lib/mysql"]

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

    ENTRYPOINT ["/scripts/start"]

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

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

    # cat start 
    #!/bin/bash
    
    set -e
    
    #
    # When Startup Container script
    #
    
    if [[ -e /scripts/firstrun ]]; then
        # config mariadb
        /scripts/firstrun_maria
            rm /scripts/firstrun
    else
        # Cleanup previous mariadb sockets
        if [[ -e ${DATA_DIR}/mysql.sock ]]; then
            rm -f ${DATA_DIR}/mysql.sock
        fi
    fi
    
    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容器,容器里面的数据都会随着容器被删除而删除

    # docker rm dbserver
    Error response from daemon: Cannot destroy container dbserver: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
    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数据库

    # mysql
    # show databases;
    # create database mydb;
    Query OK, 1 row affected (0.00 sec)
    # show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mydb               |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    # exit
    exit
    

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

    # ls /var/lib/docker/vfs/dir/mydata/
    aria_log.00000001  ibdata1      ib_logfile1  mysql       performance_schema
    aria_log_control   ib_logfile0  mydb         mysql.sock  test
    
    停止docker容器
    # docker stop f49165d5e081
    f49165d5e081
    删除docker容器,查看`mydb`目录是否被删除
    # docker rm f49165d5e081
    f49165d5e081
    # ls /var/lib/docker/vfs/dir/mydata/    验证,挂载docker volume后,容器被删除掉,数据还在
    aria_log.00000001  ibdata1      ib_logfile1  mysql       performance_schema
    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

    # mysql
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mydb               |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    

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

  • 相关阅读:
    在Linux中运行Nancy应用程序
    医疗行业信息化学习资源
    Windows Live Writer 的昨日荣光
    读书笔记:李叔同,说佛(上),为人十训
    使用Expression Tree构建动态LINQ查询
    读书笔记:季羡林关于如何做研究学问的心得
    XML序列化的时候如何支持Namespace
    Kafka Consumer
    Linux环境安装Golang
    Linux 下 zip 文件解压乱码如何解决
  • 原文地址:https://www.cnblogs.com/zhanghaiyang/p/7213314.html
Copyright © 2011-2022 走看看