DockerFile-Docker

导读:本篇文章讲解 DockerFile-Docker,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

什么是DockerFile

Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明,每条指令构建一层,通过docker build命令,根据Dockerfile的内容构建镜像。
因此每一条指令的内容就是描述该层如何构建。
有了dockerfile文件,我们就可以定制自己的docker镜像规则,只需要在dockerfile上添加或者修改指令,就可生成docker镜像。

Dockerfile常用指令介绍

FROM

指定基础镜像。

MAINTAINER

维护这信息

RUN

执行命令,每执行一条RUN命令,添加一个新的镜像层。

shell 格式

RUN <命令>
比如:RUN echo ‘

Hello, Docker!

’ > /usr/share/nginx/html/index.html

exec格式

RUN [“可执行文件”, “参数1”, “参数2”]
run可以写多个,每一个指令都会建立一层,比如:

RUN buildDeps='gcc libc6-dev make' \
              && apt-get update \
              && apt-get install -y $buildDeps \
              && wget -O redis.tar.gz "http://download.redis.io/release/redis-3.2.5.tar.gz" \
              && mkdir -p /usr/src/redis \
              && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
              && make -C /usr/src/redis \
              && make -C /usr/src/redis install \
              && rm -rf /var/lib/apt/lists/* \
              && rm redis.tar.gz \
              && rm -r /usr/src/redis \
              && apt-get purge -y --auto-remove $buildDeps

COPY

复制文本
COPY <源路径> … <目标路径>

  • 源路径:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go的filepath.Match规则,例如:
    COPY hom* /mydir/
    COPY hom?.txt /mydir/
  • 目标路径 :容器内的指定路径,该路径不用事先建好,路径不存在会自动创建。

ADD

高级复制文件。
ADD指令和COPY的使用格式类似(同样需求下,官方推荐使用COPY);功能也类似,不同之处如下:

  • ADD的优点:在执行<源文件>为tar压缩文件时,对于压缩格式为gzip、bzip2以及xz的情况下,会自动复制并解压到<目标路径>。
  • ADD的缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓冲失效,从而可能会令镜像构建变得比较缓慢。
    具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于RUN指令,用于运行程序,但是二者运行的时间点不同。
参数会被docker run指定的参数覆盖。

  • CMD在docker run时运行。
  • RUN是在docker build时运行。

ENTRYPOINT

类似于CMD指令,但其不会被docker run的命令行参数指定的数据覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。
但是如果运行docker run时使用了 –entrypoint选项,将覆盖ENTRYPOINT指令指定的程序。
优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。
注意:如果Dockerfile中存在多个ENTRYPOINT指令,仅最后一个生效。
格式:

ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]

示例:

ENTRYPOINT ["java","-jar","/httpUtils-0.0.1-SNAPSHOT.jar"]

使用示例

假设已经通过Dockerfile构建了nginx:test 镜像。
Dockerfile文件如下:

FROM nginx
ENTRYPOINT ["nginx", "-c"]
# 容器运行时的固定定参
CMD ["/etc/nginx/nginx.conf"]

不传参运行

$ docker run nginx:test

容器内会默认运行如下命令:
nginx -c /etc/nginx/nginx.conf

传参数运行

docker run nginx:test -c /etc/nginx/new.conf

容器内部会默认运行如下命令:
nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义环境变量,在后续的指令中可以使用ENV定义好的环境变量。
格式:
ENV
ENV = =…

VOLUME

定义匿名数据卷,在启动容器时忘记挂载数据卷时会自动挂载匿名卷。
作用:

  • 避免重要的数据因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。
    格式:
    VOLUME [“<路径1>”, “<路径2>” …]
    VOLUME <路径>
    在启动容器docker run的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明对外暴露的端口,也就是外部访问端口。
作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,方便配置映射。
  • 在运行时使用指定端口映射时,也就是docker run -P 时,会覆盖EXPOSE的端口。
    格式:
    EXPOSE <端口1> [<端口2>…]

DockerFile构建本地java项目

准备

  1. IDEA下载docker插件。
    在这里插入图片描述
  2. linux服务器上安装docker服务。
[root@localhost gxm]# cd /root
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        dea9396
 Built:             Thu Nov 18 00:36:58 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:35:20 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@localhost ~]# 

修改docker服务的对外端口

  1. 修改docker.service的对外端口号
    打开/usr/lib/systemd/system下的docker.service文件;
    把ExecStart配置项改成:
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
    在这里插入图片描述
  2. 后台服务重新加载服务配置文件
    systemctl daemon-reload
  3. 重启docker服务
    systemctl restart docker

IDEA连接docker

  1. 编辑服务配置,添加dockerFile
    在这里插入图片描述
    在这里插入图片描述
  2. 配置上图中的Server
    把连接docker 服务的方式改成tcp方式,同时指定之前配置的linux上docker对外的端口。
    在这里插入图片描述
  3. 设置其他配置
    在这里插入图片描述
  4. 查看是否连接成功
    在这里插入图片描述

构建镜像

dockerfile-maven-plugin插件

步骤1

准备一个maven项目,用来部署测试。
在pom.xml添加dockerfile-maven-plugin插件,并做相应的配置:

			<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.3.7</version>
            </plugin>

步骤2

在项目的根路径创建一个名为DockerFile的文件。
在这里插入图片描述
文件内容如下:

FROM openjdk:8-jdk-alpine
MAINTAINER docker
WORKDIR /
# 把target下的httpUtils-0.0.1-SNAPSHOT.jar拷贝的docker的/目录下
ADD target/httpUtils-0.0.1-SNAPSHOT.jar /httpUtils-0.0.1-SNAPSHOT.jar
# 对外暴露的端口
EXPOSE 8097
ENTRYPOINT ["java","-jar","/httpUtils-0.0.1-SNAPSHOT.jar"]

步骤3

通过插件将生成好的镜像部署到服务器上。
打包之前先 maven clean,然后maven package。
执行idea的docker任务启动就可以了,镜像会被部署到docker中并启动。
在这里插入图片描述
如果出现下面的连接docker失败的问题,重启idea即可。
在这里插入图片描述
重启后,可以看到docker中的镜像已经启动成功了。
在这里插入图片描述
在这里插入图片描述

只发布镜像到服务器,linux服务器上手动启动容器

注意文件名称必须为:Dockerfile,这样idea才能识别。

  1. 选择”Build Image xxx选项”,把镜像包发布到服务器。
    在这里插入图片描述
    在这里插入图片描述
  2. linux查询包已存在
    在这里插入图片描述
  3. 启动容器
[root@localhost ~]# docker container run -d --name httpUtil-test -p 8090:8080 httputils-docker:test
483af2bd813169f1a171866b20cf77edbeab8313424f8c56f1faecde54c7f311
[root@localhost ~]#
  1. 启动成功
    在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100204.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!