docker学习笔记【四】-使用Dockerfile创建镜像
程序员文章站
2022-06-13 19:49:29
...
在前几篇中,我们已经介绍了使用docker commit 创建镜像,这一篇我们介绍使用Dockerfile创建镜像。使用Dockerfile 相比通过容器commit生成镜像有几点好处:
1. 使用容器生成比较臃肿,因为容器运行过之后,会产生一些垃圾文件,这些文件也会被生成到镜像中。
2. 使用容器生成比较难维护,比如要增删写内容,只能在现有镜像基础上,运行容器再增删完内容后,再生成镜像。后来的人,无法了解镜像是怎么生成的。
使用Dockerfile创建镜像可以很好的解决这两个问题。
首先看个Dockerfile的例子:
vim Dockerfile
Dockerfile包含几种命令:
FROM 表示从哪个镜像基础上制作
MAINTAINER 表示这个镜像的维护者是谁
ADD 是将宿主机的内容拷贝到Docker容器中
WORKDIR 设置容器的工作目录
RUN 在容器中运行命令
ENV 设置容器环境变量
EXPOSE 开放端口
ENTRYPOINT 容器启动之后运行内容
然后运行生成镜像命令:
启动容器:
访问页面:
http://192.168.3.197:8080/
部署应用:
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
访问应用:
注意事项:
镜像中无法修改dns配置,容器启动后会自动使用宿主机的/etc/resolv.conf. 因此如果不想每次在容器启动后修改dns, 可以将宿主机的dns改为容器需要的dns.
----------------------------------------------------------------------------------------------------------------------------------------
大部分项目到上面位置就算部署完了,但是gateway项目有注册中心的概念,启动时会把对应的ip注册上去,集群中的其它机器发现这个ip,并调用暴露的端口进行相应的操作。这时候就发现不行了,首先上面方式启动的ip,是容器自生成的一个ip,外部访问不到, 其次端口也被映射修改了。要解决这个问题,我又做了一个dockerfile,修改tomcat及docker暴露的端口为实际端口,同时在docker的启动命令中使用network=host,使容器使用的ip为宿主机的ip。这样注册的为宿主机的ip, 外部也可以通过宿主机ip和实际端口访问容器。
Dockerfile:
生成镜像:
启动命令:
访问地址:
http://192.168.3.133:8888/gateway/test/input
注意:如果访问不到,有可能是防火墙开着
systemctl stop firewalld
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 run -d -p 8080:8080 --name tomcat7 192.168.3.197:5000/tomcat7
访问页面:
http://192.168.3.197:8080/
部署应用:
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
访问应用:
注意事项:
镜像中无法修改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
注意:如果访问不到,有可能是防火墙开着
systemctl stop firewalld
推荐阅读
-
docker官方镜像下载及使用Dockerfile创建镜像的方法
-
Docker 学习笔记 (一)Dockerfile 创建本地镜像
-
Docker使用Dockerfile来创建镜像
-
详解使用Dockerfile创建带Apache服务的CentOS Docker镜像
-
Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
-
docker官方镜像下载及使用Dockerfile创建镜像的方法
-
docker学习笔记【四】-使用Dockerfile创建镜像
-
docker学习笔记【四】-使用Dockerfile创建镜像
-
Docker 学习笔记 (一)Dockerfile 创建本地镜像
-
Docker使用Dockerfile来创建镜像