zoukankan      html  css  js  c++  java
  • Docker镜像制作-Day02

    1. 手动制作Docker镜像

    1.1 手动制作基于yum安装nginx的Docker镜像

    1.1.1 启动基础镜像,并安装nginx

    [root@docker01 ~]# docker pull centos:7.9.2009
    [root@docker01 ~]# docker images|grep 7.9
    centos              centos7.9.2009      8652b9f0cb4c        3 weeks ago         204MB
    [root@docker01 ~]# docker run -it -p 80:80 centos:centos7.9.2009
    
    # 安装epel源和nginx
    [root@52261503115d /]# yum -y install epel-release
    [root@52261503115d /]# yum -y install nginx
    
    # 创建index.html文件并启动nginx
    [root@52261503115d ~]# rm -rf /usr/share/nginx/html/index.html
    [root@52261503115d ~]# echo "docker 01" > /usr/share/nginx/html/index.html
    [root@8aa4911fe140 ~]# nginx
    

    1.1.2 浏览器访问

    访问nginx

    1.1.3 把容器提交成镜像

    这里不要退出容器,新开一个远程连接窗口
    版本 1:关闭nginx后台运行(基于配置文件添加参数)

    # 在nginx.conf第9行添加如下内容
    daemon off;
    [root@8aa4911fe140 ~]# grep -n 'daemon off' /etc/nginx/nginx.conf
    9:daemon off;
    
    # 新开一个远程窗口,把容器commit成镜像
    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                NAMES
    8aa4911fe140        centos:centos7.9.2009   "/bin/bash"         10 minutes ago      Up 10 minutes       0.0.0.0:80->80/tcp   zealous_kowalevski
    [root@docker01 ~]# docker commit 8aa4911fe140 centos-nginx-v1:1.16.1
    [root@docker01 ~]# docker images|grep nginx-v1
    centos-nginx-v1     1.16.1              ae5f37ae62ed        36 seconds ago      408MB
    

    版本 2:不关闭nginx后台运行(基于容器启动指定参数)

    [root@8aa4911fe140 ~]# grep -n 'daemon off' /etc/nginx/nginx.conf
    9:#daemon off;
    [root@8aa4911fe140 ~]# nginx -s reload
    
    [root@docker01 ~]# docker commit 8aa4911fe140 centos-nginx-v2:1.16.1
    [root@docker01 ~]# docker images |grep centos-nginx-v2
    centos-nginx-v2     1.16.1              431699243ac8        12 seconds ago      408MB
    

    1.1.4 测试镜像可用性

    测试nginx-v1

    [root@docker01 ~]# docker run -d -p 8801:80 centos-nginx-v1:1.16.1 nginx
    

    浏览器访问

    测试nginx-v2

    [root@docker01 ~]# docker run -d -p 8802:80 centos-nginx-v2:1.16.1 nginx -g "daemon off;"  # 这里的nginx就后台运行了
    [root@docker01 ~]# docker ps -l
    CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                  NAMES
    0276cf97a823        centos-nginx-v2:1.16.1   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:8802->80/tcp   intelligent_banach
    

    浏览器访问

    1.2 手动制作基于编译安装nginx的Docker镜像

    1.2.1 初始化系统

    # 退出原来的容器,再启动一个新的容器
    [root@8aa4911fe140 ~]# exit
    exit
    [root@docker01 ~]# docker run -it -p 80:80 centos:centos7.9.2009 
    [root@bbc0e9b3cc00 /]# 
    
    # 安装常用软件
    [root@bbc0e9b3cc00 /]# yum -y install vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    
    # 安装epel源
    [root@bbc0e9b3cc00 /]# yum -y install epel-release
    

    1.2.2 在容器中编译安装nginx

    [root@bbc0e9b3cc00 /]# cd /usr/local/src/
    [root@bbc0e9b3cc00 src]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
    [root@bbc0e9b3cc00 src]# ll
    total 1012
    -rw-r--r-- 1 root root 1032630 Aug 13  2019 nginx-1.16.1.tar.gz
    
    [root@bbc0e9b3cc00 src]# tar zxf nginx-1.16.1.tar.gz
    [root@bbc0e9b3cc00 src]# cd nginx-1.16.1
    [root@bbc0e9b3cc00 nginx-1.16.1]# ./configure --prefix=/apps/nginx
    [root@bbc0e9b3cc00 nginx-1.16.1]# make
    [root@bbc0e9b3cc00 nginx-1.16.1]# make install 
    [root@bbc0e9b3cc00 nginx-1.16.1]# ll /apps/
    total 0
    drwxr-xr-x 6 root root 54 Dec  7 10:26 nginx
    
    [root@bbc0e9b3cc00 nginx-1.16.1]# echo 'make install nginx' > /apps/nginx/html/index.html
    
    [root@bbc0e9b3cc00 nginx-1.16.1]# ln -s /apps/nginx/sbin/nginx /usr/bin/
    

    1.2.3 将容器提交为镜像并运行

    [root@docker01 ~]# docker ps -l
    CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                NAMES
    bbc0e9b3cc00        centos:centos7.9.2009   "/bin/bash"         21 minutes ago      Up 21 minutes       0.0.0.0:80->80/tcp   unruffled_lehmann
    
    [root@docker01 ~]# docker commit bbc0e9b3cc00 centos-makeinstall-nginx:v1
    
    [root@docker01 ~]# docker run -d -p 8810:80 centos-makeinstall-nginx:v1 nginx -g "daemon off;"
    e6cba70ab3583737319ddf3202d9fd0401314577921bc4be76d546fdf5d7415a
    [root@docker01 ~]# docker ps -l
    CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
    e6cba70ab358        centos-makeinstall-nginx:v1   "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:8810->80/tcp   blissful_bhabha
    

    1.2.4 浏览器访问

    2. 自动制作Docker镜像

    2.1 基于Dockerfile制作镜像

    2.1.1 官方参数

    官方Dockerfile地址:https://docs.docker.com/engine/reference/builder/
    dokerfile在多次执行时,之前执行过的步骤,在没有变化的情况下,不会再执行。如果中途变化,会从变化的地方开始,从新执行一遍

    ADD  # 把宿主机的文件移动到容器的指定目录下,如果是tar.gz的压缩包,会自动解压。如果需要解压其他类型的压缩包,如zip包,则需要提前安装对应的命令
    COPY # 把宿主机的文件移动到容器的指定目录下
    ENV  # 设置环境变量
    EXPOSE  # 暴露容器端口
    FROM  # 基础镜像,就是基于哪个镜像做操作
    LABEL # 维护者信息
    STOPSIGNAL
    USER  # 指定该容器运行时的用户名和UID,后续的RUN命令也会使用这里指定的用户执行
    VOLUME  # 设置容器挂载目录
    WORKDIR # 指定工作目录
    ONBUILD
    RUN  # 在构建的过程中执行shell命令
    CMD  # 镜像在启动为容器的时候,默认执行的命令
    

    2.1.2 基于Dockerfile编译安装nginx并且自动提交为镜像

    [root@docker01 ~]# mkdir /opt/dockerfile
    [root@docker01 ~]# cd /opt/dockerfile
    [root@docker01 /opt/dockerfile]# mkdir nginx
    [root@docker01 /opt/dockerfile]# ll
    total 0
    drwxr-xr-x 2 root root 6 Dec  8 06:52 nginx
    [root@docker01 /opt/dockerfile]# cd nginx/
    [root@docker01 /opt/dockerfile/nginx]#
    [root@docker01 /opt/dockerfile/nginx]# vim Dockerfile 
    # Docker image for nginx
    
    # 使用的基础镜像
    FROM  centos:centos7.9.2009
    
    # 维护者信息
    LABEL maintainer="xts,<1184964356@qq.com>"
    
    # 传输的环境变量
    ENV password 123456
    
    # 在构建过程中执行的命令
    RUN yum install -y epel-release && yum -y install unzip vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    
    # 把宿主机当前目录的.tar.gz包解压到容器的/usr/local/src下
    ADD nginx-1.16.1.tar.gz /usr/local/src
    
    # 构建过程中执行的命令
    RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && rm -rf /apps/usr/src/nginx-1.16.1.tar.gz
    
    # 把当前目录的zip包解压到容器的/apps/nginx/html目录下
    ADD static.zip /apps/nginx/html
    
    RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip
    
    # 指定暴露的端口
    EXPOSE 80 443
    
    # 镜像在启动为容器的时候,默认执行的命令
    CMD ["/apps/nginx/sbin/nginx", "-g", "daemon off;"]
    

    2.1.3 创建dockerfile中所需文件

    [root@docker01 /opt/dockerfile]# mkdir static
    [root@docker01 /opt/dockerfile]# cd static
    [root@docker01 /opt/dockerfile/static]# echo dockerfile_nginx-make > index.html # 模拟一个新的首页文件
    [root@docker01 /opt/dockerfile]# zip /opt/dockerfile/nginx/static.zip static/*
      adding: static/index.html (stored 0%)
    

    2.1.4 执行dockerfiel,构建镜像

    [root@docker01 /opt/dockerfile/nginx]# docker build -t dockerfile_nginx-make:v1 . 
    #………………省略部分输出
    Successfully built 8ada83b374bc
    Successfully tagged dockerfile_nginx-make:v1
    
    [root@docker01 /opt/dockerfile/nginx]# docker images dockerfile_nginx-make
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    dockerfile_nginx-make   v1                  8ada83b374bc        38 seconds ago      493MB
    

    2.1.5 验证镜像可用性

    [root@docker01 /opt/dockerfile/nginx]# docker run -d -p 8810:80 dockerfile_nginx-make:v1 
    d5ed65eff4e03c2e665c5b6b4fb060b92ae6541a02442c37bffad3064c526f57
    [root@docker01 /opt/dockerfile/nginx]# docker ps -l
    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
    d5ed65eff4e0        dockerfile_nginx-make:v1   "/apps/nginx/sbin/ng…"   3 seconds ago       Up 1 second         443/tcp, 0.0.0.0:8810->80/tcp   quirky_payne
    

    浏览器访问
    默认首页
    指定页面

    3. 模拟nginx配置变更

    3.1 导出容器的nginx配置文件

    [root@docker01 ~]# docker ps -l
    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
    d5ed65eff4e0        dockerfile_nginx-make:v1   "/apps/nginx/sbin/ng…"   3 hours ago         Up 3 hours          443/tcp, 0.0.0.0:8810->80/tcp   quirky_payne
    
    [root@docker01 ~]# docker cp d5ed65eff4e0:/apps/nginx/conf/nginx.conf ./
    [root@docker01 ~]# ll
    total 8
    -rw-r--r--  1 root root 2656 Dec  8 07:49 nginx.conf
    
    [root@docker01 ~]# mv nginx.conf /opt/dockerfile/nginx/
    

    3.2 更改nginx.conf

    [root@docker01 /opt/dockerfile/nginx]# cat nginx.conf
    #…………省略部分输出
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            location /app1 {    # 新添加一个location
                proxy_pass http://10.0.0.11:8080;
            }
    #…………省略部分输出
    
    [root@docker01 ~]# docker pull tomcat  # 下载tomcat
    

    3.3 更新Dockerfile

    [root@docker01 /opt/dockerfile/nginx]# vim Dockerfile
    # Docker image for nginx
    FROM  centos:centos7.9.2009
    
    LABEL maintainer="xts,<1184964356@qq.com>"
    
    ENV password 123456
    
    RUN yum install -y epel-release && yum -y install unzip vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    
    ADD nginx-1.16.1.tar.gz /usr/local/src
    
    RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && rm -rf /apps/usr/src/nginx-1.16.1.tar.gz
    
    ADD static.zip /apps/nginx/html
    
    RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip
    
    # 把宿主机上的nginx.conf复制到容器中,并覆盖容器原来的文件
    ADD nginx.conf /apps/nginx/conf/nginx.conf   # 新添加的内容
    
    EXPOSE 80 443
    
    CMD ["/apps/nginx/sbin/nginx", "-g", "daemon off;"]
    

    3.4 构建镜像并运行容器

    [root@docker01 /opt/dockerfile/nginx]# docker build -t dockerfile_nginx-make:v2 .
    # …………省略部分输出
    Successfully built be97bbdad05f
    Successfully tagged dockerfile_nginx-make:v2
    
    # 启动容器,并查看nginx.conf的变化
    [root@docker01 /opt/dockerfile/nginx]# docker run -it -p 8811:80 dockerfile_nginx-make:v2 bash
    [root@94e6750e55cb /]# 
    [root@94e6750e55cb /]# grep app1 -A 2 /apps/nginx/conf/nginx.conf
            location /app1 {
                proxy_pass http://10.0.0.11:8080;
            }
    
    [root@94e6750e55cb /]# exit
    
    # 清理环境
    [root@docker01 /opt/dockerfile/nginx]# docker rm -f `docker ps -a -q`
    
    # 运行容器
    [root@docker01 /opt/dockerfile/nginx]# docker run -d -p 80:80 dockerfile_nginx-make:v2
    265fc668df680a394bcd29016099f99ccd1ccc5f09b1f19e293eb70ee57618e3
    [root@docker01 /opt/dockerfile/nginx]# docker ps -l
    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                         NAMES
    265fc668df68        dockerfile_nginx-make:v2   "/apps/nginx/sbin/ng…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 443/tcp   elastic_dirac
    

    3.5 浏览器访问

    nginx默认页面
    静态页面
    tocamt页面

    3.6 启动tomcat容器

    [root@docker01 ~]# docker pull tomcat
    [root@docker01 ~]# docker images | grep tomcat
    tomcat                     latest              e0bd8b34b4ea        2 weeks ago         649MB
    
    [root@docker01 ~]# docker run -it -p 8080:8080 tomcat:latest bash
    root@89d5b2ac61eb:/usr/local/tomcat# cd webapps
    root@89d5b2ac61eb:/usr/local/tomcat/webapps# ls
    root@89d5b2ac61eb:/usr/local/tomcat/webapps# mkdir app1
    root@89d5b2ac61eb:/usr/local/tomcat/webapps# echo tomcat-app1 > app1/index.html
    root@89d5b2ac61eb:/usr/local/tomcat/webapps# /usr/local/tomcat/bin/catalina.sh start
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr/local/openjdk-11
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
    

    3.7 浏览器访问

    tomcat页面
    nginx代理页面

    4. 手动制作Tomcat业务镜像(镜像分层构建)

    4.1 构建JDK基础镜像

    先基于官方提供的基础镜像,制作出安装了常用命令的自定义基础镜像,然后在基础镜像的基础之上,再制作JDK镜像、Tomcat镜像等。

    4.1.1 自定义CentOS基础镜像

    [root@docker01 ~]# mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}} -p
    [root@docker01 ~]# cd /opt/dockerfile/system/centos/
    [root@docker01 /opt/dockerfile/system/centos]# vim Dockerfile
    # Centos 7.9 base image
    
    FROM centos:centos7.9.2009
    
    LABEL xts 1184964356@qq.com
    
    RUN yum -y install epel-release && yum -y install unzip vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
    
    RUN groupadd www -g 2020 && useradd www -u 2020 -g www && groupadd nginx -g 2021 && useradd nginx -u 2021 -g nginx
    
    [root@docker01 /opt/dockerfile/system/centos]# docker build -t centos-base:7.9.2009 .
    # …………省略部分输出
    Successfully built 4d6da3dcf59f
    Successfully tagged centos-base:7.9.2009
    

    4.1.2 基于上一个基础镜像构建JDK镜像

    Jdk8下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

    [root@docker01 /opt/dockerfile/system/centos]# cd ../../web/jdk/
    [root@docker01 /opt/dockerfile/web/jdk]# mkdir jdk8-8u221
    [root@docker01 /opt/dockerfile/web/jdk]# cd jdk8-8u221
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# ll
    total 190528
    -rw-r--r-- 1 root root 195094741 Dec  8 15:05 jdk-8u221-linux-x64.tar.gz  # 准备好一个jdk的包,可在官网下载
    
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# vim Dockerfile
    FROM centos-base:7.9.2009
    
    LABEL xts 1184964356@qq.com
    
    ADD jdk-8u221-linux-x64.tar.gz /usr/local/src/
    RUN ln -sv /usr/local/src/jdk1.8.0_221 /usr/local/jdk
    # 这里添加的profile文件,是给除了root用户外的普通用户用的,因为切换到普通用户需要经过su - username,内置的sh终端,会加载profile文件。
    ADD profile /etc/profile
    
    # 这里设置的变量,是给root用户用的,因为docker容器启动的时候比较特殊,不会加载/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
    
    # 宿主机模拟java环境
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# cp jdk-8u221-linux-x64.tar.gz /usr/local/src
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# cd /usr/local/src
    [root@docker01 /usr/local/src]# tar zxf jdk-8u221-linux-x64.tar.gz 
    [root@docker01 /usr/local/src]# ln -s /usr/local/src/jdk1.8.0_221 /usr/local/jdk
    [root@docker01 /usr/local/src]# ll
    total 190524
    drwxr-xr-x 7   10  143       245 Jul  4  2019 jdk1.8.0_221
    -rw-r--r-- 1 root root 195094741 Dec  8 15:27 jdk-8u221-linux-x64.tar.gz
    [root@docker01 /usr/local/src]# ll /usr/local/jdk
    lrwxrwxrwx 1 root root 27 Dec  8 15:28 /usr/local/jdk -> /usr/local/src/jdk1.8.0_221
    
    [root@docker01 /usr/local/src]# vim /etc/profile
    [root@docker01 /usr/local/src]# tail -3 /etc/profile
    export JAVA_HOME=/usr/local/jdk
    export CLASSPATH=.:$JAVA_HOME/jre=/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    
    [root@docker01 /usr/local/src]# source /etc/profile
    [root@docker01 /usr/local/src]# java -version
    java version "1.8.0_221"
    Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
    
    # 复制profile文件到dockerfile
    [root@docker01 /usr/local/src]# cd -
    /opt/dockerfile/web/jdk/jdk8-8u221
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# cp /etc/profile ./
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# ll
    total 190532
    -rw-r--r-- 1 root root       401 Dec  8 15:26 Dockerfile
    -rw-r--r-- 1 root root 195094741 Dec  8 15:05 jdk-8u221-linux-x64.tar.gz
    -rw-r--r-- 1 root root      1978 Dec  8 15:34 profile
    

    编辑构建脚本

    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# vim build-commit.sh
    #!/bin/bash
    docker build -t centos-jdk8:8u221 .
    

    构建镜像

    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# sh build-commit.sh
    Successfully built 70e519f5a66f
    Successfully tagged centos-jdk8:8u221
    

    验证容器java环境是否正常

    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# docker run --rm -it centos-jdk8:8u221 bash
    [root@c71e5039cb57 /]# java -version
    java version "1.8.0_221"
    Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
    [root@c71e5039cb57 /]# 
    [root@c71e5039cb57 /]# tail -3 /etc/profile
    export JAVA_HOME=/usr/local/jdk
    export CLASSPATH=.:$JAVA_HOME/jre=/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    [root@c71e5039cb57 /]# id nginx
    uid=2021(nginx) gid=2021(nginx) groups=2021(nginx)
    [root@c71e5039cb57 /]# id www
    uid=2020(www) gid=2020(www) groups=2020(www)
    [root@c71e5039cb57 /]# exit
    exit
    

    4.1.3 基于JDK镜像制作Tomcat镜像

    下载地址:https://tomcat.apache.org

    # 准备tomcat包
    [root@docker01 /opt/dockerfile/web/jdk/jdk8-8u221]# cd ../../tomcat/
    [root@docker01 /opt/dockerfile/web/tomcat]# mkdir tomcat8.5.60-base
    [root@docker01 /opt/dockerfile/web/tomcat]# cd tomcat8.5.60-base
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat8.5.60-base]#  ll
    total 10244
    -rw-r--r-- 1 root root 10488933 Dec  8 16:16 apache-tomcat-8.5.60.tar.gz
    
    # 准备dockerfile
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat8.5.60-base]# vim Dockerfile
    FROM centos-jdk8:8u221
    
    LABEL xts 1184964356@qq.com
    
    ADD apache-tomcat-8.5.60.tar.gz /apps
    
    RUN ln -s /apps/apache-tomcat-8.5.60 /apps/tomcat
    
    # 编辑构建脚本并构建
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat8.5.60-base]# vim build-command.sh
    #!/bin/bash
    docker build -t centos-tomcat:8.5.60 .
    
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat8.5.60-base]# sh build-command.sh
    Successfully built a43f5f1a8d06
    Successfully tagged centos-tomcat:8.5.60
    
    # 测试镜像是否可用
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat8.5.60-base]# docker run --rm -it -p 8080:8080 centos-tomcat:8.5.60 bash
    [root@eae6f3b1a668 /]# /apps/tomcat/bin/catalina.sh start
    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
    Using CATALINA_OPTS:   
    Tomcat started.
    

    浏览器访问
    访问tomcat

    4.1.4 基于Tomcat镜像制作业务镜像

    准备server.xml文件(模拟工作中tocamt的配置文件)

    [root@be5dd073c11a /]# cd /apps/tomcat/conf/
    d073c11a conf]# ll
    total 224
    -rw------- 1 root root  12874 Nov 13 01:36 catalina.policy
    -rw------- 1 root root   7661 Nov 13 01:36 catalina.properties
    -rw------- 1 root root   1338 Nov 13 01:36 context.xml
    -rw------- 1 root root   1149 Nov 13 01:36 jaspic-providers.xml
    -rw------- 1 root root   2313 Nov 13 01:36 jaspic-providers.xsd
    -rw------- 1 root root   3916 Nov 13 01:36 logging.properties
    -rw------- 1 root root   7588 Nov 13 01:36 server.xml
    -rw------- 1 root root   2164 Nov 13 01:36 tomcat-users.xml
    -rw------- 1 root root   2558 Nov 13 01:36 tomcat-users.xsd
    -rw------- 1 root root 171879 Nov 13 01:36 web.xml
    
    
    # 新开一窗口 复制server.xml文件到宿主机
    [root@docker01 /opt/dockerfile/web/tomcat]# ll
    total 0
    drwxr-xr-x 2 root root 83 Dec  8 16:24 tomcat8.5.60-base
    [root@docker01 /opt/dockerfile/web/tomcat]# mkdir tomcat-app1
    [root@docker01 /opt/dockerfile/web/tomcat]# cd tomcat-app1
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# docker ps -l
    CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                    NAMES
    be5dd073c11a        centos-tomcat:8.5.60   "bash"              3 minutes ago       Up 3 minutes        0.0.0.0:8080->8080/tcp   elegant_poincare
    
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# docker cp be5dd073c11a:/apps/tomcat/conf/server.xml ./
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# ll
    total 12
    -rw------- 1 root root 7588 Nov 13 01:36 server.xml
    
    # 退出容器
    [root@be5dd073c11a conf]# exit
    exit
    
    # 修改server.xml默认配置
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# vim server.xml # 152行和153行修改成如下
          <Host name="localhost"  appBase="/data/tomcat/webapps"
                unpackWARs="false" # 关闭自动解压war包 autoDeploy="false">  # 关闭自动部署
    

    模拟首页文件

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# mkdir index
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# cd index
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1/index]# echo 'tomcat app 1' > index.html
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# tar zcf index.tar.gz index/*
    

    准备Dockerfile

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# cd ..
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# vim Dockerfile
    FROM centos-tomcat:8.5.60
    
    ADD server.xml /apps/tomcat/conf/server.xml
    
    ADD index.tar.gz /data/tomcat/webapps
    
    ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
    
    RUN chown www. /apps -R
    
    # 声明使用的端口,不写也不影响
    EXPOSE 8080 8005 8009
    
    CMD ["/apps/tomcat/bin/run_tomcat.sh"]
    

    准备tomcat启动脚本

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# vim run_tomcat.sh
    #!/bin/bash
    su - www -c "/apps/tomcat/bin/catalina.sh start"
    tail -f /etc/hosts
    
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# chmod +x run_tomcat.sh
    

    准备构建脚本并构建镜像

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# vim build-command.sh
    #!/bin/bash
    docker build -t centos-tomcat:app1 .
    
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# sh build-command.sh
    Successfully built 27cdfae2e624
    Successfully tagged centos-tomcat:app1
    

    启动容器并在浏览器访问

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# docker run -it -p 8080:8080 centos-tomcat:app1 
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk
    Using CLASSPATH:       /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
    127.0.0.1	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    ff00::0	ip6-mcastprefix
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    172.17.0.2	89b3131cbc71
    

    浏览器访问

    模拟新增首页文件

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app1]# cd ..
    [root@docker01 /opt/dockerfile/web/tomcat]# cp -rf tomcat-app1 tomcat-app2
    [root@docker01 /opt/dockerfile/web/tomcat]# cd tomcat-app2
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# ls
    build-command.sh  Dockerfile  index  index2  run_tomcat.sh  server.xml  tomcat-app1.tar.gz
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# rm -rf index2
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# cat index/index.html 
    tomcat app 1
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# echo 'tomcat app 2' > index/index.html
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# rm -f tomcat-app1.tar.gz 
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# tar zcf index.tar.gz index/*
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# vim build-command.sh
    #!/bin/bash
    docker build -t centos-tomcat:app2 .
    
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# sh build-command.sh
    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# docker run -it -p 8081:8080 centos-tomcat:app2
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk
    Using CLASSPATH:       /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
    127.0.0.1	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    ff00::0	ip6-mcastprefix
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    172.17.0.2	e103adb28670
    

    浏览器访问

    5. 基于alpine基础镜像制作自定义镜像

    5.1 制作基础镜像

    5.1.1 下载基础镜像alpine系统

    [root@docker01 /opt/dockerfile/web/tomcat/tomcat-app2]# cd ../../
    [root@docker01 /opt/dockerfile/web]# mv nginx nginx-ubuntu
    [root@docker01 /opt/dockerfile/web]# mkdir nginx-alpine
    [root@docker01 /opt/dockerfile/web]# docker pull alpine
    [root@docker01 /opt/dockerfile/web]# docker images | grep alpine
    alpine                     latest              d6e46aa2470d        6 weeks ago         5.57MB
    

    5.1.2 下载基础软件包

    地址:https://developer.aliyun.com/mirror/
    选择系统
    软件包下载地址
    选择操作系统版本
    包目录
    x86_64
    所有的软件包

    准备yum源

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# vim repositories
    http://mirrors.aliyun.com/alpine/v3.12/main
    http://mirrors.aliyun.com/alpine/v3.12/community
    

    准备nginx包

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
    

    准备站点文件和配置文件

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# cp /opt/dockerfile/nginx/static.zip ./
    [root@docker01 /opt/dockerfile/web/nginx-alpine]# cp /opt/dockerfile/nginx/nginx.conf ./
    # 更改nginx.conf的用户为nginx
    [root@docker01 /opt/dockerfile/web/nginx-alpine]# grep user nginx.conf
    user  nginx;
    

    准备Dockerfile和启动脚本

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# vim Dockerfile 
    FROM alpine:latest
    
    ADD repositories /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 && addgroup -g 2020 -S www && adduser -s /sbin/nologin -S -D -u 2020 -G www www && addgroup -g 2021 -S nginx && adduser -s /sbin/nologin -S -D -u 2021 -G nginx nginx
    
    ADD nginx-1.16.1.tar.gz /usr/local/src
    
    RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && ln -s /apps/nginx/sbin/nginx /usr/sbin
    
    ADD nginx.conf /apps/nginx/conf
    ADD static.zip /apps/nginx/html
    RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip && chown -R nginx. /apps
    
    CMD ["nginx", "-g", "daemon off;"]
    
    [root@docker01 /opt/dockerfile/web/nginx-alpine]# vim build-command.sh 
    #!/bin/bash
    docker build -t nginx-1.16.1:alpine .
    

    构建镜像并启动

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# sh build-command.sh
    
    Successfully built b7d4dfe98ebf
    Successfully tagged nginx-1.16.1:alpine
    [root@docker01 /opt/dockerfile/web/nginx-alpine]# docker run -it -p 80:80 nginx-1.16.1:alpine
    
    

    浏览器访问

    6. 基于ubuntu基础镜像制作自定义镜像

    [root@docker01 /opt/dockerfile/web/nginx-alpine]# cd ../nginx-ubuntu/
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# cp ../nginx-alpine/nginx-1.16.1.tar.gz ./
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# cp ../nginx-alpine/nginx.conf ./
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# cp ../nginx-alpine/static.zip ./
    
    # 准备yum源文件
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# vim sources.list 
    deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    
    # 准备dockerfile
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# vim Dockerfile 
    FROM ubuntu:18.04
    
    ADD 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 gcc openssh-server zlib1g-dev iotop unzip zip make
    
    RUN groupadd -g 2020 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2020 nginx
    
    ADD nginx-1.16.1.tar.gz /usr/local/src
    
    RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && ln -s /apps/nginx/sbin/nginx /usr/sbin
    
    ADD nginx.conf /apps/nginx/conf
    ADD static.zip /apps/nginx/html
    RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip && chown -R nginx. /apps
    
    CMD ["nginx", "-g", "daemon off;"]
    
    # 准备构建脚本
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# cat build-command.sh 
    #!/bin/bash
    docker build -t nginx-1.16.1:ubuntu .
    
    # 启动容器
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker run --rm -it -p 8888:80 nginx-1.16.1:ubuntu 
    
    

    浏览器访问

    7. ENTRYPOINT讲解

    在Dockerfile中使用的 “CMD” 参数有一个弊端,就是构建完容器,启动时如果不小心在最后面添加了命令参数,如 docker run --rm -it -p 8888:80 nginx-1.16.1:ubuntu /bin/bash,这样就会导致容器出现异常,最后添加的命令参数,会替换Dcokerfile中原有的CMD命令。
    
    而我们使用ENTRYPOINT,作用跟CMD一样,但是传递的命令是无法被替换的,凡是启动容器时额外指定的命令,都会被当成参数。
    
    例1:启动容器时添加命令
    
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker run -d -p 80:80 nginx-1.16.1:ubuntu /bin/bash  # 这里传递了一个/bin/bash命令,容器启动后直接退出了。
    e44b5ca3df248e05954205f120814608cb899468a841b8215f39345c76e3af4a
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker ps -l
    CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                     PORTS               NAMES
    e44b5ca3df24        nginx-1.16.1:ubuntu   "/bin/bash"         6 seconds ago       Exited (0) 5 seconds ago                       jovial_lehmann
    
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker run -d -p 80:80 nginx-1.16.1:ubuntu   # 这里不传递任何命令,容器就能正常启动,也就是上面说的CMD指定的命令,会被容器启动时指定的命令替换
    87da305a450bd778696fb201279ed0cefd6f9ad5d12cd14a776693159ce389b8
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker ps -l
    CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
    87da305a450b        nginx-1.16.1:ubuntu   "nginx -g 'daemon of…"   2 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   interesting_hamilton
    
    #例子2:使用ENTRYPOINT
    
    #编辑启动脚本
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# vim nginx.sh 
    #!/bin/bash
    nginx -g "daemon off;"
    
    # 更改Dockerfile
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# vim Dockerfile
    …………省略部分内容
    ADD nginx.sh /nginx.sh # 把当前目录的启动脚本复制到容器的根目录下
    ENTRYPOINT ["/bin/bash","/nginx.sh"]  # 把CMD更改成ENTRYPOINT,并且容器启动后执行脚本
    
    
    # 正常启动
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker run -d -p 80:80 nginx-1.16.1:ubuntu
    885edb2f661149eefc4654d1f866982b501a32db91be09813810074d389060f9
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker ps -l --no-trunc 
    CONTAINER ID                                                       IMAGE                 COMMAND                 CREATED             STATUS              PORTS                NAMES
    885edb2f661149eefc4654d1f866982b501a32db91be09813810074d389060f9   nginx-1.16.1:ubuntu   "/bin/bash /nginx.sh"   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   great_archimedes
    
    # 指定命令启动
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker run -d -p 81:80 nginx-1.16.1:ubuntu /bin/bash
    58c3f2556593b8ca99d7da5737846b309f583ad48edd726062ce6ab383b7ae9f
    [root@docker01 /opt/dockerfile/web/nginx-ubuntu]# docker ps -l --no-trunc 
    CONTAINER ID                                                       IMAGE                 COMMAND                           CREATED             STATUS              PORTS                NAMES
    58c3f2556593b8ca99d7da5737846b309f583ad48edd726062ce6ab383b7ae9f   nginx-1.16.1:ubuntu   "/bin/bash /nginx.sh /bin/bash"   # 这里可以看到,/bin/bash被当成的参数,不影响启动  2 seconds ago       Up 1 second         0.0.0.0:81->80/tcp   vibrant_cori
    

    8. Docker镜像分层和Dcoekrfile优化总结

    8.1 Docker镜像分层

    Docker镜像分层的好处就是可以复用相同的镜像,因为相同的内容只需加载一份到内存,修改dockerfile后,构建速度快。
    

    8.2 Dcoekrfile优化

    (1)尽量选择体积小的linux系统,如ununtu、alpine等
    (2)多个RUN合并成一个RUN,并在部署完后清理无用的文件(各种压缩包、源码包)
    (3)修改Dockerfile时,尽可能把变化的内容,放在文件结尾,这样变化之前的内容,依然读取内存,不用在执行一次,速度就很快
    (4)使用dockerignore,减少不必要的文件复制到容器中
    
  • 相关阅读:
    NPOI 操作 excel 帮助类
    文件帮助类
    浮点数精度问题
    多段文本显示省略号
    数字排序
    删除字符串首位空格
    生成一定范围的随机数
    锚链接动画
    原生js转json
    弹出遮罩和对话框
  • 原文地址:https://www.cnblogs.com/xiets/p/14087229.html
Copyright © 2011-2022 走看看