zoukankan      html  css  js  c++  java
  • Docker进阶之九:Dockerfile 及 通过Dockerfile搭建lnmp

    一.Dockerfile指令

    指令

    描述

    指令

    描述

    FROM

    构建的新镜像是基于哪个镜像 例如:FROM centos:6

    COPY

    拷贝文件或目录到镜像,用法同上例如:COPY ./start.sh /start.sh

    MAINTAINER

    镜像维护者姓名或邮箱地址 例如:MAINTAINER fruit

    ENTRYPOINT

    ENTRYPOINT的格式和RUN指令格式一样,分为exec格式和shell格式。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时 也可以替代,不过比CMD要略显繁琐,需要通过docker run的参数–entrypoint来指定。 当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。

    运行容器时执行的Shell命令
    例如:
    ENTRYPOINT [“/bin/bash", “-c", “/start.sh"] ENTRYPOINT /bin/bash -c ‘/start.sh’

    RUN

    构建镜像时运行的Shell命令
    例如:
    RUN [“yum”, “install”, “httpd”] (exec执行形式)

    RUN yum install httpd. (shell形式,该命令在shell中运行,默认情况下/bin/sh -c在Linux中运行)

    VOLUME

    指定容器挂载点到宿主机自动生成的目录或其他容器 例如:
    VOLUME ["/var/lib/mysql"]

    CMD

    CMD的主要是为一个正运行的容器提供默认执行命令。

    如果存在多个CMD指令,那么只有最后一个会被执行。如果在容器运行时指定了命令,则CMD指定的默认内容会被替代。

    通常在最后,启动一个前台服务保证服务可持续运行

    运行容器时执行的Shell命令 例如:
    CMD [“-c”, “/start.sh”]

    CMD ["/usr/sbin/sshd", "-D"]

    CMD /usr/sbin/sshd D

    USER

    RUNCMDENTRYPOINT执行命令指定运行用户 USER <user>[:<group>] or USER <UID>[:<GID>] 例如:USER fruit

    EXPOSE

    声明容器运行的服务端口 例如:EXPOSE 80 443

    WORKDIR

    RUNCMDENTRYPOINTCOPYADD设置工作目录 例如:WORKDIR /data

    ENV

    设置容器内环境变量
    例如:ENV MYSQL_ROOT_PASSWORD 123456

    HEALTHCHECK

    健康检查
    HEALTHCHECK --interval=5m --timeout=3s --retries=3

    CMD curl -f http://localhost/ || exit 1

    ADD

    拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压

    ADD <src>... <dest>
    ADD [“<src>”,... “<dest>”]
    ADD https://xxx.com/html.tar.gz /var/www/html

    ADD html.tar.gz /var/www/html

    ARG

    在构建镜像时指定一些参数 例如:
    FROM centos:6
    ARG user # ARG user=root

    USER $user

    # docker build --build-arg user=fruit Dockerfile .

    
    

    二.Build镜像命令  

    Usage: docker image build [OPTIONS] PATH | URL | - Options:
      -t, --tag list # 镜像名称
      -f, --file string # 指定Dockerfile文件位置

    示例:
      docker build .
      docker build -t shykes/myapp .
      docker build -t shykes/myapp -f /path/Dockerfile /path

      ##从网络中构建

      docker build -t shykes/myapp http://www.example.com/Dockerfile.    

    三.构建PHP网站环境镜像(切记安装目录中存在php-5.6.31.tar.gz,php.ini)

    FROM centos:7
    MAINTAINER www.fruit.com
    RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
    ADD php-5.6.31.tar.gz /tmp/

    RUN cd /tmp/php-5.6.31 &&
        ./configure --prefix=/usr/local/php
        --with-config-file-path=/usr/local/php/etc
        --with-mysql --with-mysqli
        --with-openssl --with-zlib --with-curl --with-gd
        --with-jpeg-dir --with-png-dir --with-iconv
        --enable-fpm --enable-zip --enable-mbstring &&
        make -j 4 &&
        make install &&
        cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf &&
        sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf &&
        sed -i "21a daemonize = no" /usr/local/php/etc/php-fpm.conf
    COPY php.ini /usr/local/php/etc

    RUN rm -rf /tmp/php-5.6.31* && yum clean all

    WORKDIR /usr/local/php
    EXPOSE 9000
    CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]

    四.构建nginx环境镜像(切记下载依赖包)

    ----Dockerfile----

    FROM centos:7
    MAINTAINER www.xubl.com
    RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
    ADD nginx-1.12.1.tar.gz /tmp

    RUN cd /tmp/nginx-1.12.1 &&
        ./configure --prefix=/usr/local/nginx &&
        make -j 2 &&
        make install

    RUN rm -rf /tmp/nginx-1.12.1* && yum clean all

    COPY nginx.conf /usr/local/nginx/conf

    WORKDIR /usr/local/nginx
    EXPOSE 80
    CMD ["./sbin/nginx", "-g", "daemon off;"]

    ----nginx.conf----

    user  root;
    worker_processes  auto;

    error_log  logs/error.log  info;

    pid        logs/nginx.pid;


    events {
        use epoll;
    }

    http {

        include       mime.types;
        default_type  application/octet-stream;

        log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log logs/access.log main;
        sendfile        on;
        keepalive_timeout  65;

        server {
            listen 80;
            server_name localhost;
            root html;
            index index.html index.php;

            location ~ .php$ {
                root html;
                fastcgi_pass lnmp_php:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
            }
        }
    }

    # docker image build -t nginx:v1 -f Dockerfile .

    五.部署lnmp

    1、自定义网络
    docker network create lnmp
    

    2、创建PHP容器

    # docker run -itd --name lnmp_php --net lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html php:v1
    

    3、创建Nginx容器

    # docker run -itd --name lnmp_nginx --net lnmp -p 888:80 --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html nginx:v1

    4、创建MySQL容器(如果之前存在lnmp_mysql可不执行)

    # docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8

     
      
    测试是否部署成功:
    echo "<?php phpinfo();?>"  > /app/wwwroot/index.php
    http://192.168.2.73:888/
    http://192.168.2.73:88/wordpress

    六.构建JAVA网站环境镜像

    FROM centos:7
    MAINTAINER www.xubl.com

    ADD jdk-8u45-linux-x64.tar.gz /usr/local
    ENV JAVA_HOME /usr/local/jdk1.8.0_45

    ADD apache-tomcat-8.0.46.tar.gz /usr/local
    COPY server.xml /usr/local/apache-tomcat-8.0.46/conf

    WORKDIR /usr/local/apache-tomcat-8.0.46
    EXPOSE 8080
    ENTRYPOINT ["./bin/catalina.sh", "run"]

    创建容器:

    mkdir -p /app/webapps/

    docker run -itd --name=tomcat -p 8080:8080 --mount type=bind,src=/app/webapps/,dst=/usr/local/apache-tomcat-8.0.46/webapps  tomcat:v1

    mkdir -p /app/webapps/ROOT/

    vim /app/webapps/ROOT/index.html

    hello

    http://192.168.2.73:8080/

    七.书写Dockerfile总结

      1.先创建一个基础系统镜像,然后exec进入到容器内,再把无问题的部署命令复制到dockerfile中

          2.不经常修改的文件打包到镜像中,经常改变的配置文件可以用type=bind方式每次只要修改宿主机文件或者nfs文件即可.

    备注:依赖包下载地址

    tomcat 链接:https://pan.baidu.com/s/1jkC8VoGODK_1JaZKpcc8aw  密码:ndj2

    nginx  链接:https://pan.baidu.com/s/1hCPMigLSCuoJpRzCa3bq7w  密码:4le2

    pph 链接:https://pan.baidu.com/s/1sRv7azcx5rAnuk5zZZyPzA  密码:5ffk

  • 相关阅读:
    axis2的wsdl无法使用eclipse axis1插件来生成client--解决方法
    引用的存在价值
    阿里亲心小号实測
    UVA 1328
    XMPP 协议工作流程具体解释
    10g异机恢复后EM无法启动故障处理一例
    JVM 内存
    abstract class和interface有什么区别?
    ArrayList 如何增加大小
    IndexOutOfBoundsException ArrayList 访问越界
  • 原文地址:https://www.cnblogs.com/521football/p/10490604.html
Copyright © 2011-2022 走看看