zoukankan      html  css  js  c++  java
  • Dockerfile

    Dockerfile规则

    格式:

    1.#为注释
    2.指令(大写)内容(小写)
    3.尽管指令是大小写不敏感的,但是,我们强烈建议指令用大写,内容用小写表示。
    Dockerfile是按顺序执行Dockerfile里的指令集合的(从上到下依次执行)
    
    每个Dockerfile的第一个非注释行指令,必须是 “FROM” 指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中
    
      	实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在docker主机(本地)上查找指定的镜像文件,当其在本地不存在时,则会从Docker registry(远端)上拉取所需镜像文件。
    4组核心的Dockerfile指令
    

    USER,WORKDIR

    [root@localhost ~]# vim /data/dockerfile/Dockerfile
    FROM docker.io/llxuan518/nginx:v1.16.6
    USER nginx
    WORKDIR /usr/share/nginx/html
    

    测试

    [root@localhost ~]# cd /data/dockerfile/
    
    [root@localhost dockerfile]# docker build . -t docker.io/llxuan518/nginx:v1.16.6_user_workdir
    
    [root@localhost dockerfile]# docker run --rm -it --name nginx123 llxuan518/nginx:v1.16.6_user_workdir /bin/bash
    nginx@fbd87fe92f54:/usr/share/nginx/html$ pwd
    /usr/share/nginx/html
    

    ADD,EXPOSE( EXPOSE 向外暴露端口只是声明而已)

    说明:
    ADD:比COPY命令多的功能是,可以自动解压 .tar*的软件包到目标目录下,可以指定源文件为URL地址。

    COPY:从Dockerfile所在目录拷贝目标文件到容器的制定目录下,可以支持通配符,如果拷贝的是目录,只拷贝目录下的子文件子目录。

    [root@localhost dockerfile]# vim Dockerfile
    FROM docker.io/llxuan518/nginx:v1.16.6
    ADD index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    

    测试

    [root@localhost dockerfile]# docker build ./ -t llxuan518/nginx:v1.16.6_user_index
    
    [root@localhost dockerfile]# docker run --rm -it --name nginx2333  -P llxuan518/nginx:v1.16.6_user_index  /bin/bash
    

    RUN,ENV( RUN 构建镜像过程中运行的命令,ENV 设定环境变量)

    ENV功能为设置环境变量

    语法有两种

    1. ENV
    2. ENV = ...
      两者的区别就是第一种是一次设置一个,第二种是一次设置多个
    [root@localhost dockerfile]# vim Dockerfile
    FROM centos:7
    ENV VER 9.11.4
    RUN yum install bind-$VER -y
    

    查看bind版本号

    [root@localhost dockerfile]# yum list bind --show-duplicates
    

    测试

    [root@localhost dockerfile]# docker build ./ -t llxuan518/bind:v9.11.4_env
    
    [root@localhost dockerfile]# docker run -it --rm --name bind_env llxuan518/bind:v9.11.4_env /bin/bash
    

    CMD,ENTRYPOINT( CMD 使用镜像启动容器时运行的命令)

    [root@localhost dockerfile]# vim Dockerfile
    FROM centos:7
    RUN yum install httpd -y
    CMD ["httpd","-D","FOREGROUND"]
    

    构建测试

    [root@localhost dockerfile]# docker build ./ -t llxuan518/httpd:test
    

    后台运行

    [root@localhost dockerfile]# docker run --rm -d --name my-http llxuan518/httpd:test
    

    ENTRYPOINT

    [root@localhost dockerfile]# vim entrypoint.sh
    #!/bin/bash
    /shin/nginx -g "daemon off;"
    
    [root@localhost dockerfile]# chmod +x entrypoint.sh
    
    [root@localhost dockerfile]# vim Dockerfile 
    FROM centos:7
    ADD entrypoint.sh /entrypoint.sh
    RUN yum install epel-release -q -y && yum install nginx -y
    ENTRYPOINT /entrypoint.sh
    

    测试

    [root@localhost dockerfile]# docker build ./ -t llxuan518/nginx:mynginx
    它不用-d后台,因为它脚本已经定义,只能前台挂着
    
    [root@localhost dockerfile]# docker run --rm -p87:80 llxuan518/nginx:mynginx
    

    VOLUME ["/var/www/html","data/mysql/data"] 数据卷??

    范例:编译安装nginx

    [root@long docker]# pwd
    /opt/docker
    
    [root@long docker]# ll
    总共是4个文件
    -rw-r--r-- 1 root root     890 Jul 15 02:17 Dockerfile
    -rw-r--r-- 1 root root      24 Jul 14 13:06 index.html
    -rw-r--r-- 1 root root 1039530 Apr 21  2020 nginx-1.18.0.tar.gz
    -rw-r--r-- 1 root root    2659 Jul 15 01:32 nginx.conf
    

    Dockerfile配置文件(文件不能有中文注释)

    [root@long docker]# cat Dockerfile
    #Nginx Base Image
    FROM centos:7.9.2009
    LABEL maintainer="lvxuan xxx@qq.com"
    LABEL project="N520"
    
    ENV password="123456"
    ENV user="long"
    ENV VER=1.18.0
    ENV SRC=/usr/local/src
    #ENV CPU="$(lscpu | awk '/^CPU(s):/{print $NF}')"
    ENV CPU=2
    ENV GROUP=80
    ENV USER=80
    ENV PORT=80
    
    RUN groupadd -g ${GROUP} nginx && useradd -s /sbin/nologin -r -g ${GROUP} -u ${USER} nginx
    RUN yum install vim -y && yum install -y vim wget tree  lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    ADD nginx-${VER}.tar.gz ${SRC}
    RUN cd ${SRC}/nginx-${VER} && ./configure --prefix=/apps/nginx && make -j ${CPU} && make install
    COPY nginx.conf /apps/nginx/conf/
    ADD index.html /apps/nginx/html/index.html
    
    VOLUME ["/static","/data1","/data2"]
    RUN chown -R nginx.nginx /apps/
    EXPOSE ${PORT}
    
    #ENTRYPOINT ["/apps/nginx/sbin/nginx","-g","daemon off;"]
    CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]
    

    执行构建

    [root@long docker]# docker build -t harbor.test.com/centos7:v1 .
    

    基于构建的镜像后台启动容器

    [root@long docker]# docker run -itd -p 81:80 --name nginx-v3 harbor.test.com/centos7:v1
    

    案例:自定义Tomcat业务镜像

    容器里面jdk的/etc/profile文件的环境是给普通用户使用的

    镜像叠加形成

    先做出CentOS系统base基础镜像

    [root@long-ubuntu centos-7.9]# mkdir -p /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}}
    

    制作Tomcat镜像叠加形成图形

    创建目录

    [root@long-ubuntu centos-7.9]# mkdir centos-7.9
    [root@long-ubuntu centos-7.9]# pwd
    /opt/dockerfile/system/centos/centos-7.9
    [root@long-ubuntu centos-7.9]# ll
    total 16
    -rw-r--r-- 1 root root   49 Jul 16 13:29 build-command.sh
    -rw-r--r-- 1 root root  275 Jul 16 13:28 Dockerfile
    

    制作dockerfile

    [root@long-ubuntu centos-7.9]# cat Dockerfile
    # Centos Base Image
    FROM centos:7.9.2009
    LABEL maintainer="lvxuan xxx@qq.com"
    
    RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    RUN groupadd long -g 2021 && useradd long -u 2021 -g long
    

    写个构建脚本

    [root@long-ubuntu centos-7.9]# cat build-command.sh
    #!/bin/bash
    
    docker build -t centos7.9-base:v1 .
    

    执行

    [root@long-ubuntu centos-7.9]# bash build-command.sh
    ...
    Step 4/4 : RUN groupadd long -g 2021 && useradd long -u 2021 -g long
     ---> Running in 79bcabe19504
    Removing intermediate container 79bcabe19504
     ---> 873548f656bc
    Successfully built 873548f656bc
    Successfully tagged centos7.9-base:v1
    

    基于自己构建出来的CentOS系统镜像构建一个JDK

    [root@long-ubuntu jdk]# ll
    total 141556
    -rw-r--r-- 1 root root        47 Jul 16 13:41 build-command.sh
    -rw-r--r-- 1 root root       398 Jul 16 13:40 Dockerfile
    -rw-r--r-- 1 root root 144935989 Jul 16 13:40 jdk-8u291-linux-x64.tar.gz
    

    制作dockerfile文件,记得上传jdk压缩包

    写个构建脚本

    [root@long-ubuntu jdk]# cat build-command.sh
    #!/bin/bash
    
    docker build -t jdk-base:v8.291 .
    

    执行

    [root@long-ubuntu jdk]# bash build-command.sh
    ...
    Removing intermediate container 0c00720745fe
     ---> ede217fbdd43
    Successfully built ede217fbdd43
    Successfully tagged jdk-base:v8.291
    

    拷贝docker配置文件出来

    root@long-ubuntu:~# docker cp 85e509e1976a:/etc/profile .
    

    改配置文件

    [root@long-ubuntu jdk]# vim profile
    # jdk
    export JAVA_HOME=/usr/local/jdk
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
    export PATH=$PATH:$JAVA_HOME/bin
    

    修改dockerfile并重新构建

    [root@long-ubuntu jdk]# cat Dockerfile
    #JDK Base Image
    FROM centos7.9-base:v1
    LABEL maintainer="lvxuan xxx@qq.com"
    
    ADD jdk-8u291-linux-x64.tar.gz /usr/local/src/
    RUN ln -sv /usr/local/src/jdk1.8.0_291 /usr/local/jdk
    ADD profile /etc/profile
    
    ENV JAVA_HOME /usr/local/jdk
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
    ENV PATH $PATH:$JAVA_HOME/bin
    
    RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    

    查看当前目录所有

    [root@long-ubuntu jdk]# ll
    total 141560
    -rw-r--r-- 1 root root        47 Jul 16 13:41 build-command.sh
    -rw-r--r-- 1 root root       423 Jul 16 14:04 Dockerfile
    -rw-r--r-- 1 root root 144935989 Jul 16 13:40 jdk-8u291-linux-x64.tar.gz
    -rw-r--r-- 1 root root       731 Jul 16 14:03 profile
    

    执行

    [root@long-ubuntu jdk]# bash build-command.sh
    ...
    Removing intermediate container 0c00720745fe
     ---> ede217fbdd43
    Successfully built ede217fbdd43
    Successfully tagged jdk-base:v8.291
    

    测试验证(这才是正常普通用户也有java权限看到)

    [root@long-ubuntu jdk]# docker run -it --rm jdk-base:v8.291 bash
    [root@e8074749c67e /]# java -version
    java version "1.8.0_291"
    Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
    [root@e8074749c67e /]# su - long
    [long@e8074749c67e ~]$ pwd
    /home/long
    [long@e8074749c67e ~]$ id
    uid=2021(long) gid=2021(long) groups=2021(long)
    [long@e8074749c67e ~]$ java -version
    java version "1.8.0_291"
    Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
    

    基于上面的JDK基础镜像制作Tomcat-base基础镜像

    base里所有的文件,记得上传Tomcat压缩包

    [root@ubuntu-1804 tomcat8-base]# ll
    -rw-r--r-- 1 root root 10312541 Jul 20 01:40 apache-tomcat-8.5.54.tar.gz
    -rw-r--r-- 1 root root       52 Jul 20 01:40 build-command.sh
    -rw-r--r-- 1 root root      383 Jul 20 01:38 Dockerfile
    

    写dockerfile文件

    [root@long-ubuntu tomcat-base]# vim Dockerfile
    #Tomcat Base Image
    FROM jdk-base:v8.291
    LABEL maintainer="lvxuan xxx@qq.com"
    
    #env
    ENV TZ "Asia/Shanghai" ENV LANG en_US.UTF-8
    ENV TERM xterm
    ENV TOMCAT_MAJOR_VERSION 8
    ENV TOMCAT_MINOR_VERSION 8.5.54
    ENV CATALINA_HOME /apps/tomcat
    ENV APP_DIR ${CATALINA_HOME}/webapps
    
    #tomcat
    RUN mkdir /apps
    ADD apache-tomcat-8.5.54.tar.gz /apps
    RUN ln -sv /apps/apache-tomcat-8.5.54 /apps/tomcat
    

    写个构建脚本

    [root@long-ubuntu tomcat-base]# vim build-command.sh
    #!/bin/bash
    
    docker build -t tomcat-base:v8.5.54 .
    

    执行

    [root@long-ubuntu tomcat-base]# bash build-command.sh
    ...
    Removing intermediate container 8cc5c96df0c7
     ---> 7dc7e5874247
    Successfully built 7dc7e5874247
    Successfully tagged tomcat-base:v8.5.54
    

    测试 启动并设置退出就删除

    [root@long-ubuntu tomcat-base]# docker run -it --rm -p 8080:8080 tomcat-base:v8.5.54 bash
    

    容器启动后需要进入然后启动Tomcat

    [root@98559cc53536 /]# /apps/tomcat/bin/catalina.sh run
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk/jre
    
    

    制作Tomcat业务镜像比如app1,app2

    准备一个tar包或者说假设从开发哪里得到的tar包

    [root@long-ubuntu tomcat-app1]# pwd
    /opt/dockerfile/web/tomcat/tomcat-app1
    
    [root@long-ubuntu tomcat]# mkdir tomcat-app1
    [root@long-ubuntu tomcat]# cd tomcat-app1/
    
    [root@long-ubuntu tomcat-app1]# mkdir myapps
    
    [root@long-ubuntu tomcat-app1]# echo "Tomcat Web1 Page" > myapps/index.html
    [root@long-ubuntu tomcat-app1]# cat myapps/index.html
    Tomcat Web1 Page
    
    # 假设(自己制作压缩包)
    [root@long-ubuntu tomcat-app1]# tar zcf myapps.tar.gz myapps/*
    

    配置dockerfile文件

    # 默认路径
    [root@long-ubuntu tomcat-app1]# cat Dockerfile
    #Tomcat Web Image
    FROM tomcat-base:v8.5.54
    LABEL maintainer="lvxuan xxx@qq.com"
    
    ADD myapps/* /apps/tomcat/webapps/myapps/
    RUN chown -R long.long /apps/tomcat/
    

    写个构建脚本

    [root@long-ubuntu tomcat-app1]# vim build-command.sh
    #!/bin/bash
    #
    docker build -t tomcat-web:app1 .
    

    执行

    [root@long-ubuntu tomcat-app1]# bash build-command.sh
    ...
     ---> ec9da7cf9d4d
    Successfully built ec9da7cf9d4d
    Successfully tagged tomcat-web:app1
    

    所有

    [root@ubuntu-1804 tomcat-app1]# ll
    -rw-r--r-- 1 root root   48 Jul 20 01:47 build-command.sh
    -rw-r--r-- 1 root root  158 Jul 20 01:46 Dockerfile
    drwxr-xr-x 2 root root 4096 Jul 20 01:45 myapp/
    -rw-r--r-- 1 root root  146 Jul 20 01:46 myapp.tar.gz
    
    

    测试

    # 启动容器
    [root@long-ubuntu tomcat-app1]# docker run -it --rm -p 8080:8080 tomcat-web:app1 bash
    
    # 进入容器启动Tomcat
    [root@569f4535d70d /]# /apps/tomcat/bin/catalina.sh run
    
    # false 是关闭自动解包自动部署
    <Host name="localhost"  appBase="/data/tomcat/webapps"
                unpackWARs="false" autoDeploy="false">
    
    

    拷贝容器配置文件出来并修改

    root@long-ubuntu:~# docker cp 9c68593ce1bd:/apps/tomcat/conf/server.xml .
    

    重新修改Dockerfile文件指向自定义路径

    [root@long-ubuntu tomcat-app1]# cat Dockerfile
    #Tomcat Web Image
    FROM tomcat-base:v8.5.54
    LABEL maintainer="lvxuan xxx@qq.com"
    
    ADD run_tomcat.sh /apps/tomcat/bin
    ADD server.xml /apps/tomcat/conf/server.xml
    RUN mkdir -p /data/tomcat/webapps
    ADD myapps.tar.gz /data/tomcat/webapps/
    RUN chown -R long.long /apps/tomcat/ /data/tomcat/webapps
    
    EXPOSE 8080
    CMD ["/apps/tomcat/bin/run_tomcat.sh"]
    

    准备tomcat容器启动执行脚本这样就不用Tomcat自带的启动命令了

    [root@long-ubuntu tomcat-app1]# cat run_tomcat.sh
    #!/bin/bash
    echo "1.1.1.1 abc.test.com" >> /etc/hosts
    
    # 不能在使用run,一定要使用start,如果使用run就会一直卡住,这样就不能达到想要的效果,比如有个pid为1的进程
    su - long -c "/apps/tomcat/bin/catalina.sh start"
    tail -f /etc/hosts
    

    如果dockerfile文件有写启动脚本,用命令行启动就不要加bash直接启动即可

    [root@long-ubuntu tomcat-app1]# docker run -it --rm -p 8080:8080 tomcat-web:app1
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk/jre
    Using CLASSPATH:       /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    ...
    172.17.0.2      387f94ddd9dc
    1.1.1.1 abc.test.com
    

    改装后的所有文件

    [root@ubuntu-1804 tomcat-app1]# ll
    -rw-r--r-- 1 root root   48 Jul 20 01:47 build-command.sh
    -rw-r--r-- 1 root root  343 Jul 20 01:54 Dockerfile
    drwxr-xr-x 2 root root 4096 Jul 20 01:45 myapp/
    -rw-r--r-- 1 root root  146 Jul 20 01:46 myapp.tar.gz
    -rw-r--r-- 1 root root  274 Jul 20 01:54 run_tomcat.sh
    -rw------- 1 root root 7603 Jul 20 01:53 server.xml
    

    浏览器访问

    制作第二个Tomcat-app2

    可以直接拷贝方式

    [root@long-ubuntu tomcat]# mkdir tomcat-app2
    [root@long-ubuntu tomcat]# cp -r tomcat-app1/* tomcat-app2
    

    修改脚本

    [root@long-ubuntu tomcat-app2]# vim build-command.sh
    #!/bin/bash
    #
    docker build -t tomcat-web:app2 .
    

    修改tar包里面的信息或者说这个tar是开发给的tar包

    [root@long-ubuntu tomcat-app2]# mkdir myapps
    [root@long-ubuntu tomcat-app2]# echo "Tomcat Web2 Page" > myapps/index.html
    [root@long-ubuntu tomcat-app2]# cat myapps/index.html
    Tomcat Web2 Page
    
    # 打包
    [root@long-ubuntu tomcat-app2]# tar zcvf myapps.tar.gz myapps
    myapps/
    myapps/index.html
    

    构建

    [root@long-ubuntu tomcat-app2]# bash build-command.sh
    ...
     ---> 39134c7a2142
    Successfully built 39134c7a2142
    Successfully tagged tomcat-web:app2
    

    测试

    [root@long-ubuntu tomcat-app2]# docker run -it -p 8080:8080 tomcat-web:app2
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk/jre
    Using CLASSPATH:       /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    ...
    1.1.1.1 abc.test.com
    

    所有的镜像

    [root@long-ubuntu ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    tomcat-web          app2                39134c7a2142        3 minutes ago       886MB
    tomcat-web          app1                bfbb82aa0dfe        19 minutes ago      886MB
    tomcat-base         v8.5.54             7dc7e5874247        13 hours ago        871MB
    jdk-base            v8.291              da87eec5a41e        13 hours ago        857MB
    centos7.9-base      v1                  873548f656bc        13 hours ago        497MB
    centos              7.9.2009            8652b9f0cb4c        8 months ago        204MB
    

    制作 HAproxy镜像

    dockerfile镜像制作流程,先把lua和haproxy编译出来保证其能正常编译不报错在加其他参数

    dockerfile配置文件

    [root@long-ubuntu haproxy]# cat Dockerfile
    #Haproxy Base Image
    FROM centos7.9-base:v1
    LABEL maintainer="lvxuan xxx@qq.com"
    
    RUN yum -y install gcc gcc-c++ glibc glibc-devel pcre pcre-devel readline-devel openssl openssl-devel systemd-devel 
        net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
    
    ADD lua-5.3.5.tar.gz /usr/local/src
    RUN cd /usr/local/src/lua-5.3.5 && make linux test
    
    ADD haproxy-2.1.7.tar.gz /usr/local/src/
    RUN cd /usr/local/src/haproxy-2.1.7 && make ARCH=x86_64 TARGET=linux-glibc 
        USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 
        USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ && make install PREFIX=/apps/haproxy
    
    RUN ln -s /apps/haproxy/sbin/haproxy /usr/sbin/haproxy
    
    RUN mkdir /apps/haproxy/run
    ADD haproxy.cfg /etc/haproxy/haproxy.cfg
    ADD run_haproxy.sh /usr/bin
    EXPOSE 80 9999
    
    CMD ["/usr/bin/run_haproxy.sh"]
    

    启动脚本(haproxy -f 后面跟以cfg结尾的配置就可以启动)

    [root@long-ubuntu haproxy]# cat run_haproxy.sh
    #!/bin/bash
    echo "1.1.1.1 aa.xx.com" >> /etc/hosts
    
    /apps/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    tail -f /etc/hosts
    

    构建

    [root@long-ubuntu haproxy]# cat build-command.sh
    #!/bin/bash
    #
    docker build -t haproxy-2.1.7-base:v1 .
    

    执行

    [root@long-ubuntu haproxy]# bash build-command.sh
    ...
     ---> 0f268f9b7022
    Successfully built 0f268f9b7022
    Successfully tagged haproxy-2.1.7-base:v1
    

    所有文件如下

    [root@long-ubuntu haproxy]# ll
    total 2972
    -rw-r--r-- 1 root root      54 Jul 17 08:36 build-command.sh
    -rw-r--r-- 1 root root     883 Jul 17 08:33 Dockerfile
    -rw-r--r-- 1 root root 2709999 Jul 17 07:52 haproxy-2.1.7.tar.gz
    -rw-r--r-- 1 root root     655 Jul 17 08:36 haproxy.cfg
    -rw-r--r-- 1 root root  303543 Jul 17 07:52 lua-5.3.5.tar.gz
    -rwxr-xr-x 1 root root     126 Jul 17 08:32 run_haproxy.sh*
    

    上传镜像到harbor仓库

    [root@long-ubuntu haproxy]# docker tag haproxy-2.1.7-base:v1 harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    
    [root@long-ubuntu haproxy]# docker push harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    

    扩展 HAproxy + nginx + Tomcat

    这个图缺个keepalived的虚拟VIP

    nginx修改配置文件

    [root@long-ubuntu nginx]# vim nginx.conf
    
        upstream tomcat-server {
            server 172.31.0.29:8080;
            server 172.31.0.39:8080;
        }
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
            location /myapps {
                proxy_pass http://tomcat-server;
            }
    

    haproxy修改配置文件

    
    [root@long-ubuntu nginx]# cat ../haproxy/haproxy.cfg
    global
    chroot /apps/haproxy
    stats socket /apps/haproxy/run/haproxy.sock mode 600 level admin
    uid 99
    gid 99
    daemon
    nbproc 1
    pidfile /apps/haproxy/run/haproxy.pid
    log 127.0.0.1 local3 info
    defaults
    option http-keep-alive
    option forwardfor
    mode http
    timeout connect 300000ms
    timeout client 300000ms
    timeout server 300000ms
    
    listen stats
      mode http
      bind 0.0.0.0:9999
      stats enable
      log global
      stats uri /haproxy-status
      stats auth haadmin:123456
    
    listen web_port
      bind 0.0.0.0:80
      mode http
      log global
      balance roundrobin
      server web1 172.31.0.29:86 check inter 3000 fall 2 rise 5
      server web2 172.31.0.39:86 check inter 3000 fall 2 rise 5
    

    另外一台机器需要安装好docker环境,镜像可以上传到私有仓库然后下载,如果没有私有仓库也可以使用打包镜像方式传到机器

    范例:使用save打包

    [root@long-ubuntu nginx]# docker save f585766e2f1e > haproxy-2.1.7-base.tar.gz
    
    # 把tar包拷贝到其他机器上
    [root@long-ubuntu nginx]# scp haproxy-2.1.7-base.tar.gz 172.31.0.19:/opt
    
    # 在其他机器导入
    [root@Bj-Ubuntu ~/harbor]# docker load < /opt/haproxy-2.1.7-base.tar.gz
    

    范例:使用私有仓库

    # tomcat-app2镜像上传
    [root@long-ubuntu nginx]# docker tag tomcat-web:app2 harbor.longxuan.vip/m44/tomcat-web:app2
    [root@long-ubuntu nginx]# docker push harbor.longxuan.vip/m44/tomcat-web:app2
    
    # haproxy镜像上传
    [root@long-ubuntu haproxy]# docker tag haproxy-2.1.7-base:v1 harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    [root@long-ubuntu haproxy]# docker push harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    
    # nginx镜像上传
    [root@long-ubuntu nginx]# docker tag centos7-nginx-1.18:v1 harbor.longxuan.vip/m44/centos7-nginx-1.18:v1
    [root@long-ubuntu nginx]# docker push harbor.longxuan.vip/m44/centos7-nginx-1.18:v1
    

    另外一台机器操作到私有仓库拉取镜像

    [root@long-ubuntu ~]# docker pull harbor.longxuan.vip/m44/centos7-nginx-1.18:v1
    
    [root@long-ubuntu ~]# docker pull harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    
    [root@long-ubuntu ~]# docker pull harbor.longxuan.vip/m44/tomcat-web:app2
    

    基于三个镜像启动

    [root@long-ubuntu ~]# docker run -itd -p 8080:8080 harbor.longxuan.vip/m44/tomcat-web:app2
    
    [root@long-ubuntu ~]# docker run -itd -p 86:80 harbor.longxuan.vip/m44/centos7-nginx-1.18:v1
    
    [root@long-ubuntu ~]# docker run -itd -p 80:80 -p 9999:9999 harbor.longxuan.vip/m44/haproxy-2.1.7-base:v1
    

    浏览器验证

    案例:基于官方 alpine 基础镜像制作自定义镜像

    [root@long-ubuntu alpine]# ll
    total 1040
    -rw-r--r-- 1 root root      53 Jul 17 12:21 build-command.sh
    -rw-r--r-- 1 root root     847 Jul 17 12:54 Dockerfile
    -rw-r--r-- 1 root root 1039530 Jul 17 12:21 nginx-1.18.0.tar.gz
    -rw-r--r-- 1 root root    2848 Jul 17 12:34 nginx.conf
    -rw-r--r-- 1 root root     175 Jul 17 12:57 static.tar.gz
    

    dockerfile配置文件

    [root@long-ubuntu alpine]# cat Dockerfile
    #Images alpine create
    FROM alpine:latest
    LABEL maintainer="lvxuan XXX@qq.com"
    
    #COPY repositories /etc/apk/repositories
    RUN sed -i -e 's/http:/https:/' /etc/apk/repositories
    RUN apk update && apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev 
        zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2
    
    ADD nginx-1.18.0.tar.gz /opt/
    RUN cd /opt/nginx-1.18.0 && ./configure --prefix=/apps/alpnginx && make && make install && ln -sv /apps/alpnginx/sbin/nginx /usr/bin/
    
    RUN mkdir -p /data/alpnginx
    RUN addgroup -g 2021 -S nginx && adduser -s /sbin/nologin -S -D -u 2021 -G nginx nginx
    COPY nginx.conf /apps/alpnginx/conf/nginx.conf
    ADD static.tar.gz /apps/alpnginx/html
    
    RUN chown nginx.nginx /data/alpnginx/ /apps/alpnginx/ -R
    
    EXPOSE 80 443
    CMD ["/apps/alpnginx/sbin/nginx","-g","daemon off;"]
    

    构建脚本

    [root@long-ubuntu alpine]# cat build-command.sh
    #!/bin/bash
    #
    docker build -t alpine-nginx-1.18:v1 .
    

    启动测试

    [root@long-ubuntu alpine]# docker run -it --rm -p 81:80 alpine-nginx-1.18:v1
    

    案例:基于官方 Ubuntu 基础镜像制作自定义镜像

    [root@long-ubuntu ubuntu]# ll
    total 1044
    -rw-r--r-- 1 root root      57 Jul 17 13:13 buil-command.sh
    -rw-r--r-- 1 root root    1138 Jul 17 13:30 Dockerfile
    -rw-r--r-- 1 root root 1039530 Jul 17 13:11 nginx-1.18.0.tar.gz
    -rw-r--r-- 1 root root    2848 Jul 17 13:12 nginx.conf
    -rw-r--r-- 1 root root     814 Jul 17 13:29 sources.list
    -rw-r--r-- 1 root root     175 Jul 17 13:12 static.tar.gz
    

    Dockerfile配置文件(目前遇到不是使用官方的apt源就会报错)

    [root@long-ubuntu ubuntu]# cat Dockerfile
    #Images ubuntu-18.04 create
    FROM ubuntu:18.04
    LABEL maintainer="lvxuan xxx@qq.com"
    
    COPY sources.list /etc/apt/sources.list
    RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute 
        nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev 
        zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree 
        openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet 
        traceroute iotop unzip zip make 
        && touch /tmp/linux.txt
    
    ADD nginx-1.18.0.tar.gz /usr/local/src
    RUN cd /usr/local/src/nginx-1.18.0 
        && ./configure --prefix=/apps/ubtnginx 
        && make && make install && ln -sv /apps/ubtnginx/sbin/nginx /usr/bin 
        && rm -rf /usr/local/src/nginx-1.18.0 
        && rm -rf /usr/local/src/nginx-1.18.0.tar.gz
    
    ADD nginx.conf /apps/ubtnginx/conf/nginx.conf
    ADD static.tar.gz /apps/ubtnginx/html
    
    RUN groupadd -g 2022 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2022 nginx 
        && mkdir -p /data/ubtnginx 
        && chown -R nginx.nginx /apps/ubtnginx /data/ubtnginx
    
    EXPOSE 80 443
    CMD ["/apps/ubtnginx/sbin/nginx","-g","daemon off;"]
    

    构建脚本

    [root@long-ubuntu ubuntu]# cat buil-command.sh
    #!/bin/bash
    #
    docker build -t ubuntu-18.04-nginx-18:v1 .
    

    执行构建

    [root@long-ubuntu ubuntu]# bash buil-command.sh
     ---> 6302f193fb87
    Successfully built 6302f193fb87
    Successfully tagged ubuntu-18.04-nginx-18:v1
    

    启动容器验证

    [root@long-ubuntu ubuntu]# docker run -it --rm -p 82:80 ubuntu-18.04-nginx-18:v1
    
  • 相关阅读:
    JAVA调用WebService总结
    关于购物车的想法
    ASP.NET中初试Ajax
    转帖:从FxCop归纳出来的一些规范建议
    数据结构(二叉树)C#描述
    FormView控件和DetailsGridView控件实现MasterSlave
    在.NET中使用MySql数据库
    Oracle学习总结1
    Oracle学习总结2
    关于字符匹配所引起的的问题
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/15168116.html
Copyright © 2011-2022 走看看