Docker镜像制作-Day02

摘要:
1.手动制作Docker镜像1.1手动制作基于yum安装nginx的Docker镜像1.1.1启动基础镜像,并安装nginx[root@docker01~]#dockerpullcentos:7.9.2009[root@docker01~]#dockerimages|grep7.9centoscentos7.9.20098652b9f0cb4c3weeksago204MB[root@docker0

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

浏览器访问
Docker镜像制作-Day02第2张

测试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

浏览器访问
Docker镜像制作-Day02第3张

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 浏览器访问

Docker镜像制作-Day02第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

浏览器访问
Docker镜像制作-Day02第13张

模拟新增首页文件

[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

浏览器访问
Docker镜像制作-Day02第14张

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

浏览器访问
Docker镜像制作-Day02第21张
Docker镜像制作-Day02第22张

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 

浏览器访问
Docker镜像制作-Day02第23张
Docker镜像制作-Day02第24张

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,减少不必要的文件复制到容器中

免责声明:文章转载自《Docker镜像制作-Day02》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP-Windows下搭建PHP-MSF环境【原创】使用docker搭建gitlab服务器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)在CentOS中修改中文字符集

虽然在实际工作环境下,Linux中不建议使用中文,但是如果一定要进行中文显示,尤其对于刚接触linux且英语基础不太好的人来说,那么本文具有一定的参考价值。 本文介绍在linux的shell环境下优化linux中文显示的方法。 首先简单介绍一下字符集的概念: 简单地说,字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字...

mac os系统下制作u盘启动的Windows的系统镜像

教你如何在安了黑苹果想在黑苹果下安回windows 安装过程出现问题:使用mac自带的启动转换助手,提示u盘无法格式化等问题 所以没办法只好查询资料,然后经过我实验过后,终于成功的从黑苹果安装回windows了,所以发表一下,给需要的同学。 支持: windows7、8、10 需要的文件与设备: 1. windows ISO镜像(系统镜像不能超5G大小(w...

Linux快捷键整理

在上课了解到Linux下类似“Alt+数字”进行窗口切换的快捷键后,我也去搜集了更多资料,知道了Linux下更多的快捷键,并把这些内容整理成一个博客,方便以后查找。 在命令行下的的快捷键: 删除 ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl + k 删除光...

(三)轻量级文件服务器filebrowser

既然资料都热备好了,那在外面还想看看资料,怎么办呢? 机器好的,上个nextcloud或者owncloud,我的需求只要能下载能上传即可,要不了那么多的功能,所以此处推荐一个轻量级文件服务器filebrowser。 filebrowser在GitHub上也有6.6K的star,虽然不维护了,但论基本功能却已足够。 依然是熟悉的docker化部署: 选择哪...

nginx windows版本 1024限制

Windows版本因为文件访问句柄数被限制为1024了,当访问量大时就会无法响应。 会有如下错误提示:maximum number of descriptors supported by select() is 1024 修改参数worker_connections可以解决此限制,还有其它很多说修改worker_rlimit_nofile 参数等,都尝试...

VimDiff技巧

源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分。现在市场上很多功能很强大的专用比较和合并工具,比如 BeyondCompare;很多IDE 或者软件配置管理系统,比如Eclipse, Rational ClearCase都提供了内建的功能来支持文件的比较和合并。 当远程工作在Unix/Linux平台上的时候,恐怕最简单而...