zoukankan      html  css  js  c++  java
  • 05_Dockerfile实战(上)

    在上一章我们介绍了docker镜像的概念,并且介绍了构建镜像的两种方式

    1. 使用docker commit命令提交创建的容器。
    2. 使用Dockerfile文件和docker build命令,这种更为推荐和常见的方式构建docker镜像。

    Dockerfile

    • 官方仓库虽然有数十万的镜像资源,但在绝大多数情况下都不符合我们的需求,通常我们都会自己构建镜像。Dockfile 是一种被 Docker 程序解释的脚本, Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的Linux命令。Docker 程序将读取 Dockerfile,根据指令生成定制的 image。
    • 每一条指令就相当于给镜像加了一层,一共127层,务必惜字如金。
    • 常用命令如下:
    options describe
    FROM 基于哪个镜像构建新镜像
    LABEL maintainer 镜像维护者信息
    RUN 构建镜像时运行的Shell命令
    COPY 拷贝文件或目录到镜像中
    CMD 运行容器时执行,如果有多个CMD指令,最后一个生效
    ENTRYPOINT 运行容器时执行,如果有多个CMD指令,最后一个生效。可单独使用,也可与CMD配合使用
    USER 为RUN、CMD、ENTRYPOINT执行指令指定运行用户
    EXPOSE 声明容器运行的服务端口
    WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
    VOLUME 指定挂载点,使容器中的一个目录具有持久化存储数据的功能
    ENV 设置环境变量

    注意的是:

    1. 一次 RUN 指令形成新的一层,进程让shell命令都写在一行,减少镜像层,一个镜像是不能超过 127 层的,在使用 RUN 指令时,可以在每条 shell 命令的结尾用转义换行 ""。
    2. 一次 RUN 形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减少镜像大小。比如 yum 之后,清一下缓存。

    一、构建部署Nginx

    $ tree web/
    web/
    ├── base
    │?? └── Dockerfile_nginx
    └── project
        ├── Dockerfile_nginx
        └── nginx.conf
    
    • base文件夹下的Dockerfile_nginx如下:(构建通用的nginx镜像)
    FROM centos:latest
    LABEL maintainer="jhzhang <zhangjiahao123456@163.com>"
    RUN yum install -y gcc gcc-c++ make 
        openssl-devel pcre-devel gd-devel libxslt-devel 
        iproute net-tools telnet wget curl && 
        yum clean all && 
        rm -rf /var/cache/yum/*
     
    RUN wget http://nginx.org/download/nginx-1.14.0.tar.gz && 
        tar -zxf nginx-1.14.0.tar.gz && 
        cd nginx-1.14.0 && 
        ./configure --prefix=/usr/local/nginx 
        --with-http_ssl_module 
        --with-http_v2_module 
        --with-http_realip_module 
        --with-http_image_filter_module 
        --with-http_gunzip_module 
        --with-http_gzip_static_module 
        --with-http_secure_link_module 
        --with-http_stub_status_module 
        --with-stream 
        --with-stream_ssl_module && 
        make -j $(grep processor /proc/cpuinfo | wc -l) && make install && 
        cd / && rm -rf nginx-1.14.0*
     
    ENV PATH $PATH:/usr/local/nginx/sbin
    WORKDIR /usr/local/nginx
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
    • 构建镜像
    docker build -t nginx1.14 -f Dockerfile_nginx ./
    
    • 进入项目project文件夹
      project文件夹下的nginx.conf如下:(构建通用的nginx镜像)
    user  nobody;
    worker_processes  1;
    error_log  logs/error.log  info;
    events {
        worker_connections  4096;
    }
    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"';
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            charset utf-8;
            access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
            }
     
        }
    }
    

    project文件夹下的Dockerfile_nginx如下:(构建通用的nginx镜像)

    FROM nginx1.14
    COPY nginx.conf /usr/local/nginx/conf/
    
    • 构建项目镜像
      docker build -t nginx:v1 -f Dockerfile_nginx ./
    • 启动容器
    docker network create web
    docker volume create wwwroot
    docker container run -d --name web_nginx -p 88:80 --network lnmp -v wwwroot:/usr/local/nginx/html nginx:v1 
    
    • 浏览器访问127.0.0.1:80

    二、构建部署Tomcat

    • Java 程序依赖于 JDK 环境,我们可以把 JDK 放在宿主机上,容器以挂载形式使用,减少镜像大小及提高性能。
    tar -zxf jdk-8u91-linux-x64.tar.gz
    sudo mv jdk1.8.0_91/ /usr/local/jdk1.8
    
    • 文件结构
    tree java/
    java/
    ├── apache-tomcat-8.5.16.tar.gz
    └── Dockerfile
    0 directories, 2 files
    
    • java文件夹下的Dockerfile内容
    FROM centos:latest
    LABEL maintainer="jhzhang <zhangjiahao123456@163.com>"
     
    ENV VERSION=8.5.35
    ENV JAVA_HOME=/usr/local/jdk
     
    RUN yum install wget curl unzip iproute net-tools glibc.i686 -y && 
        yum clean all && 
        rm -rf /var/cache/yum/*
     
    COPY . /
     
    RUN tar zxf apache-tomcat-${VERSION}.tar.gz && 
        mv apache-tomcat-${VERSION} /usr/local/tomcat && 
        rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && 
        mkdir /usr/local/tomcat/webapps/ROOT && 
        echo '<h1>Hello,Tomcat!</h1>' > /usr/local/tomcat/webapps/ROOT/status.html && 
        sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && 
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
     
    ENV PATH $PATH:/usr/local/tomcat/bin
    ENV PATH $PATH:/usr/local/jdk/bin
    WORKDIR /usr/local/tomcat
    EXPOSE 8080
    CMD ["catalina.sh", "run"]
    
    • 构建镜像
      $ docker build -t tomcat8:latest ./
    • 启动容器
      docker container run -d --name tomcat_srv -p 89:8080 -v /usr/local/jdk1.8/:/usr/local/jdk tomcat8:latest
    • 浏览器打开127.0.0.1:89/status.html

    参考

    Docker之镜像管理及Dockerfile
    Dockerfile命令详解(超全版本)
    使用Dockerfile搭建jdk、tomcat运行环境

  • 相关阅读:
    python 中 time 模块 格式化 format
    python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
    Quick-lua3.3之listview
    健身计划表
    quick-cocos2d-x 实现在lua里面完成android支付宝的接入
    lua table 排序--满足多条件排序
    lua 操作中文字符串之截取和长度竖排显示
    ClippingNode实现新手引导高亮裁切
    quick cocos2dx lua 内存释放
    cocos2d-x的lua脚本加载CocostudioUI两种方式
  • 原文地址:https://www.cnblogs.com/jarl/p/10105836.html
Copyright © 2011-2022 走看看