欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker学习笔记【四】-使用Dockerfile创建镜像  

程序员文章站 2022-06-13 19:49:29
...
   在前几篇中,我们已经介绍了使用docker commit 创建镜像,这一篇我们介绍使用Dockerfile创建镜像。使用Dockerfile 相比通过容器commit生成镜像有几点好处:
1. 使用容器生成比较臃肿,因为容器运行过之后,会产生一些垃圾文件,这些文件也会被生成到镜像中。
2. 使用容器生成比较难维护,比如要增删写内容,只能在现有镜像基础上,运行容器再增删完内容后,再生成镜像。后来的人,无法了解镜像是怎么生成的。
使用Dockerfile创建镜像可以很好的解决这两个问题。
首先看个Dockerfile的例子:
vim Dockerfile
#pull down centos image
FROM centos
MAINTAINER zhenggm@zjport.gov.cn
#copy jdk and tomcat into image
ADD ./apache-tomcat-7.0.93.tar.gz /usr/local
ADD ./jdk-7u79-linux-x64.tar.gz /usr/local
#run command
WORKDIR /usr/local
#set environment variable
ENV JAVA_HOME /usr/local/jdk1.7.0_79
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH /sbin:$JAVA_HOME/bin:$PATH
#OPEN PORT
EXPOSE 8080
#define entry point which will be run first when the container starts up
ENTRYPOINT /usr/local/apache-tomcat-7.0.93/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.93/logs/catalina.out

Dockerfile包含几种命令:
FROM 表示从哪个镜像基础上制作
MAINTAINER 表示这个镜像的维护者是谁
ADD 是将宿主机的内容拷贝到Docker容器中
WORKDIR 设置容器的工作目录
RUN 在容器中运行命令
ENV 设置容器环境变量
EXPOSE 开放端口
ENTRYPOINT 容器启动之后运行内容

然后运行生成镜像命令:
docker build -t 192.168.3.197:5000/tomcat7 .


docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         

启动容器:
docker run -d -p 8080:8080 --name tomcat7 192.168.3.197:5000/tomcat7


访问页面:
http://192.168.3.197:8080/

docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         

部署应用:
docker run -itd -p80:8080 -v/usr/local/docker/gateway:/usr/local/apache-tomcat-7.0.93/webapps/gateway 192.168.3.197:5000/tomcat7

访问应用:

docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         

注意事项:
镜像中无法修改dns配置,容器启动后会自动使用宿主机的/etc/resolv.conf. 因此如果不想每次在容器启动后修改dns, 可以将宿主机的dns改为容器需要的dns.

----------------------------------------------------------------------------------------------------------------------------------------

大部分项目到上面位置就算部署完了,但是gateway项目有注册中心的概念,启动时会把对应的ip注册上去,集群中的其它机器发现这个ip,并调用暴露的端口进行相应的操作。这时候就发现不行了,首先上面方式启动的ip,是容器自生成的一个ip,外部访问不到, 其次端口也被映射修改了。要解决这个问题,我又做了一个dockerfile,修改tomcat及docker暴露的端口为实际端口,同时在docker的启动命令中使用network=host,使容器使用的ip为宿主机的ip。这样注册的为宿主机的ip, 外部也可以通过宿主机ip和实际端口访问容器。
Dockerfile:
#pull down centos image
FROM 192.168.3.197:5000/tomcat7
MAINTAINER zhenggm@zjport.gov.cn
#run command
RUN sed -i "s/8080/8888/g"  /usr/local/apache-tomcat-7.0.93/conf/server.xml
#OPEN PORT
EXPOSE 8888

生成镜像:
docker build -t 192.168.3.197:5000/gateway .

启动命令:
docker run -itd --network host --name gateway --hostname docker_3_197 --add-host docker_3_197:192.168.3.197 -v/usr/local/docker/gateway:/usr/local/apache-tomcat-7.0.93/webapps/gateway 192.168.3.197:5000/gateway

访问地址:
http://192.168.3.133:8888/gateway/test/input

docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         

注意:如果访问不到,有可能是防火墙开着
systemctl stop firewalld
  • docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         
  • 大小: 213.3 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         
  • 大小: 215 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         
  • 大小: 21.9 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像
            
    
    
         
  • 大小: 46.5 KB