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