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 浏览器访问
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 浏览器访问
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 浏览器访问
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.
浏览器访问
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/
准备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,减少不必要的文件复制到容器中