1、前言
在前面章节中docker部署的nginx或者tomcat都是镜像仓库中已有的镜像,或是别人已经开发好的镜像。那么,在实际项目中,我们除了使用已有的镜像外,还有我们自己构建的镜像,比如项目的基础服务应用等等。
2、构建镜像的方式
构建自己的镜像有2种方式:
- docker commit命令。基于一个容器来创建。
- Dockerfile方式构建。
我们以上一篇中部署的tomcat应用为例。
2.1、docker commit
2.1.1、先查看下当前的容器
代码语言:javascript复制docker ps
2.1.2、生成该容器镜像
代码语言:javascript复制docker commit 容器id 镜像名称
2.1.3、查看镜像列表
可见已经生成成功。此时如果你想上传到镜像仓库中,需要先到Docker Hub中注册一个账号密码。
随后登录账号,并将该镜像推送到镜像仓库中。
代码语言:javascript复制# 登录仓库
docker login
# 上传
docker push 镜像名称(tomcattest_application)
2.2、Dockerfile
除了上面docker commit命令提交方式以外,还有Dockerfile方式构建镜像。而这种方式也是我们最经常使用的。因为docker commit方式只有生成该镜像的人才知道执行了什么命令,怎么生成的镜像。而别人使用的时候根本无法感知。而Dockerfile保留了所有的构建镜像的相关信息,类似于脚本文件的形式,可以清楚的看到构建整个镜像的前后相关信息。
2.2.1、创建Dockerfile文件
代码语言:javascript复制touch Dockerfile
2.2.2、编写Dockerfile文件
代码语言:javascript复制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
2.2.3、构建镜像
代码语言:javascript复制docker build -t mynginx -f Dockerfile .
在Dockerfile同级目录下执行构建脚本。
- -t : 指定镜像名称。
- -f :指定Dockerfile文件,如果文件名为Dockerfile,则可以省略。如果自定义文件名,如myDockerFile,则需要-f myDockerFile
看到这个,就说明构建成功。查看下当前镜像,多了我们构建的mynginx。
2.2.4、使用该镜像生成容器
代码语言:javascript复制docker run -d -p 8888:80 mynginx
浏览器访问:http://ip:8888可以看到刚刚我们创建的网页。
3、Dockerfile
上面介绍了Dockerfile构建镜像的方式。那么我们再来详细说说关于Dockerfile,因为这个是我们后续构建自己程序镜像的重点。
Dockerfile,镜像,容器之间的关系大致如下图(网上借来的),我们使用Dockerfile文件定义镜像信息,然后通过docker build构建镜像,接着运行镜像启动容器,当然中间一样可以push到Docker Hub仓库。
3.1、什么是Dockerfile
Dockerfile实际是一个文本文件,其包含了一条条的指令,每一条指令都用于构建镜像中的一层,同时每一条指令的内容描述了该层应如何构建。当我们需要定制自己额外的需求时,只需要在Dockerfile文件的基础上添加或修改指令,重新生成新的镜像即可。
一个完整的Dockerfile文件会包含以下几个部分内容:
- 基础镜像信息。使用 FROM关键字指定基础镜像信息,该命令必须是 Dockerfile 文件的第 1条指令。如上面的FROM nginx表示指定nginx为这个容器的基础镜像。
- 维护者信息。使用MAINTAINER 关键字指定,通常可以使用 Dockerfile 文件创建者的姓名或者电子邮件作为维护者信息。
- 镜像操作指令。每执行一条镜像操作指令,将在镜像中添加新的一层。可以根据需要使用一条或者多条镜像操作指令,常见的镜像操作指令有:RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等。
- 容器启动执行指令。用于指定在启动容器时需要执行的命令。通过关键字 CMD、ENTRYPOINT 指定。
3.2、Idea集成Dockerfile构建镜像
3.2.1、先构建一个简单的springboot应用
代码语言:java复制@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
代码语言:java复制@RestController
@RequestMapping("demo")
public class TestController {
@GetMapping("index")
public String indexAction(){
return "this is dockerfile create springboot application";
}
}
代码语言:yaml复制server:
port: 8080
程序启动后,访问接口:http://localhost:8080/demo/index,会返回结果:this is dockerfile create springboot application内容。
3.2.2、编写Dockerfile
代码语言:javascript复制# 指定基础镜像作为该容器的基础环境,如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"]
3.2.3、文件上传到/data/project下
3.2.4、构建镜像
代码语言:javascript复制docker build -t myapp .
构建完成,docker images 可以查看到我们的镜像myapp。
3.2.5、启动
代码语言:javascript复制docker run --name=myapp -d -p 18080:8080 myapp
访问我们的接口地址:http://192.168.74.129:18080/demo/index就可以看到我们的接口返回。