Docker分层打镜像

Posted y_zilong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker分层打镜像相关的知识,希望对你有一定的参考价值。

1自定义Centos基础镜像

[root@cent7-yzil ~]# docker pull centos:7.9.2009

[root@cent7-yzil ~]# mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv

[root@cent7-yzil ~]# cd /opt/dockerfile/system/centos/
[root@cent7-yzil centos]# cat Dockerfile 
FROM centos:7.9.2009
LABEL maintainer "yzl calm_yzl@163.com"
RUN yum install epel-release -y && yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof tmux man-pages zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel systemd-devel zlib-devel screen  strace redhat-lsb-core

RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

[root@cent7-yzil centos]# cat build-command.sh 
#!/bin/bash
docker build -t centos7.9.2009:v1 .

[root@cent7-yzil centos]# bash build-command.sh 

[root@cent7-yzil centos]# docker images 
REPOSITORY       TAG        IMAGE ID       CREATED         SIZE
centos7.9.2009   v1         74f3c49ec716   3 minutes ago   579MB

2手动制作基于centos底层镜像编译nginx镜像

#进入到指定的Dockerfile目录
[root@cent7-yzil opt]# cd dockerfile/web/nginx/
[root@cent7-yzil nginx]# pwd
/opt/dockerfile/web/nginx
#编写Dockerfile
[root@cent7-yzil nginx]# cat Dockerfile 
FROM  centos7.9.2009:v1 
LABEL maintainer "yzl calm_yzl@163.com"
ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN groupadd -g 1000 nginx && useradd -g 1000 -u 1000 nginx
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module && make && make install
RUN cd /apps/nginx/
#ADD nginx.conf /apps/nginx/conf/nginx.conf
RUN ln -s /apps/nginx/sbin/nginx /usr/bin
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]

[root@cent7-yzil nginx]# ls
build-command.sh  Dockerfile  nginx-1.18.0.tar.gz

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

[root@cent7-yzil nginx]# bash build-command.sh 

[root@cent7-yzil nginx]# docker images
REPOSITORY       TAG        IMAGE ID       CREATED          SIZE
nginx-1.18       v1         b44b5d8d58d3   26 seconds ago   612MB

#验证是否成功,浏览器打开http://10.0.0.123/
[root@cent7-yzil nginx]# docker run -it -d -p 80:80 -p 443:443 --name nginx-1.18-v1 nginx-1.18:v1 
#导出镜像nginx的配置文件到nginx下目录,重新改配置在重新打镜像
[root@cent7-yzil nginx]# docker run -it --rm nginx-1.18:v1 bash

[root@cent7-yzil nginx]# docker run -it --rm nginx-1.18:v1 bash
[root@fb76e408d239 /]# ls /apps/nginx/conf/nginx.conf
/apps/nginx/conf/nginx.conf
[root@fb76e408d239 /]# 

[root@cent7-yzil nginx]# docker cp fb76e408d239:/apps/nginx/conf/nginx.conf .
[root@cent7-yzil nginx]# ls
build-command.sh  Dockerfile  nginx-1.18.0.tar.gz  nginx.conf

[root@cent7_6 ~]# scp /etc/nginx/nginx.conf 10.0.0.123:/opt/dockerfile/web/nginx/

#修改Dockerfile,取消复制nginx
[root@cent7-yzil nginx]# cat Dockerfile 
FROM  centos7.9.2009:v1 
LABEL maintainer "yzl calm_yzl@163.com"

ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN groupadd -g 1000 nginx && useradd -g 1000 -u 1000 nginx
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module && make && make install
RUN cd /apps/nginx/
ADD nginx.conf /apps/nginx/conf/nginx.conf    #取消这行注释
RUN ln -s /apps/nginx/sbin/nginx /usr/bin
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
#nginx配置更改
[root@cent7-yzil nginx]# egrep -v "^#|^$" nginx.conf 
user nginx;
worker_processes auto;
error_log /apps/nginx/logs/error.log;
pid /usr/nginx/run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    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  /apps/nginx/logs/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /apps/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /apps/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /apps/nginx/html;
        # Load configuration files for the default server block.
        include /apps/nginx/default.d/*.conf;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

3自定义tomcat业务镜像

[root@cent7-yzil ~]# cd /opt/dockerfile/web/jdk/
[root@cent7-yzil jdk]# ls
build-command.sh  Dockerfile  jdk-8u291-linux-x64.tar.gz  profile

[root@cent7_6 ~]# scp /etc/profile 10.0.0.123:/opt/dockerfile/web/jdk/

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

#第一种
[root@cent7-yzil jdk]# cat Dockerfile 
#JDK Base image
FROM  centos7.9.2009:v1
LABEL maintainer "yzl calm_yzl@163.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


#第二种 $前需要转移 \\$,要不然会出错
[root@cent7-yzil jdk]# cat Dockerfile 
#JDK Base image
FROM  centos7.9.2009:v1
LABEL maintainer "yzl calm_yzl@163.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
RUN echo "export JAVA_HOME=/usr/local/jdk" > /etc/profile.d/jdk.sh
RUN echo "export PATH=$PATH:\\$JAVA_HOME/bin" >> /etc/profile.d/jdk.sh
RUN echo "JRE_HOME=\\$JAVA_HOME/jre" >> /etc/profile.d/jdk.sh
RUN echo "export CLASSPATH=\\$JAVA_HOME/lib/:\\$JRE_HOME/lib/" /etc/profile.d/jdk.sh
RUN source /etc/profile.d/jdk.sh
#验证是否安装成功
[root@cent7-yzil jdk]# docker run -it --rm jdk-bash:v8.291 bash
[root@80e586822463 /]# 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)

4从JDK镜像构建tomcat 8 Base 镜像5

[root@cent7-yzil tomcat]# ls
apache-tomcat-8.5.64.tar.gz  build-command.sh  Dockerfile

#第一种
[root@cent7-yzil tomcat]# cat Dockerfile 
#Tomcat Base
FROM jdk-base:v8.291
LABEL maintainer "yzl calm_yzl@163.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.64
ENV CATALINA_HOME /apps/tomcat
ENV APP_DIR ${CATALINA_HOME}/webapps

#tomcat
RUN mkdir /apps
ADD apache-tomcat-8.5.64.tar.gz /apps
RUN ln -sv /apps/apache-tomcat-8.5.64 /apps/tomcat

RUN groupadd tomcat -g 2000 && useradd tomcat -u 2000 -g tomcat
RUN chown tomcat.tomcat /apps/ -R

#第二种
[root@cent7-yzil tomcat]# cat Dockerfile 
#Tomcat Base
FROM jdk-base:v8.291
LABEL maintainer "yzl calm_yzl@163.com"

RUN echo "PATH=/apps/tomcat/bin:$PATH" > /etc/profile.d/tomcat.sh
RUN source /etc/profile.d/tomcat.sh

#tomcat
RUN mkdir /apps
ADD apache-tomcat-8.5.64.tar.gz /apps
RUN ln -s /apps/apache-tomcat-8.5.64/ /apps/tomcat

RUN groupadd tomcat -g 2000 && useradd tomcat -u 2000 -g tomcat
RUN chown tomcat.tomcat /apps/ -R


[root@cent7-yzil tomcat]# cat build-command.sh 
#/bin/bash
docker build -t tomcat-base:v8.5.64 .

[root@cent7-yzil tomcat]# bash build-command.sh 

#测试是否可以访问http://10.0.0.123:8080/
[root@cent7-yzil ~]# docker run -it -p 8080:8080 -d tomcat-base:v8.5.64
#内部启动tomcat
[root@cent7-yzil ~]# docker exec -it 0e0bf1ed74fc bash
[root@0e0bf1ed74fc /]# startup.sh

5tomcat镜像  

[root@cent7-yzil tomcat]# cat Dockerfile 
#Tomcat Base
FROM jdk-base:v8.291
LABEL maintainer "yzl calm_yzl@163.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.64
RUN echo "PATH=/usr/local/jdk/bin:/apps/tomcat/bin:$PATH" > /etc/profile.d/tomcat.sh   #变量传给普通用户
RUN source /etc/profile.d/tomcat.sh
#ENV CATALINA_HOME /apps/tomcat
#ENV APP_DIR ${CATALINA_HOME}/webapps

ENV JAVA_HOME /usr/local/jdk             #变量传给root用户
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin

#tomcat
RUN mkdir /apps
ADD apache-tomcat-8.5.64.tar.gz /apps
ADD profile /etc/
RUN ln -s /apps/apache-tomcat-8.5.64 /apps/tomcat

RUN groupadd tomcat -g 2000 && useradd tomcat -u 2000 -g tomcat
RUN chown tomcat.tomcat /apps/ -R

CMD { /apps/tomcat/bin/catalina.sh start; tail -f /etc/hosts; }    #开机启动

 

以上是关于Docker分层打镜像的主要内容,如果未能解决你的问题,请参考以下文章

06: docker镜像分层

Docker 镜像-加载原理分层原理commit镜像

Docker 镜像-加载原理分层原理commit镜像

Docker&Kubernetes ❀ Docker image镜像原理解析与分层理论说明

Docker镜像的分层和镜像的创建(Dockerfile)

Docker镜像的分层和镜像的创建(Dockerfile)