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

阅读更多
   在前几篇中,我们已经介绍了使用docker commit 创建镜像,这一篇我们介绍使用Dockerfile创建镜像。使用Dockerfile 相比通过容器commit生成镜像有几点好处:
1. 使用容器生成比较臃肿,因为容器运行过之后,会产生一些垃圾文件,这些文件也会被生成到镜像中。
2. 使用容器生成比较难维护,比如要增删写内容,只能在现有镜像基础上,运行容器再增删完内容后,再生成镜像。后来的人,无法了解镜像是怎么生成的。
使用Dockerfile创建镜像可以很好的解决这两个问题。
首先看个Dockerfile的例子:
vim Dockerfile
#pull down centos image
FROM centos
MAINTAINER [email protected]
#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创建镜像_第1张图片

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


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

docker学习笔记【四】-使用Dockerfile创建镜像_第2张图片

部署应用:
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创建镜像_第3张图片

注意事项:
镜像中无法修改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 [email protected]
#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创建镜像_第4张图片

注意:如果访问不到,有可能是防火墙开着
systemctl stop firewalld
  • docker学习笔记【四】-使用Dockerfile创建镜像_第5张图片
  • 大小: 213.3 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像_第6张图片
  • 大小: 215 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像_第7张图片
  • 大小: 21.9 KB
  • docker学习笔记【四】-使用Dockerfile创建镜像_第8张图片
  • 大小: 46.5 KB
  • 查看图片附件

你可能感兴趣的:(docker学习笔记【四】-使用Dockerfile创建镜像)