赞
踩
构建一个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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。