Docker-指令字运用案例

Base镜像(scratch)

Docker Hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义一个centos镜像

# 要求:
# 1、修改默认目录
# 2、默认安装vim 和 ifconfig
# 用到的指令字:FROM \ MAINTAINER \ ENV \ WORKDIR \ RUN \ EXPOSE \ CMD \
# 开始新建一个文件
vi Dockerfile02

FROM centos
MAINTAINER zp

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success------------ok"
CMD /bin/bash

# 保存,开始生成
docker build -f /mydocker/Dockerfile02 -t zzz/centos:1.4 .
# 生成完毕,运行
docker run -it zzz/centos:1.4 /bin/bash/
# 验证vim 和ifconfig 是否安装成功,pwd 查看默认目录是不是/usr/local

# 查看镜像变更记录,会列出镜像创建时安装等一些信息
docker history zzz/centos:1.4

 

# CMD \ ENTRYPOINT
# 都是指定一个容器启动时要运行的命令
# Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换
# ENTRYPOINT 不会替换会被当做参数传递,形成新的命令组合,进行追加
# build 生成下面的镜像
FROM centos
RUN yum -y install curl
CMD ["curl","-s","https://ip.cn"]

# docker run运行镜像会获取到地址,docker run myip -i后面追加参数会报错,因为参数会覆盖cmd命令
# CMD ["curl","-s","https://ip.cn"]
# 改为:ENTRYPOINT ["curl","-s","https://ip.cn"] 重新生成
# 这次再执行 docker run myip2 -i 就会正常展示头信息和IP地址信息

# CMD 是后面的覆盖前面的,ENTRYPOINT 是追加
# 如果同时存在
# 例如:
FROM centos
CMD ["echo","/usr/local"]
ENTRYPOINT ["echo","/usr"]
# build运行后显示
/usr echo /usr/local
# 但是当追加参数后
docker run test3 ee
/usr ee

# 当CMD 和 ENTRYPOINT 调换位置重新生成镜像
FROM centos
ENTRYPOINT ["echo","/usr"]
CMD ["echo","/usr/local"]
# build运行后显示
/usr echo /usr/local
# 追加参数后显示
docker run test4 ee
/usr ee

# 测试后发现 CMD 变成了ENTORYPOINT 的追加参数,并且run 后面的参数会覆盖CMD 
# ONBUILD
# 被继承时触发
# 编辑Dockerfile文件
FROM centos
RUN yum -y install curl
ENTRYPOINT ["curl","-s","https://ip.cn"]
ONBUILD RUN echo "jiji-----------"

# build编译
docker build -f /mydocker/Dockerfile -t test .

# 再次编辑一个Dockerfile文件
# 此时继承的不在是CentOS了,而是刚才build 的test
FROM test
RUN yum -y install curl
ENTRYPOINT ["curl","-s","https://ip.cn"]

# build编译
docker build -f /mydocker/Dockerfile2 -t test2 .

# 编译时在控制台就会打印
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM test
# Executing 1 build trigger
 ---> Running in 7125043ade8a
jiji-----------
Removing intermediate container 7125043ade8a

自定义tomcat

# 官网下载:apache-tomcat-9.0.30.tar.gz
# 官网下载:jdk-8u171-linux-x64.tar.gz

# vi编辑Dockerfile

FROM centos
MAINTAINER zp
#把宿主机当前上下文的c.txt拷贝到/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把tomcat和jdk添加到容器中
ADD apache-tomcat-9.0.30.tar.gz /usr/local
ADD jdk-8u171-linux-x64.tar.gz /usr/local
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置tomcat和jdk环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.30
ENV PATH $PATH;$JAVA_HOME/bin;$CATALINA_HOME/lib;$CATALINA_HOME/bin
#容器运行时监听端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.30/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.30/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.30/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.30/logs/catalina.out

# 保存build镜像(ps:镜像名称不允许包含大写字母)
docker build -f /zp/mydocker/tomcat9/Dockerfile -t zptomcat9:1.2 .

# 后台运行(可以把 卷 信息加入到镜像中)
docker run -d -p 7777:8080 -v /zp/mydocker/tomcat9/webapps/test:/usr/local/apache-tomcat-9.0.30/webapps/test -v /zp/mydocker/tomcat9/logs:/usr/local/apache-tomcat-9.0.30/logs zptomcat9:1.2

# 查看本地日志以及通过7777访问,验证是否正常

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章