目录
5、Dockerfile编写技巧之ENTRYPOINT[x.sh]配合CMD
1、安装docker并配置镜像加速
即添加国内镜像源使得拉去镜像速度加快、如网易云、腾讯云、阿里云
阿里云可通过 容器镜像服务-镜像工具-镜像加速器-获取自己专属的加速器地址,将地址添加至 /etc/docker/daemon.json中即可
[root@master1 ~]# cat /etc/docker/daemon.json
{
"data-root": "/var/lib/docker",
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"registry-mirrors": ["https://fivjgw66.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com"],
"insecure-registries": ["127.0.0.1/8"],
"max-concurrent-downloads": 10,
"live-restore": true,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "15m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
2、Dockerfile常用指令总结
- FROM 基于哪个基础镜像制作的
- LABEL 标签一般说明作者邮箱等信息,也可是对Dockerfile镜像一些描述
- ADD 复制本地文件至镜像内
- COPY 复制以及解压文件至镜像内
- ENV 定义变量;变量可用于docker built以及docker run阶段
- RUN 执行命令
- EXPOSE 暴露端口,默认为TCP
- ENTRYPOINT 访问入口,优先级比CMD高,常配合CMD达到执行脚本+可持续执行命令的作用
- CMD 一般用于容器可持续执行的命令
3、基于centos制作tomcat镜像
1、思路 centos基础镜像-jdk环境镜像-tomcat基础镜像-tomcat业务镜像
添加环境变量->添加JDK包->添加Tomcat二进制包->执行run_tomcat.sh持续命令
2、将基础镜像制作成tomcat镜像,准备的文件有:
[root@master1 dockerfile]# tree .
.
├── README.md
├── system ### 系统镜像目录
│ ├── alpine
│ └── centos
│ ├── build.sh
│ └── Dockerfile ##基于centos镜像添加一些常用应用软件
└── web ### 业务镜像目录
├── jdk ## jdk环境镜像目录
│ ├── Dockerfile ##添加JAVA_HOME及PATH等环境变量
│ ├── jdk-8u301-linux-x64.tar.gz ##jdk的包
│ └── profile ##将环境变量添加的配置文件
├── nginx
└── tomcat ### tomcat镜像目录
├── apache-tomcat-8.5.72.tar.gz ## tomcat的包
├── Dockerfile ##定义tomcat环境基础变量及添加tomcat包
└── tomcat-app1 ### 业务tomcat镜像
├── Dockerfile ##添加主页、run_tomcat.sh持续运行脚本、用户目录属性、暴露端口等
├── index.jsp ##主页
├── run_tomcat.sh ##核心命令/apps/tomcat/bin/catalina.sh start
└── server.xml ##定义主页所在目录8 directories, 12 files
--- Dockerfile文件 ----------------------------------------
## Centos基础镜像
[root@master1 dockerfile]# cat system/centos/Dockerfile
FROM centos:centos7.9.2009
LABEL maintainer="yyy"
ENV REFESH_DATA 2021-10-18
RUN yum -y install wget && rm -f /etc/yum.repos.d/* \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools \
&& yum -y install gcc make glibc glibc-devel pcre-devel openssl-devel zlib-devel \
&& yum clean all \
&& rm -f /etc/localtime \
&& ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN groupadd www -g 2021 && useradd www -u 2021 -g www
## jdk基础镜像
[root@master1 dockerfile]# cat web/jdk/Dockerfile
FROM centos-base:v1
LABEL maintainer="yyy"
ADD jdk-8u301-linux-x64.tar.gz /usr/local/src
RUN ln -s /usr/local/src/jdk1.8.0_301 /usr/local/jdk
ADD profile /etc/profile
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVE_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin
## tomcat基础镜像
[root@master1 dockerfile]# cat web/tomcat/Dockerfile
FROM centos-jdk:8u301
LABEL maintainer="yyy"
ENV TZ "Asia/Shanghai"
ENV LANG en_US.UTF-8
ENV TERM xterm
ENV TOMCAT_MAJOR_VERSION 8
ENV TOMCAT_MINOR_VERSIOn 8.5.72
ENV APP_DIR ${CATALINA_HOME}/webapps
## tomcat业务镜像
[root@master1 dockerfile]# cat web/tomcat/tomcat-app1/Dockerfile
FROM tomcat-base:v8.5.72
LABEL maintainer="yyy"
ADD server.xml /apps/tomcat/conf/server.xml
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD index.jsp /data/tomcat/webapps/app/
RUN chown -R www.www /apps/ /data/tomcat/
EXPOSE 8080 8009
CMD ["/apps/tomcat/bin/run_tomcat.sh]
--- 变动文件细节 ----------------------------------------
##jdk环境的/etc/profile文件
export JAVA_HOME=/usr/local/jdk
export TOMCAT_HOME=/apps/tomcat
export PATH=$JAVE_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVE_HOME/jre/lib:$JAVE_HOME/lib/tools.jar
## tomcat业务镜像主页jsp文件
[root@master1 dockerfile]# cat web/tomcat/tomcat-app1/index.jsp
Tomcat Page in app1
## tomcat业务镜像server.xml修改appBase网页所在目录位置
<Host name="localhost" appBase="/data/tomcat/webapps"
unpackWARs="true" autoDeploy="true">
## tomcat业务镜像CMD持续运行的脚本
[root@master1 dockerfile]# cat web/tomcat/tomcat-app1/run_tomcat.sh
#!/bin/bash
echo "namesever 180.76.76.76" > /etc/resolv.conf
su - www -c "/apps/tomcat/bin/catalina.sh start"
su - www -c "tail -f /etc/hosts"
4、利用桥接实现不同宿主机之间容器互联
1、容器两端默认网桥模式,各容器网段不同;先添加对端容器所在网段的路由、添加iptables规则修改FORWARD
- route add -net 192.168.1.0/24 gw 10.0.0.1
- iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT #实现NAT内网地址到外网
2、另外一种将宿主机网卡加入网桥中不常用也不推荐
3、使用Open vSwitch(GRE隧道原理)
5、Dockerfile编写技巧之ENTRYPOINT[x.sh]配合CMD
通常要实现一段大部分的脚本或很多行命令集合执行在Dockerfile怎么实现,将脚本末尾添加“$@”这个
通过将.sh脚本后面添加 ,在Dockerfile配合ENTRYPOINT和CMD达到的效果为:
CMD的内容都将成为参数传入到ENRTYPOINT里的命令,且此时脚本末尾为$@,表示命令行中传参将追加替换至脚本末尾,实现脚本+可持续执行的命令的效果
1、达到该镜像能够持续运行不退出的效果【CMD命令】
2、能够将脚本于ENTRYPOINT和CMD融合,达到即执行了脚本又能持续执行CMD中命令的效果。
如下面Haproxy镜像Dockerfile文件的构造