03. 自定义镜像 & Dockerfile

2023-08-23 12:55:02 浏览数 (1)

1、前言

在前面章节中docker部署的nginx或者tomcat都是镜像仓库中已有的镜像,或是别人已经开发好的镜像。那么,在实际项目中,我们除了使用已有的镜像外,还有我们自己构建的镜像,比如项目的基础服务应用等等。

2、构建镜像的方式

构建自己的镜像有2种方式:

  1. docker commit命令。基于一个容器来创建。
  2. 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文件会包含以下几个部分内容:

  1. 基础镜像信息。使用 FROM关键字指定基础镜像信息,该命令必须是 Dockerfile 文件的第 1条指令。如上面的FROM nginx表示指定nginx为这个容器的基础镜像。
  2. 维护者信息。使用MAINTAINER 关键字指定,通常可以使用 Dockerfile 文件创建者的姓名或者电子邮件作为维护者信息。
  3. 镜像操作指令。每执行一条镜像操作指令,将在镜像中添加新的一层。可以根据需要使用一条或者多条镜像操作指令,常见的镜像操作指令有:RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等。
  4. 容器启动执行指令。用于指定在启动容器时需要执行的命令。通过关键字 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就可以看到我们的接口返回。

0 人点赞