当前位置:   article > 正文

Dockerfile详解1-FROM 和 RUN指令_dockerfile run 需要选择1

dockerfile run 需要选择1

构建一个nginx镜像,定制初始页

cd /home/docker/docker-command-test/image-command
  • 1

编辑 Dockerfile-image1: vim Dockerfile-image1

FROM nginx
MAINTAINER itboat008
RUN echo '<h1>hello Dockerfile, this is my nginx page!</h1>' >  /usr/share/nginx/html/index.html
  • 1
  • 2
  • 3

修改 Dockerfile-image1 文件的权限

chmod +x Dockerfile-image1
  • 1

以当前目录为上下文, 构建nginx镜像

# 注意: 如果没有 -f 选项, 默认从 上下文中查找 Dockerfile的文件,没有会报错
# -t 选项是给镜像打标签
# 最后的 "." 是指定构建镜像的上下文,  首先会复制指定目录下的文件到 服务端Docker守护进程里
[root@itboat008 image-command]# docker build -f Dockerfile-image1 -t nginx:alpha-z .
## 以下为构建的输出内容:
# 发送构建上下文给 Docker daemon
Sending build context to Docker daemon  2.048kB
# 从 registry中下载 nginx最新的镜像
Step 1/3 : FROM nginx
latest: Pulling from library/nginx
b380bbd43752: Pull complete 
fca7e12d1754: Pull complete 
745ab57616cb: Pull complete 
a4723e260b6f: Pull complete 
1c84ebdff681: Pull complete 
858292fd2e56: Pull complete 
Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
Status: Downloaded newer image for nginx:latest
 ---> 87a94228f133
#设置维护人信息: itboat008, 并在启动了一个新的容器 fa306c682745
Step 2/3 : MAINTAINER itboat008
 ---> Running in fa306c682745
# 注意这个是一个中间状态的容器, 在指令执行成功之后会删除这个容器
Removing intermediate container fa306c682745
 ---> 1809b79cd3e1
# 向镜像中写入一个文件: index.html
Step 3/3 : RUN echo '<h1>hello Dockerfile, this is my nginx page!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 1af3bdea62ba
Removing intermediate container 1af3bdea62ba
 ---> d6a184bc6e80
#成功构建镜像,返回镜像id
Successfully built d6a184bc6e80
#成功给这个镜像打标签: nginx:alpha-z 
Successfully tagged nginx:alpha-z
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

查看当前镜像列表

# 发现 nginx:alpha-z 镜像已经有了
[root@itboat008 image-command]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        alpha-z   d6a184bc6e80   12 minutes ago   133MB
oom-test     foxer     ec941ccbd934   45 hours ago     668MB
oom-test     latest    9b0811481ab9   2 days ago       668MB
redis        latest    7faaec683238   11 days ago      113MB
nginx        latest    87a94228f133   12 days ago      133MB
java         8         d23bdf5b1b1b   4 years ago      643MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

启动容器,验证 这个新的nginx镜像

# 容器名称设置为: nginx-alpha-z
# -d 后台运行
# -p 宿主机端口:容器内部端口 映射
# 返回 容器id
[root@itboat008 image-command]# docker run -it --name nginx-alpha-z -d -p 8889:80 nginx:alpha-z
6ca06a04610360bc91454068e1f81d6ddd57553cea141af06aa461e70e526e54
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查看当前正在运行的容器列表

在这里插入图片描述

访问页面验证 http://ip:8889/ ,展示Dockerfile中编写的首页内容

在这里插入图片描述

注意:

Dockerfile 中的每一个指令都会在镜像中建立一层,因此准备镜像时候的一些中间操作可以合并到一个指令中去执行,并且只需要保留最终需要的文件,过程中生成的不必要文件需要删除掉。这样可以减少镜像的构建体积、层数和构建部署的时间。

假设有这个需求:

在 centos镜像基础上,下载并安装redis,生成一个新的镜像, 使用Dockerfile制作。

以下是对应的初版Dockerfile的内容:

cd /home/docker/docker-command-test/Dockerfile-test
#编辑一个Dockerfile
vim first-Dockerfile
#以下是整个Dockerfile的内容
FROM centos
MAINTAINER itboat008
#安装依赖
RUN yum install -y gcc wget make
RUN mkdir -p /home/redis-test/
#下载
RUN wget -O /home/redis-test/redis.tar.gz "http://download.redis.io/releases/redis-6.2.6.tar.gz"
#解压
RUN tar -xzf redis.tar.gz -C /home/redis-test/redis --strip-components=1
RUN make -C /home/redis-test/redis
#安装
RUN make -C /home/redis-test/redis install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

构建这个镜像,观察输出的内容

# 以当前目录(/home/docker/docker-command-test/Dockerfile-test)为上下文, 查找first-Dockerfile文件,构建的镜像标签是redis:tmp
docker build -f first-Dockerfile -t redis:tmp .
#观察输出: 
# 首先向Docker服务端守护进程发送上下文中的文件
Sending build context to Docker daemon  2.048kB
# Dockerfile中总共是8个指令,所以分为8个构建步骤
# 下载基础镜像 centos 
Step 1/8 : FROM centos
 ---> 5d0da3dc9764
Step 2/8 : MAINTAINER itboat008
 ---> Running in 783cfc70af8d
 #操作完成之后会删除中间状态的容器
Removing intermediate container 783cfc70af8d
 ---> 7a76c8e0fd2f
# 安装必要的依赖库
Step 3/8 : RUN yum install -y gcc wget make
 ---> Running in b2d87c6ce605
# ... 省略下载安装的输出
 Removing intermediate container b2d87c6ce605
 ---> 3394af969782
# 创建目录
Step 4/8 : RUN mkdir -p /home/redis-test/redis/
 ---> Running in 0d54718132af
Removing intermediate container 0d54718132af
 ---> 346cc14a8ce6
#下载安装包 
Step 5/8 : RUN wget -O /home/redis-test/redis.tar.gz "http://download.redis.io/releases/redis-6.2.6.tar.gz"
 ---> Running in 7d3ec81be08f
Removing intermediate container 7d3ec81be08f
 ---> 058628f6be69
#解压到对应目录
Step 6/8 : RUN tar -xzf /home/redis-test/redis.tar.gz -C /home/redis-test/redis --strip-components=1
 ---> Running in dcaef3f64be1
Removing intermediate container dcaef3f64be1
 ---> fed1092208a8
Step 7/8 : RUN make -C /home/redis-test/redis
 ---> Running in 1f304c226dff
 Removing intermediate container 1f304c226dff
 ---> a49fd0e5003c
#安装
Step 8/8 : RUN make -C /home/redis-test/redis install
 ---> Running in fa6f07594bbc
# ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

查看当前的镜像列表

[root@itboat008 Dockerfile-test]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        tmp       a852a32dcacf   9 minutes ago   566MB
  • 1
  • 2
  • 3

实际有更优的Dockerfile编写方法, 可使得构建步骤更精简,最终生成的镜像文件体积更小,更易于快速部署

创建 Dockerfile-beta

FROM centos
MAINTAINER itboat008
# set -x : 使shell输出正在运行的每个命令,有利于脚本调试
# 将之前的指令合并到一个RUN指令下, 这样构建出来的镜像只有三层, 并且在最后删除了不必要保留的文件
RUN set -x;mylibs='gcc wget make'\
    && yum install $mylibs \
    && mkdir -p /home/redis-test/redis/ \
    && wget -O /home/redis-test/redis.tar.gz "http://download.redis.io/releases/redis-6.2.6.tar.gz" \
    && tar -xzf /home/redis-test/redis.tar.gz -C /home/redis-test/redis --strip-components=1 \
    && make -C /home/redis-test/redis \
    && make -C /home/redis-test/redis install \
    && rm /home/redis-test/redis.tar.gz \
    && yum remove $mylibs
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

构建这个新镜像,观察输出

Sending build context to Docker daemon  3.072kB
#  发现整个镜像构建仅分为三步, 即镜像为三层
Step 1/3 : FROM centos
 ---> 5d0da3dc9764
Step 2/3 : MAINTAINER itboat008
 ---> Using cache
 ---> 7a76c8e0fd2f
# RUN指令 中待执行的shell
Step 3/3 : RUN set -x;mylibs='gcc wget make'    && yum install -y  $mylibs     && mkdir -p /home/redis-test/redis/     && wget -O /home/redis-test/redis.tar.gz "http://download.redis.io/releases/redis-6.2.6.tar.gz"     && tar -xzf /home/redis-test/redis.tar.gz -C /home/redis-test/redis --strip-components=1     && make -C /home/redis-test/redis     && make -C /home/redis-test/redis install     && rm /home/redis-test/redis.tar.gz     && yum remove -y $mylibs
 ---> Running in fd90061032b8
# 因为 set -x的设置, 会打印出对应的shell并高亮显示,方便调试脚本
+ mylibs='gcc wget make'
+ yum install -y gcc wget make
# ...省略安装输出
+ mkdir -p /home/redis-test/redis/
+ wget -O /home/redis-test/redis.tar.gz http://download.redis.io/releases/redis-6.2.6.tar.gz
#...
+ tar -xzf /home/redis-test/redis.tar.gz -C /home/redis-test/redis --strip-components=1
+ make -C /home/redis-test/redis
+ make -C /home/redis-test/redis install
+ rm /home/redis-test/redis.tar.gz
+ yum remove -y gcc wget make
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

查看镜像列表

# 由构建结果可知 redis:cannon 镜像构建更优
[root@itboat008 Dockerfile-test]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
redis        cannon    91cc6a22fc8f   12 minutes ago   470MB
redis        tmp       a852a32dcacf   53 minutes ago   566MB
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/203116
推荐阅读
  

闽ICP备14008679号