dockerfile

1.dockerfile基本结构

Ⅰ dockerfile是一个文本格式配置文件,用户可以使用 Dockerfile 快速创建自定义镜像,它是由一组命令语句组成,支持井号开头注释。
Ⅱ docker分为四个部分

  • 基础镜像信息→[需要指明需求哪个镜像]
  • 维护者信息→[写镜像的作者]
  • 镜像操作指令→[镜像需要执行指令]
  • 容器启动默认要执行的指令

编写dockerfile并创建镜像-容器:

1、创建镜像的目录
[root@king ~]# mkdir nginx
[root@king ~]# ls
...  nginx

2、vi/vim编辑dockerfile文件
[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 

# 指定基于的镜像
FROM centos

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

# 镜像的操作指令
RUN yum clean all && yum -y install epel-release
RUN yum -y install nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 容器启动时默认要启动的指令
CMD /usr/sbin/nginx
[退出保存]
【由于nginx下载需要epel源,配置epel网络源:
[root@king ~]# cd /etc/yum.repos.d/
[root@king yum.repos.d]# vim epel.repo   [网站https://developer.aliyun.com/mirror/]

[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
退出保存
[root@king ~]# yum clean all
 25 files removed

3、创建镜像
[root@king ~]# docker build -t nginx:v0.1.1 nginx
//创建nginx镜像,并使生成标签为nginx:v0.1.1,指定Dockerfile文件所属路径nginx(当前目录下)
...
Successfully built 7825ac3032e5
Successfully tagged nginx:v0.1.1
[root@king ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v0.1.1    7825ac3032e5   5 minutes ago    381MB

4、实验使用新生成镜像,生成容器
[root@king ~]# docker run -it nginx:v0.1.1 /bin/sh //指定登录sh
sh-4.4# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
sh-4.4# cd etc/nginx/     //可以查看到nginx配置文件
sh-4.4# ls
conf.d	      fastcgi.conf.default    koi-utf	  mime.types.default  scgi_params	   uwsgi_params.default
default.d     fastcgi_params	      koi-win	  nginx.conf	      scgi_params.default  win-utf
fastcgi.conf  fastcgi_params.default  mime.types  nginx.conf.default  uwsgi_params
sh-4.4#
[root@king ~]# docker ps
CONTAINER ID   IMAGE          COMMAND     CREATED       STATUS         PORTS     NAMES
91b45e21bf14   nginx:v0.1.1   "/bin/sh"   4 hours ago   Up 8 seconds             priceless_mendeleev

2、dockerfile指令用法

指令操作用法 指令+参数 ,dockerfile里的指令有以下几种:

FROM
MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD

FROM——必须写的指令(每个镜像使用一次)
用法:FROM +镜像名(不写版本默认拉取最新版本) 或 FROM +镜像名:版本

MAINTAINER ——维护者信息
因更新过版本写法为:LABEL MAINTAINER=“作者名+地址”

RUN——当前镜像基础上执行命令
写法为:RUN +需要执行的命令语句

CMD——指定启动容器时默认执行的指令
每个dockerfile只能有一条CMD,如果指定了多条命令,只有最后一条会被执行;
如果用户docker run启动容器时指定了运行的命令,则会覆盖掉CMD指定的指令。
写法如:CMD /usr/sbin/nginx

ENTRYPOINT
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效;如果用户docker run启动容器时指定了运行的命令,不会覆盖掉ENTRYPOINT指定的命令执行。
写法如:ENTRYPOINT /bin/sh

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile

ENTRYPOINT /bin/sh
[root@king ~]# docker build -t nginx:v0.1.2 nginx
[root@king ~]# docker run --rm -it nginx:v0.1.2 /bin/bash
sh-4.4#
复制窗口查看:
[root@king ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ce4453e9830 nginx:v0.1.2 “/bin/sh -c /bin/sh …” 13 seconds ago Up 11 seconds boring_dewdney

EXPOSE——暴露端口使用
用于告诉docker暴露的端口号是多少,供互联系统使用。
写法为:EXPOSE 22 8080

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 
...
EXPOSE 8080
...
[root@king nginx]# cd
[root@king ~]# docker build -t nginx:v0.1.3 nginx
[root@king ~]# docker run --rm -it nginx:v0.1.3
sh-4.4#
复制窗口查看:
[root@king ~]# docker ps    //查看到8080端口已暴露
CONTAINER ID   IMAGE          COMMAND                CREATED          STATUS          PORTS      NAMES
cec92a9aa586   nginx:v0.1.3   "/bin/sh -c /bin/sh"   24 seconds ago   Up 22 seconds   8080/tcp   interesting_feistel

...还可以暴露多个端口:
[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 
...
EXPOSE 8080 22
...
[root@king nginx]# cd
[root@king ~]# docker build -t nginx:v0.1.4 nginx
[root@king ~]# docker run --rm -it nginx:v0.1.4 
sh-4.4#
复制窗口查看:
[root@king ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                CREATED         STATUS         PORTS              NAMES
5230f7e0587d   nginx:v0.1.4   "/bin/sh -c /bin/sh"   5 seconds ago   Up 4 seconds   22/tcp, 8080/tcp   cool_sutherland

ENV——指定环境变量是
EVN必须写到RUN的前面!

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile
# 指定基于的镜像
FROM centos
ENV version 1.18.0    //写变量 version代替1.18.0

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

# 镜像的操作指令
RUN yum -y install wget
RUN wget -O nginx-$version.tar.gz http://nginx.org/download/nginx-$version.tar.gz && tar -xvf nginx-$version.tar.gz

# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh
...创建镜像:
[root@king ~]# docker build -t nginx:v0.1.5 nginx
...
Successfully built 485bb8476e0a
Successfully tagged nginx:v0.1.5
...用创建新镜像生成容器查看:
[root@king ~]# docker run --rm -it nginx:v0.1.5
sh-4.4# ls  //查看到下载的nginx包存在&&解压后的版本也存在
bin  etc   lib	  lost+found  mnt	    nginx-1.18.0.tar.gz  proc  run   srv  tmp  var
dev  home  lib64  media       nginx-1.18.0  opt			 root  sbin  sys  usr
sh-4.4#

ADD——可以指定某相对路径下的文件或目录下的添加到容器中
其中指定复制位置可以是dockerfile所在目录的一个相对路径或文件的;但是如果添加的是压缩包,添加到运行容器中会自动解压到目录中。
写法为:ADD +添加哪个相对路径下东西 +添加到容器哪个位置

[root@king ~]# cd nginx/
[root@king nginx]# ls
Dockerfile
[root@king nginx]# mkdir softdir
[root@king nginx]# ls
Dockerfile  softdir
[root@king nginx]# cd softdir/   
[root@king softdir]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@king softdir]# ls
nginx-1.18.0.tar.gz
[root@king softdir]# ls
nginx-1.18.0.tar.gz
[root@king softdir]# cd nginx/
[root@king nginx]# vim Dockerfile 

# 指定基于的镜像
FROM centos
ENV version 1.18.0

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

ADD softdir/nginx-1.18.0.tar.gz /tmp

# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh

...创建镜像:
[root@king ~]# docker build -t nginx:v0.1.6 nginx
...
Successfully built a5ddac22f25a
Successfully tagged nginx:v0.1.6
......用创建新镜像生成容器查看:
[root@king ~]# docker run --rm -it nginx:v0.1.6 
sh-4.4# ls tmp/  //已存在容器tmp目录下,并且是已解压
...   	 nginx-1.18.0
sh-4.4# 

COPY——复制本地主机下Dockerfile所在目录的相对路径,文件或目录
其中指定复制位置可以是dockerfile所在目录的一个相对路径或文件的;但是如果添加的是压缩包,添加到运行容器中就不会自动解压到目录中,原文件类型复制。
[适用于拷贝本地文件,必须跟dockerfile同级目录文件]
写法为:COPY softdir/nginx-1.18.0.tar.gz /tmp

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 

# 指定基于的镜像
FROM centos
#ENV version 1.18.0

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

COPY softdir/nginx-1.18.0.tar.gz /tmp

# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh

[root@king ~]# docker build -t nginx:v0.1.7 nginx
[root@king ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v0.1.7    be74c463891a   19 seconds ago   210MB
[root@king ~]# docker run --rm -it nginx:v0.1.7  
sh-4.4# cd tmp/
sh-4.4# ls  //查看到是拷贝原文件类型并未解压
...	nginx-1.18.0.tar.gz
sh-4.4#

VOLUME——添加挂载点
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
写法为:VOLUME ["/data"]

USER——指定登录容器的用户和UID
在不需要管理员执行时,可以设置普通用户登录执行;也同时可以先创建一个用户,再执行用户登录。[没有指定,默认登录root]
写法为:USER kim

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile
# 指定基于的镜像
FROM centos
#ENV version 1.18.0

# 维护者信息
LABEL MAINTAINER='securitit@162.com'


# 镜像的操作指令
RUN useradd kim   //该命令是root的命令执行的

USER kim     //相当于切换用户(su - kim)
#此时USER下RUN执行的命令都是在kim用户下执行的
RUN cd /tmp && echo "hello " >hello.txt  
# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh
[root@king ~]# docker build -t nginx:v0.1.8 nginx
[root@king ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v0.1.8    9f1f157d8eb9   13 seconds ago   210MB
[root@king ~]# docker run --rm -it nginx:v0.1.8 
sh-4.4$ cd /tmp/  //$普通用户登录
sh-4.4$ ls
hello.txt  ...
sh-4.4$ cat hello.txt 
hello 
sh-4.4$

WORKDIR——指定运行容器后直接进入的目录
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
写法为:WORKDIR /tmp/hello.txt

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 

# 指定基于的镜像
FROM centos
#ENV version 1.18.0

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

# 镜像的操作指令
RUN useradd kim

USER kim

#WORKDIR相当于cd命令,容器运行后直接进入/tmp下
WORKDIR /tmp
RUN echo "hello " >hello.txt
# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh
[root@king ~]# docker build -t nginx:v0.1.9 nginx
[root@king ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
nginx        v0.1.9    4314e5d050de   13 seconds ago      210MB
[root@king ~]# docker run --rm -it nginx:v0.1.9
sh-4.4$ pwd  //当前目录就是/tmp下
/tmp
sh-4.4$ ls
hello.txt  ...
sh-4.4$ cat hello.txt 
hello 
sh-4.4$

ONBUILD——配置的当前镜像作为下一个基于该镜像创建成新镜像后使用新镜像运行容器
只能作为下一个新镜像的版本基础,生成容器才会执行ONBUILD后的命令结果;自己运行的容器中不会执行那些命令。如下:
写法为:ONBUILD +dockerfile指令 +要运行命令

[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile 
# 指定基于的镜像
FROM centos

# 维护者信息
LABEL MAINTAINER='securitit@162.com'

ONBUILD COPY softdir/nginx-1.18.0.tar.gz /tmp
ONBUILD RUN cd /tmp && tar -xf nginx-1.18.0.tar.gz

# 容器启动时默认要启动的指令
ENTRYPOINT /bin/sh
[root@king ~]# docker build -t nginx:v0.1.10_ONBUILD nginx
[root@king ~]# docker images
REPOSITORY   TAG               IMAGE ID       CREATED             SIZE
nginx        v0.1.10_ONBUILD   c854c54f1fbb   8 seconds ago       209MB
[root@king ~]# docker run --rm -it nginx:v0.1.10_ONBUILD
sh-4.4# ls /tmp/   
ks-script-esd4my7v  ks-script-eusq_sc5

...基于镜像nginx:v0.1.10_ONBUILD基础创建新的镜像:
[root@king ~]# cd nginx/
[root@king nginx]# vim Dockerfile
# 指定基于的镜像
FROM nginx:v0.1.10_ONBUILD   //FROM跟上来源

# 维护者信息
LABEL MAINTAINER='securitit@162.com'
[root@king ~]# docker build -t nginx:v0.1.11 nginx
[root@king ~]# docker images
REPOSITORY   TAG               IMAGE ID       CREATED             SIZE
nginx        v0.1.11           04d181f394a7   9 seconds ago       217MB
[root@king ~]# docker run --rm -it nginx:v0.1.11 /bin/bash
sh-4.4# ls /tmp/    //已执行nginx:v0.1.10_ONBUILD中的ONBUILD指令
ks-script-esd4my7v  ks-script-eusq_sc5	nginx-1.18.0  nginx-1.18.0.tar.gz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值