• Docker的镜像制作与整套项目一键打包部署


    Dockerfile常用指令介绍

    指令 描述
    FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
    MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
    RUN 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"]
      或者RUN yum install httpd
    CMD 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"]
      或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
    EXPOSE 声明容器运行的服务端口。例如:EXPOSE 80 443
    ENV 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
    ADD 拷贝文件或目录到镜像(可以自动解压缩或者下载)
      例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html
      或者:ADD html.tar.gz /var/www/html
    COPY 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
    ENTRYPOINT 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]
      或者ENTRYPOINT /bin/bash -c "/start.sh"
    VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
      例如:VOLUME ["/var/lib/mysql"]
    USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户
      例如:USER Mr_chen
    WORKDIR 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
      例如:WORKDIR /data
    HEALTHCHECK 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
      CMD curl -f http://localhost/ || exit 1
    ARG 在构建镜像时指定一些参数。例如:ARG user

    利用Dockerfile编写简单的nginxWeb镜像

    复制代码

    #首先开启ipv4转发
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
    sysctl -p
    net.ipv4.ip_forward = 1
    
    #创建nginx的镜像目录
    mkdir -p dockerfile/lib/centos/nginx
    cd dockerfile/lib/centos/nginx
    
    #准备Dockerfile文件
    vim Dockerfile
    FROM centos:7       #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载)
    MAINTAINER wk       #镜像制作人     
    RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel      #构建镜像时运行shell命令,yum安装nginx的依赖包
    ADD nginx-1.12.1.tar.gz /tmp          #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
    RUN cd /tmp/nginx-1.12.1 &&          #运行shell命令编译安装nginx,make -j 给与2个线程编译 
        ./configure --prefix=/usr/local/nginx && 
        make -j 2 && 
        make install
    RUN rm -rf /tmp/nginx-1.12.1* && yum clean all      #删除nginx源码包和清空yum缓存,使容器最轻量化
    COPY nginx.conf /usr/local/nginx/conf                   #拷贝文件或目录到镜像 
    WORKDIR /usr/local/nginx                   #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
    EXPOSE 80                            #声明容器的端口号
    CMD ["./sbin/nginx", "-g", "daemon off;"]         #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx
    
    #将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
    ls
    Dockerfile  nginx-1.12.1.tar.gz  nginx.conf
    
    #build基于nginx的docker镜像
    docker build -t nginx:1 .

    复制代码

    复制代码

    #nginx主配置文件
    cat conf/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;       #lnmp_ph为php容器主机名,对应的就是php的IP地址 
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
                include fastcgi_params;
            }
        }
    }

    复制代码

    构建PHP网站平台镜像

    复制代码

    #创建php的镜像目录
    mkdir -p /root/dockerfile/lib/centos/php
    cd /root/dockerfile/lib/centos/php
    
    #准备Dockerfile文件
    vim Dockerfile 
    FROM centos:7                 #新镜像基于centos7镜像
    MAINTAINER wk               #新镜像制作人
    RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel      #运行shell安装依赖
    ADD php-5.6.31.tar.gz /tmp/        #将安装包考到 /tmp下并自动解压缩
    
    RUN cd /tmp/php-5.6.31 &&         #编译安装php,复制php启动文件.并修改启动文件的配置
        ./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        #将php主配置文件拷贝进去
    
    RUN rm -rf /tmp/php-5.6.31* && yum clean all    #删除不用的文件,清空yum缓存使容器最轻量化
    
    WORKDIR /usr/local/php        #进入容器的位置,也是php程序的位置
    EXPOSE 9000               #开启端口9000
    CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]    #开启php -c 指定主配置文件
    
    #将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
    ls
    Dockerfile  php-5.6.31.tar.gz  php.ini
    
    #build基于php的docker镜像
    docker build -t php:1 .

    复制代码

    创建nginx-php网络环境,并启动容器

    复制代码

    #创建一个叫做lnmp的网络
    docker network create lnmp
    dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385
    
    docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    0604a9338e1b        bridge              bridge              local
    b68e9da0b1e6        host                host                local
    dad428646d8f        lnmp                bridge              local
    cf4b2d0b4394        none                null                local
    
    #创建nginx-php网页挂载目录
    mkdir -p /www
    
    #启动php容器
    docker run -dit --name lnmp-php --net lnmp --mount type=bind,src=/www,dst=/usr/local/nginx/html php:1
    5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151
    
    #启动nginx容器
    docker run -dit --name lnmp-nginx --net lnmp -p 8888:80 --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:1
    7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8
    
    docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   16 seconds ago      Up 15 seconds       0.0.0.0:8888->80/tcp   lnmp-nginx
    5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   6 minutes ago       Up 6 minutes        9000/tcp               lnmp-php
    
    #创建测试页面php.info
    echo "<?php phpinfo();?>" > /www/index.php

    复制代码

    通过浏览器进行访问测试

     

    构建JAVA网站环境镜像

    复制代码

    #创建java镜像构建存储目录
    mkdir -p dockerfile/lib/centos/tomcat
    cd dockerfile/lib/centos/tomcat
    
    #将所需软件包拷贝到当前目录下
    ls
    apache-tomcat-8.0.46.tar.gz  Dockerfile  jdk-8u45-linux-x64.tar.gz  server.xml
    
    #筹备Dockerfile
    vim Dockerfile
    FROM centos:7           
    MAINTAINER wk
    
    ADD jdk-8u45-linux-x64.tar.gz /usr/local        #创建javaJDK环境
    ENV JAVA_HOME /usr/local/jdk1.8.0_45       #强行生成一个环境变量
    
    ADD apache-tomcat-8.0.46.tar.gz /usr/local    #解压tomcat
    COPY server.xml /usr/local/apache-tomcat-8.0.46/conf   #复制配置文件
    
    RUN rm -f /usr/local/*.tar.gz            #删除安装包 容器轻量化
    
    WORKDIR /usr/local/apache-tomcat-8.0.46      #工作目录  进入容器所在的目录
    EXPOSE 8080                       #映射端口
    ENTRYPOINT ["./bin/catalina.sh", "run"]      #用catalina。sh run前台启动tomcat
    
    #build基于tomcat的镜像
    docker build -t tomcat:1 .
    
    #创建网页挂载目录
    mkdir -p /app
    
    #启动tomcat的容器进程
    docker run -dit --name=tomcat -p 8080:8080 --network lnmp --mount type=bind,src=/app/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1
    
    docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    15eca19688ca        tomcat:1            "./bin/catalina.sh r…"   17 seconds ago      Up 16 seconds       0.0.0.0:8080->8080/tcp   tomcat
    7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   2 hours ago         Up About an hour    0.0.0.0:8888->80/tcp     lnmp-nginx
    5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   2 hours ago         Up About an hour    9000/tcp                 lnmp_php
    
    #创建网站测试页
    mkdir /app/ROOT
    vim /app/ROOT/index.html 
    ddddddddddddddddddd

    复制代码

    整套项目一键打包部署

    Docker Compose用法

    Compose是一个定义和管理多容器的工具,使用Python语言编写。使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像,数据卷,网络,映射端口等;然后一条命令管理所有服务,比如启动,停止,重启等

    安装

    复制代码

    unzip docker-compose-linux-x86_64.zip 
    Archive:  docker-compose-linux-x86_64.zip
      inflating: docker-compose         
    
    ll docker-compose
    -rw-r--r-- 1 root root 8858496 Aug 31  2017 docker-compose
    
    chmod +x docker-compose
    
    mv docker-compose /usr/bin/

    复制代码

     YAML文件格式及编写注意事项

    YAML是一种标记语言很直观的数据序列化格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多

    YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来

    YAML文件格式注意事项:

    • 不支持制表符tab键缩进,需要使用空格缩进
    • 通常开头缩进2个空格
    • 字符后缩进1个空格,如冒号,逗号,横杆
    • 用井号注释
    • 如果包含特殊字符用单引号引起来
    • 布尔值(true,false,yes,no,on,off)必须用引号括起来,这样分析器会将他们解释为字符串。

    配置文件常用字段

    字段 描述
    build 下级字段dockerfile:指定Dockerfile文件名
      下级字段context;构建镜像上下文路径
    image 指定镜像
    command 执行命令,覆盖默认命令
    container_name 指定容器名称
    deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
    environment 添加环境变量
    networks 加入网络,引用顶级networks下条目
    ports 暴露端口,与-p相同,但端口不能低于60
    volumes 挂载宿主机路径或命名卷。如果是命名卷在顶级volumes定义卷名称
    restart 重启策略,默认no,always | on-failure | unless-stopped
    hostname

    容器主机名

    常用命令

    字段 描述
    build 重新构建服务
    ps 列出容器
    up 创建和启动容器
    exec 在容器里执行命令
    scale 指定一个服务容器启动数量
    top 显示容器进程
    logs 查看容器输出
    down 删除容器,网络,数据卷和镜像
    stop/start/restart 停止/启动/重启服务

    一键部署LNMP网站平台

    复制代码

    #查看compose_lnmp包
    tree /root/compose_lnmp/
    /root/compose_lnmp/
    ├── docker-compose.yml             #docker-compose启动接口文件
    ├── mysql
    │   ├── conf
    │   │   └── my.cnf                 #mysql配置文件
    │   └── data                       #待挂载mysql数据目录
    ├── nginx
    │   ├── Dockerfile                 #自定义nginx的Docker镜像配置文件        
    │   ├── nginx-1.12.1.tar.gz        #nginx源码包
    │   └── nginx.conf                 #nginx配置文件
    ├── php
    │   ├── Dockerfile                 #自定义php的docker镜像文件
    │   ├── php-5.6.31.tar.gz          #php源码包
    │   └── php.ini                    #php配置文件
    └── wwwroot                        #网页目录
        └── index.php                  #默认网页文件                                                          

    复制代码

    复制代码

    vim docker-compose.yml       #docker-compose启动接口文件必须是以.yml 结尾 他和ansbile都是python写的
    version: '3'            #容器版本为3
    services:             #容器服务有以下 
      nginx:              #nginx的容器
        hostname: nginx        #容器主机名为nginx
        build:                     #指定dockerfile文件的位置
          context: ./nginx      #dockerfile文件位置在当前路径下的nginx目录里
          dockerfile: Dockerfile   #dockerfile文件名:Dockerfile
        ports:             #指定映射端口主机81映射到80
          - 81:80                  
        networks:                  #指定容器网卡在lnmp网桥
          - lnmp
        volumes:                   #挂载当前目录下的./wwwroot到容器nginx的网页目录
          - ./wwwroot:/usr/local/nginx/html
    
      php:                         #和nginx类似
        hostname: php
        build:
          context: ./php
          dockerfile: Dockerfile
        networks:
          - lnmp
        volumes:
          - ./wwwroot:/usr/local/nginx/html
    
      mysql:
        hostname: mysql
        image: mysql:5.6            #下载镜像mysql5.6版本
        ports:                      
          - 3306:3306
        networks:
          - lnmp
        volumes:                        #挂载mysql主配置文件和数据文件
          - ./mysql/conf:/etc/mysql/conf.d
          - ./mysql/data:/var/lib/mysql  
        command: --character-set-server=utf8         #执行命令,覆盖默认命令 
        environment:                            #添加环境变量
          MYSQL_ROOT_PASSWORD: 123456
          MYSQL_DATABASE: wordpress
          MYSQL_USER: user
          MYSQL_PASSWORD: user123
    
    networks:          #加入网络lnmp,引用顶级networks下条目
      lnmp: 
    

    复制代码

    #一键部署LNMP
    docker-compose -f docker-compose.yml up        #-f指定当前目录下的docker-compose为启动文件,up创建和启动容器

    复制代码

    #一键查看所有部署的容器进程
    docker-compose -f docker-compose.yml ps
           Name                      Command               State           Ports          
    -------------------------------------------------------------------------------------
    composelnmp_mysql_1   docker-entrypoint.sh --cha ...   Up      0.0.0.0:3306->3306/tcp 
    composelnmp_nginx_1   ./sbin/nginx -g daemon off;      Up      0.0.0.0:81->80/tcp     
    composelnmp_php_1     ./sbin/php-fpm -c /usr/loc ...   Up      9000/tcp        
    
    #一键终止所有部署的容器进程
    docker-compose -f docker-compose.yml stop
    Stopping composelnmp_nginx_1 ... done
    Stopping composelnmp_php_1   ... done
    Stopping composelnmp_mysql_1 ... done
    
    #一键启动容器,在后台运行
    docker-compose -f docker-compose.yml start
    #一键清理所有部署的容器进程 docker-compose -f docker-compose.yml down

    复制代码

       

    一键部署Nginx反向代理Tomcat集群实战

    复制代码

    #查看compose_nginx_tomcat包
    [root@docker ~]# tree compose_nginx_tomcat/
    compose_nginx_tomcat/
    ├── docker-compose.yml
    ├── mysql
    │   ├── conf
    │   │   └── my.cnf  #mysql的配置文件
    │   └── data        #待挂载mysql数据目录
    ├── nginx
    │   ├── Dockerfile      #自定义镜像配置文件
    │   ├── nginx-1.12.1.tar.gz #源码包
    │   └── nginx.conf          #nginx配置文件
    ├── tomcat
    │   ├── apache-tomcat-8.0.46.tar.gz #源码包
    │   ├── Dockerfile      #自定义镜像配置文件
    │   └── server.xml      #tomcat配置文件
    └── webapps         
        └── ROOT
            └── index.html  #网页测试文件

    复制代码

    复制代码

    #查看docker-compose的启动接口文件
     cat compose_nginx_tomcat/docker-compose.yml 
    version: '3'
    services:
      nginx:
        hostname: nginx
        build:
          context: ./nginx
          dockerfile: Dockerfile
        ports:
          - 82:80
        networks:
          - lnmt
        volumes:
          - ./webapps:/opt/webapps
      tomcat01:
        hostname: tomcat01
        build: ./tomcat
        networks:
          - lnmt
        volumes:
          - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45
          - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
      tomcat02:
        hostname: tomcat02
        build: ./tomcat
        networks:
          - lnmt
        volumes:
          - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45   #docker宿主机的java环境被挂载了!
          - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps    #挂载网页目录
      mysql:
        hostname: mysql
        image: mysql:5.6
        ports:
          - 3307:3306
        networks:
          - lnmt
        volumes:
          - ./mysql/conf:/etc/mysql/conf.d
          - ./mysql/data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: 123456
          MYSQL_DATABASE: db
          MYSQL_USER: user
          MYSQL_PASSWORD: user123
    networks:
      lnmt:

    复制代码

    每个容器安装JAVA环境,会使容器过大,所以用本地java环境挂在到tomcat容器内,这样节省空间

    #由于tomcat容器进程需要挂载docker宿主机本地的java环境
    #所以在docker宿主机本地安装jdk-8u45-linux-x64.tar.gz
    tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local
    
    #一键部署ngxin+tomcat反向代理集群
    docker-compose -f docker-compose.yml up

    复制代码

    nginx反向代理配置文件
    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;
        
        upstream www.example.com {
            #ip_hash;
            server tomcat01:8080;      #在compose的接口文件里定义的hostname主机名可直接解析为IP
            server tomcat02:8080;
        }
    
        server {
            listen 80;
            server_name localhost;
        
        location / {
            proxy_pass http://www.example.com;
        }
    
            location ~ .(html|css|js|jpg|png|gif)$ {
                root /opt/webapps/ROOT;
            }
        }
    }

    复制代码

  • 相关阅读:
    springboot集成websocket
    验证regex表达式本身是否有问题
    Quartz Cron表达式 生成
    Cannot run program "python": CreateProcess error=2, 系统找不到指定的文件
    遇到多个构造器参数时,要考虑用构造器
    考虑使用静态工厂代替构造器
    idea自定义注释
    layui2.4.0前的table隐藏列
    002、获取屏幕大小
    001、关于TextView的一些小知识
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317391.html
Copyright © 2020-2023  润新知