Dockerfile创建容器镜像

文件名必须为Dockerfile

--Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像

基础镜像、维护者信息、操作指令、容器CMD

0fca2238a696935e8831b8c4874965d1f75.jpg

 

6604f5031376712317ba8d7a05efd2f6a9c.jpg

注:cmd 和entrypoint 告诉镜像启动时做什么

 

5dbe22d1b970f40849c73e0d7edda962823.jpg

dockerfile指令

FROM:

FROM {base镜像}

  必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 

MAINTAINER:

可选的,用来标识image作者的地方

RUN 

RUN都是启动一个容器、执行命令、然后提交存储层文件变更。

第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。

而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。

而如果需要将两条命令或者多条命令联合起来执行需要加上&&。

如:cd /usr/local/src && wget xxxxxxx

CMD:

CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)

  当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令

一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用

EXPOSE

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

entrypoint:

entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部

每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效

当定义了entrypoint以后,CMD只能够作为参数进行传递

ADD & COPY:

把host上的文件或者目录复制到image中(能够进行自动解压压缩包)  

ENV:

 用来设置环境变量,后续的RUN可以使用它所创建的环境变量 

WORKDIR:

用来指定当前工作目录(或者称为当前目录) 

USER:

 运行RUN指令的用户 

VOLUME:

 用来创建一个在image之外的mount point

1、最简单的dockerfile

cd /root/dockerfile/cmd   自定义的目录  存放dockerfile文件

vi Dockerfile

1965ab47918a8cddefacbb01f6c897027f1.jpg

2、创建镜像

6ef7a21d8cfda007c3d15b1c22b8da4d20c.jpg

该容器启动后里面会停掉,因为cmd(echo hello cmd! )命令执行结束

nginx镜像制作实战

编译/安装nginx

mkdir一个目录,在此目录内下载nginx源码包

wget  http://nginx.org/download/nginx-1.13.2.tar.gz

并创建一个Dockerfile文件,文件内制作一系列nginx的编译安装流程,内容如文件:

 

 

# base image
FROM centos

# MAINTAINER
MAINTAINER peter

# put nginx-1.13.2.tar.gz
ADD nginx-1.13.2.tar.gz /usr/local/src

# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx

# change dir to /usr/local/src/nginx-1.13.2
WORKDIR /usr/local/src/nginx-1.13.2

# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install

EXPOSE 80

41783144c94fcb18eaf93190cf3ce9a8272.jpg

ADD nginx-1.13.2.tar.gz /usr/local/src

将Dockerfile同目录下的nginx-1.13.2.tar.gz加入(copy)到镜像(启动后的容器)的/usr/local/src目录下,会自动解压

WORKDIR /usr/local/src/nginx-1.13.2   

相当于下边这些命令

RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install

是在cd  /usr/local/src/nginx-1.13.2   (进入/usr/local/src/nginx-1.13.2 目录)之下敲入执行的

其中,每一个RUN就是增加一个镜像层文件,一层层的RUN命令最终形成一系列镜像层

 

进入Dockerfile目录,运行build指令(注意最后的.代表当前路径),制作镜像

docker build -t cent-ngx2  .

ffe1da6745aa0b13914d257bb41ae33806d.jpg

我们查看一下这个镜像的层次历史

docker images 

docker history

f10ed39f7d2e5b4ee9d97330ee9104a0534.jpg

可看到,此镜像层基本与dockerfile文件的RUN是一一对应的

 

使用制作的nginx镜像,创建一个容器。

因此镜像无前台命令,因为必须指定启动命令 :/usr/local/nginx/sbin/nginx -g "daemon off;"

7ac9df65e79c1266db4faab674ddd90dc44.jpg

为镜像指定环境变量,挂载目录,默认启动命令,避免每次启动都有输入 /usr/local/nginx/sbin/nginx -g "daemon off;"

在上一版镜像的基础上,我们新加配置

新编写Dockerfile文件

c48786ac14fb02042260163e39302567359.jpg

ENV 环境

执行:docker build -t cent-ngx3  .

71c54bf6b48a1edb683d289df77bfe52c1a.jpg

查看镜像的历史,可看到比ngx2的镜像多了几个层

27d507726005ed0e77936e62de39f40d07c.jpg

ngx3的镜像创建容器,已经不需要再指定cmd命令了

可执行命令自行校验:docker run -d --name ng2 cent-ngx3

 

2a53e81bf0dd32ccf7ac8def8dcda3e1dd4.jpg

转载于:https://my.oschina.net/u/2351011/blog/3029978

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值