Dockerfile详解1-FROM 和 RUN指令

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

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

编辑 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

修改 Dockerfile-image1 文件的权限

chmod +x Dockerfile-image1

以当前目录为上下文, 构建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

查看当前镜像列表

# 发现 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

启动容器,验证 这个新的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

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

在这里插入图片描述

访问页面验证 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

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

# 以当前目录(/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
# ...

查看当前的镜像列表

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

实际有更优的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

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

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

查看镜像列表

# 由构建结果可知 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DockerfileDocker Compose是Docker生态系统中两个非常重要的工具,它们可以帮助我们更方便地构建、管理和部署Docker容器Dockerfile是一个文本文件,其中包含了一系列的指令,用于描述如何构建一个Docker镜像。通过Dockerfile,我们可以定义容器的基础镜像、安装软件、配置环境变量、暴露端口等操作。使用Dockerfile可以实现容器的自动化构建,避免手动操作的繁琐和出错。 Docker Compose是一个用于定义和运行多个Docker容器的工具。通过一个YAML文件,我们可以定义多个服务(service),每个服务可以包含一个或多个容器。在Docker Compose中,我们可以定义容器的镜像、端口映射、环境变量、数据卷等信息。使用Docker Compose可以方便地管理多个容器之间的依赖关系和通信。 下面是一个简单的Dockerfile示例: ``` FROM ubuntu:latest RUN apt-get update && apt-get install -y nginx COPY index.html /var/www/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 这个Dockerfile定义了一个基于Ubuntu最新版的Nginx镜像。首先通过apt-get安装了Nginx,然后将本地的index.html文件复制到容器中的/var/www/html/目录下。最后暴露了容器的80端口,并启动了Nginx服务。 下面是一个简单的Docker Compose示例: ``` version: '3' services: web: build: . ports: - "80:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example ``` 这个Docker Compose文件定义了两个服务:web和db。web服务使用当前目录下的Dockerfile进行构建,并将容器的80端口映射到主机的80端口。db服务使用MySQL 5.7镜像,并设置了MYSQL_ROOT_PASSWORD环境变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值