DockerFile详解及应用

一、定义

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

二、使用DockerFile构建镜像

image.png

1.构建步骤

  • 编写Dockerfile文件
  • docker build构建镜像
  • docker run 依镜像运行容器实例

2.执行流程:

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成
FROM alpine:latest 4e38e38c7ct0
MAINTAINER hcx   fb1gail4315b
CMD echo 'hello docker' 8gf243gsfe8
镜像分层.png

3.三者关系

image.png

三、DockerFile常用保留字指令

命令 用途
FROM base image ,指定一个基础镜像;(当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from)
RUN 执行命令 ,在容器内执行一个命令;(在 docker build时运行)
ADD 添加文件(将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包)
COPY 拷贝文件(类似ADD,拷贝宿主机的文件/目录到镜像中)
CMD 执行命令 (指定容器启动后的要干的事情,在docker run 时运行)
EXPOSE 暴露端口(当前容器对外暴露出的端口)
WORKDIR 指定命令运行的路径;(指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点)
MAINTAINER 维护者,镜像维护者的姓名和邮箱地址
ENV 设定环境变量(在构建镜像过程中设置环境变量)
ENTRYPOINT 容器入口,指定一个容器启动时要运行的命令
USER 指定用户,指定执行该命令的用户;(指定该镜像以什么样的用户去执行,如果都不指定,默认是root)
VOLUME mount point,指定容器所挂载的卷;(用于数据保存和持久化工作)
  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • 每条指令都会创建一个新的镜像层并对镜像进行提交

1.RUN命令

  • shell格式: RUN <命令行命令>
  • exec格式: RUN ["可执行文件","参数1","参数2"]

2.ENV命令

  • 声明:ENV MY_PATH /usr/hcx
  • 使用:WORKDIR $MY_PATH

3.CMD命令

指定容器启动后要运行的命令。

  • shell格式:CMD <命令>
  • exec格式: CMD ["可执行文件","参数1","参数2",···]
  • 参数列表:CMD ["参数1","参数2",····];在指定了ENTRYPOINT指令后,用CMD指定具体的参数。
    CMD指令可以有多个,但只有最后一个生效,CMD会被 docker run 之后的参数替换

4.ENTRYPOINT命令

指定容器启动后要运行的命令。类似CMD,但是ENTRYPOINT不会被docker run后面的命令覆盖,这些命令行参数会被当作参数传递给ENTRYPOINT指令指定的程序。

  • ENTRYPOINT["executeable","<param1>","<param1>",···]

即CMD等同于给ENTRYPOINT传参。当指定了ENTRYPOINT后,CMD的内容会作为参数传递给ENTRYPOINT指令:[<ENTRYPOINT>"<CMD>"]

FROM nginx

ENTRYPOINT ["nginx","-c"]
CMD ["/etc/nginx/nginx.conf"]
  • 不加参数正常运行:nginx -c /etc/nginx/nginx.conf
  • 手动加参数运行:docker run nginx -c /etc/nginx/nginx1.conf 就会变成:nginx -c /etc/nginx/nginx1.conf,即nginx1.conf会覆盖掉原本的nginx.conf

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

demo:
redis的dockerfile(部分内容):

FROM debian:bullseye-slim # 基于debian:bullseye-slim镜像构建
RUN groupadd -r -g 999 redis && useradd -r -g redis -u 999 redis

# 环境变量 可以在后续的run命令中使用  key-value $key来引用变量 例:$GOSU_VERSION等同于1.16
ENV GOSU_VERSION 1.16
ENV REDIS_VERSION 6.2.12
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-6.2.12.tar.gz
ENV REDIS_DOWNLOAD_SHA 75352eef41e97e84bfa94292cbac79e5add5345fc79787df5cbdff703353fb1b

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data # 容器创建成功后,通过终端登录进来默认在/data目录下

COPY docker-entrypoint.sh /usr/local/bin/ # 拷贝docker-entrypoint.sh到镜像中的/usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379 # 容器暴露6379端口
CMD ["redis-server"]

四、自定义镜像

在基础的centos镜像上安装java环境。

1.编写Dockerfile文件:

Dockerfile:

# 基于centos
FROM centos:7
MAINTAINER hcx<hcx@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 安装java8
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java

# 将宿主机的文件jdk-8u351-linux-x64.tar.gz 解压添加到容器的 /usr/local/java下
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java

# 配置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "install centos success--------------ok"
CMD /bin/bash

2.构建镜像 docker build -t 新镜像名字:TAG .

在宿主机上运行:
在docker文件夹下准备好Dockerfile和对应的资源:

hongcaixia@hongcaixiadeMacBook-Pro Documents % cd docker
hongcaixia@hongcaixiadeMacBook-Pro docker % ls
Dockerfile          jdk-8u351-linux-x64.tar.gz

hongcaixia@hongcaixiadeMacBook-Pro docker % docker build -t centos-java8:1.0 . 
[+] Building 15.6s (10/10) FINISHED                                                                                                                                                                         
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 745B                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                                                                                                           15.4s
 => [1/5] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987                                                                                      0.0s
 => [internal] load build context                                                                                                                                                                      0.0s
 => => transferring context: 190B                                                                                                                                                                      0.0s
 => CACHED [2/5] WORKDIR /usr/local                                                                                                                                                                    0.0s
 => CACHED [3/5] RUN yum -y install glibc.i686                                                                                                                                                         0.0s
 => CACHED [4/5] RUN mkdir /usr/local/java                                                                                                                                                             0.0s
 => CACHED [5/5] ADD jdk-8u351-linux-x64.tar.gz /usr/local/java                                                                                                                                        0.0s
 => exporting to image                                                                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                                                                0.0s
 => => writing image sha256:ed61e051f801980577988e66ac8c31b9a63844ad8f2b078aa9b36232699741b9                                                                                                           0.0s
 => => naming to docker.io/library/centos-java8:1.0                                                                                                                                                    0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
hongcaixia@hongcaixiadeMacBook-Pro docker % 

hongcaixia@hongcaixiadeMacBook-Pro docker % docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED         SIZE
centos-java8                                    1.0       ed61e051f801   11 hours ago    830MB
bitnami/kafka                                   latest    e7e7893c6d36   4 months ago    552MB
zookeeper                                       latest    248549379309   6 months ago    300MB
xuxueli/xxl-job-admin                           2.3.1     252b168021da   12 months ago   237MB
nginx                                           latest    605c77e624dd   17 months ago   141MB
redis                                           latest    7614ae9453d1   18 months ago   113MB
apacherocketmq/rocketmq-dashboard               latest    eae6c5db5d11   19 months ago   738MB
hello-world                                     latest    feb5d9fea6a5   20 months ago   13.3kB
centos                                          latest    300e315adb2f   2 years ago     209MB
docker.elastic.co/kibana/kibana                 7.1.0     714b175e84e8   4 years ago     745MB
docker.elastic.co/elasticsearch/elasticsearch   7.1.0     12ad640a1ec0   4 years ago     894MB
lmenezes/cerebro                                0.8.3     3a2daf87f0c7   4 years ago     333MB
hongcaixia@hongcaixiadeMacBook-Pro docker %

3.运行镜像 docker run -it 新镜像名字:TAG

hongcaixia@hongcaixiadeMacBook-Pro docker % docker run -it centos-java8:1.0
[root@5e4d9b15417d local]# java -version
java version "1.8.0_351"
Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)
[root@5e4d9b15417d local]# 

五、使用DockerFile构建微服务

1.代码

添加依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

MyController:

package com.hcx.dockerfiledemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Title: MyController.java
 * @Package com.hcx.dockerfiledemo.controller
 * @Description: (用一句话描述该文件做什么)
 * @Author: hongcaixia
 * @Date: 2023/6/15 21:35
 * @Version V1.0
 */
@RestController
@RequestMapping(value = "/my")
public class MyController {

    @GetMapping("/test")
    public String test() {
        return "hello,world";
    }
}

2.编写Dockerfile

# 基于centos
FROM java:8
MAINTAINER hcx<hcx@qq.com>

# 指定临时文件目录为/tmp 在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

# 将jar包添加到容器并更名为 hcx-docker.jar
ADD dockerfile-demo-0.0.1-SNAPSHOT.jar hcx-docker.jar

# 运行jar
RUN bash -c 'touch /hcx-docker.jar'
ENTROYPOINT ["java","-jar","/hcx-docker.jar"]

# 暴露80端口
EXPOSE 80

3.构建镜像 docker build -t 新镜像名字:TAG .

hongcaixia@hongcaixiadeMacBook-Pro docker % cd java
hongcaixia@hongcaixiadeMacBook-Pro java % ls
Dockerfile              dockerfile-demo-0.0.1-SNAPSHOT.jar
hongcaixia@hongcaixiadeMacBook-Pro java % docker build -t hcx-docker:1.0 .
[+] Building 2.1s (8/8) FINISHED                                                                                                                                                                            
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 785B                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/java:8                                                                                                                                              1.0s
 => [internal] load build context                                                                                                                                                                      0.4s
 => => transferring context: 17.70MB                                                                                                                                                                   0.4s
 => [1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d                                                                                        0.3s
 => => resolve docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d                                                                                        0.0s
 => => sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 2.00kB / 2.00kB                                                                                                         0.0s
 => => sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8 4.73kB / 4.73kB                                                                                                         0.0s
 => [2/3] ADD dockerfile-demo-0.0.1-SNAPSHOT.jar hcx-docker.jar                                                                                                                                        0.1s
 => [3/3] RUN bash -c 'touch /hcx-docker.jar'                                                                                                                                                          0.4s
 => exporting to image                                                                                                                                                                                 0.1s
 => => exporting layers                                                                                                                                                                                0.1s
 => => writing image sha256:2c8e8a4cedccca75b565b93fe411a40d1885ddd30b43beb57ecc9bba02b797f9                                                                                                           0.0s
 => => naming to docker.io/library/hcx-docker:1.0                                                                                                                                                      0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

hongcaixia@hongcaixiadeMacBook-Pro java % docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED         SIZE
hcx-docker                                      1.0       2c8e8a4cedcc   2 minutes ago   679MB
centosjava8                                     latest    e90626d6775b   24 hours ago    830MB
centos-java8                                    1.0       ed61e051f801   24 hours ago    830MB
bitnami/kafka                                   latest    e7e7893c6d36   5 months ago    552MB
zookeeper                                       latest    248549379309   6 months ago    300MB
xuxueli/xxl-job-admin                           2.3.1     252b168021da   13 months ago   237MB
nginx                                           latest    605c77e624dd   17 months ago   141MB
redis                                           latest    7614ae9453d1   18 months ago   113MB
apacherocketmq/rocketmq-dashboard               latest    eae6c5db5d11   19 months ago   738MB
hello-world                                     latest    feb5d9fea6a5   20 months ago   13.3kB
centos                                          latest    300e315adb2f   2 years ago     209MB
docker.elastic.co/kibana/kibana                 7.1.0     714b175e84e8   4 years ago     745MB
docker.elastic.co/elasticsearch/elasticsearch   7.1.0     12ad640a1ec0   4 years ago     894MB
lmenezes/cerebro                                0.8.3     3a2daf87f0c7   4 years ago     333MB
hongcaixia@hongcaixiadeMacBook-Pro java % 

4.运行镜像 docker run -it 新镜像名字:TAG

hongcaixia@hongcaixiadeMacBook-Pro java % docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED         SIZE
hcx-docker                                      1.0       2c8e8a4cedcc   2 minutes ago   679MB
centosjava8                                     latest    e90626d6775b   24 hours ago    830MB
centos-java8                                    1.0       ed61e051f801   24 hours ago    830MB
bitnami/kafka                                   latest    e7e7893c6d36   5 months ago    552MB
zookeeper                                       latest    248549379309   6 months ago    300MB
xuxueli/xxl-job-admin                           2.3.1     252b168021da   13 months ago   237MB
nginx                                           latest    605c77e624dd   17 months ago   141MB
redis                                           latest    7614ae9453d1   18 months ago   113MB
apacherocketmq/rocketmq-dashboard               latest    eae6c5db5d11   19 months ago   738MB
hello-world                                     latest    feb5d9fea6a5   20 months ago   13.3kB
centos                                          latest    300e315adb2f   2 years ago     209MB
docker.elastic.co/kibana/kibana                 7.1.0     714b175e84e8   4 years ago     745MB
docker.elastic.co/elasticsearch/elasticsearch   7.1.0     12ad640a1ec0   4 years ago     894MB
lmenezes/cerebro                                0.8.3     3a2daf87f0c7   4 years ago     333MB
hongcaixia@hongcaixiadeMacBook-Pro java % docker run -d -p 8080:8080 2c8e8a4cedcc
ef2afc6e7cb7658e1cb0df788d0c23b85e2fded3c0091288e624088526a6d31f
hongcaixia@hongcaixiadeMacBook-Pro java % docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
ef2afc6e7cb7   2c8e8a4cedcc   "java -jar /hcx-dock…"   41 seconds ago   Up 41 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   stoic_khorana
hongcaixia@hongcaixiadeMacBook-Pro java % 

5.访问测试

hongcaixia@hongcaixiadeMacBook-Pro java % curl 127.0.0.1:8080/my/test
hello,world%                                                                                                                                                                                                hongcaixia@hongcaixiadeMacBook-Pro java % 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容

  • 1. Dockerfile 命令详解: FROM 指定基础镜像(必选)所谓定制镜像,那一定是以一个镜像为基础...
    左舷的风阅读 560评论 0 5
  • 非原创,少量修改。 FROM 指定基础镜像 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。而 FROM ...
    华阳_3bcf阅读 608评论 0 0
  • FROM 指定基础镜像 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx...
    直冲车阅读 207评论 0 0
  • 文章出处:https://www.cnblogs.com/panwenbin-logs/p/8007348.htm...
    窥识阅读 379评论 0 0
  • Dockerfile指令详解 FROM指定基础镜像 定制镜像一定是以一个镜像为基础的,FROM就是指定基础镜像的指...
    wangjunjie0阅读 516评论 0 1