在前面章节中docker部署的nginx或者tomcat都是镜像仓库中已有的镜像,或是别人已经开发好的镜像。那么,在实际项目中,我们除了使用已有的镜像外,还有我们自己构建的镜像,比如项目的基础服务应用等等。
构建自己的镜像有2种方式:
我们以上一篇中部署的tomcat应用为例。
docker ps
docker commit 容器id 镜像名称
可见已经生成成功。此时如果你想上传到镜像仓库中,需要先到Docker Hub中注册一个账号密码。
随后登录账号,并将该镜像推送到镜像仓库中。
# 登录仓库
docker login
# 上传
docker push 镜像名称(tomcattest_application)
除了上面docker commit命令提交方式以外,还有Dockerfile方式构建镜像。而这种方式也是我们最经常使用的。因为docker commit方式只有生成该镜像的人才知道执行了什么命令,怎么生成的镜像。而别人使用的时候根本无法感知。而Dockerfile保留了所有的构建镜像的相关信息,类似于脚本文件的形式,可以清楚的看到构建整个镜像的前后相关信息。
touch Dockerfile
FROM nginx
RUN echo '<h1>this is dockerfile create nginx image demo html</h1>' > /usr/share/nginx/html/index.html
这里构建Nginx镜像,同时创建一个简单的web网页,网页内容为:this is dockerfile create nginx image demo html
docker build -t mynginx -f Dockerfile .
在Dockerfile同级目录下执行构建脚本。
看到这个,就说明构建成功。查看下当前镜像,多了我们构建的mynginx。
docker run -d -p 8888:80 mynginx
浏览器访问:http://ip:8888可以看到刚刚我们创建的网页。
上面介绍了Dockerfile构建镜像的方式。那么我们再来详细说说关于Dockerfile,因为这个是我们后续构建自己程序镜像的重点。
Dockerfile,镜像,容器之间的关系大致如下图(网上借来的),我们使用Dockerfile文件定义镜像信息,然后通过docker build构建镜像,接着运行镜像启动容器,当然中间一样可以push到Docker Hub仓库。
Dockerfile实际是一个文本文件,其包含了一条条的指令,每一条指令都用于构建镜像中的一层,同时每一条指令的内容描述了该层应如何构建。当我们需要定制自己额外的需求时,只需要在Dockerfile文件的基础上添加或修改指令,重新生成新的镜像即可。
一个完整的Dockerfile文件会包含以下几个部分内容:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
@RequestMapping("demo")
public class TestController {
@GetMapping("index")
public String indexAction(){
return "this is dockerfile create springboot application";
}
}
server:
port: 8080
程序启动后,访问接口:http://localhost:8080/demo/index,会返回结果:this is dockerfile create springboot application内容。
# 指定基础镜像作为该容器的基础环境,如springboot应用最起码得有jdk环境
FROM openjdk:8
# 执行维护者的信息
MAINTAINER shamee csdn peng793049488
# 创建一个存放该工程的目录
RUN mkdir -p /data/project
COPY app.jar /data/project/app.jar
# 对外暴露一个8899端口
EXPOSE 8899
# 执行启动
ENTRYPOINT ["/bin/sh", "-c", "java -jar /data/project/app.jar"]
docker build -t myapp .
构建完成,docker images 可以查看到我们的镜像myapp。
docker run --name=myapp -d -p 18080:8080 myapp
访问我们的接口地址:http://192.168.74.129:18080/demo/index就可以看到我们的接口返回。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。