构建一个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