Linux学习-Docker学习之Dockerfile

dockerfile
  • #注释
  • 指令参数
  • dockerfile是按指令顺序从上到下执行
  • 第一个非注释行必须为FROM
  • dockerfile中执行的Shell命令为底层镜像中所包含的命令,非宿主机命令
dockerfile命令
  • FROM:基础镜像
    • FROM centos:6.9
    • FROM centos@ImageID
  • MAINTAINER(depreacted):用于让dockerfile制作者提供本人的详细信息,推荐放置在FROM后
  • LABEL:为镜像指定元数据
    • Syntax:LABEL==…
    • 一个镜像可以有多个LABEL
    • 可以在一行指定多个label数据
  • RUN:构建镜像过程中运行的命令
    • bash程序–使用&&连接多个命令
    • Syntax
      • RUN
      • RUN["","",""]
        第一种格式中,通常是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用docker stop命令停止容器时,此进程接收不到SIGTERM信号。
        第二种格式中,参数是一个JSON数组,其中为要运行的命令,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以"/bin/sh -c"来发起,因此常见的shell操作中变量替换及通配符(?,*等)替换将不会进行;如要运行的命令依赖于Shell特性的话,可以将其替换为以下格式:RUN ["/bin/sh","-c","",""]
#仅限bash程序,多个命令通过&&连接
RUN cd /etc/yum.repos.d && mkdir bak && mv *.repo bak/ && echo '[local]\nname=linuxbase\nbaseurl=ftp://192.168.88.101/centos6new\ngpgcheck=0\nenabled=1\n'>/etc/yum.repos.d/local.repo && yum ma
kecache fast && yum install -y openssh-server
  • 非bash程序–通过[]来写,第一个参数为命令,后面通过,分隔书写参数,此处方式可以将程序命令写入bash脚本,通过执行脚本实现相应功能
RUN ["mysqld","--initialize-insecure","--user=mysql","--basedir=/usr/local/mysql","--datadir=/data/mysql/data"]
  • CMD :使用镜像启动容器时运行的命令
  • EXPOSE :暴露端口,并未真实暴露,在启动容器时使用-P进行端口暴露
  • COPY:拷贝dockerfile所在目录文件(支持通配符)至容器指定目录下,如果拷贝是目录,只拷贝目录下的文件,
    • <src…>源可以有多个,目标只能有一个
      • :要复制的源文件或目录,支持使用通配符,一般为相对路径,必须是build上下文中的路径,不能是其父目录中的文件;如src为目录,则其内部文件文件或子目录会被递归复制,src目录本身不会被复制;如指定了多个src,或在src中使用了通配符,则dest必须是一个目录,且必须以/结尾。
      • :目标路径,即正在创建的image的文件系统路径,建议使用绝对路径,否则COPY指定则以WORKDIR为其起始路径;如果dest目录不存在,会自动创建。
  • ADD:功能同COPY,可以实现解压.tar.*压缩文件
    • <src…>
      • 如dest不以/结尾,url指定的文件被下载并直接创建为dest,如dest以/结尾,则文件名URL指定的文件将被下载并保存为dest/filename。
      • 如src为一个本地系统上的压缩文件(tar),将被展开为一个目录,其行为类似于tar -x命令,通过url获取的tar文件不会自动展开。
      • 如src有多个,其间接或直接使用了通配符,则dest必须是一个以/结尾的目录路径,否则被视作一个普通文件,src的内容将被直接写入dest。
  • WORKDIR:用于为dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、ADD指定设定工作目录。
  • VOLUME:用于在image创建一个挂载点目录,以挂载docker host上的卷或者其它容器上的卷。
    • Synax:VOLUME[mountpoint]
    • 如果挂载点目录路径下此前文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。
  • ENV:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令所调用,调用格式 v a r i a b l e n a m e 或 variable_name或 variablename{variable_name}
    • Syntax:1. ENV = … 2.ENV
      • 第二种格式中,key之后的所有内容均被视作其value的组成部分,因此一次只有设置一个变量
      • 第一种格式可以一次设置多个变量,每个变量为一个"="的键值对,如果value中包含空格,可以反斜线()进行转义,也可通过value加引号进行标识,反斜线可用于续行
      • 定义多个变量时,建议使用第一种格式,以便在同一层中完成
  • ENTRYPOINT:功能同CMD,但使用此指令设定的程序,在使用docker run启动容器时指定执行程序时不会被覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的指定程序;但docker run 命令的–entrypoint选项参数可覆盖ENTRYPOINT指令指定的程序。
  • USER:用于指定运行image时或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户或UID,默认情况下,container使用root身份。
    • USER |
    • 需要注意,可以是任意数字,但必须为/etc/passwd中某用户的有效ID,否则docker运行失败。
dockerfile构建centos_sshd
使用dockerfile创建centos6.9_sshd
#创建目录存放dockerfile
[root@docker ~]# mkdir -p /opt/dockerfile/centos6.9
#创建dockerfile文件
[root@docker centos6.9]# vim dockerfile
# CentOS6.10-SSHDv1.0
FROM centos@f1af727749c4
RUN cd /etc/yum.repos.d && mkdir bak && mv *.repo bak/ && echo -e "[local]\nname=linuxbase\nbaseurl=ftp://192.168.88.101/centos6new\ngpgcheck=0\nenabled=1\n">/etc/yum.repos.d/local.repo && yum ma
kecache fast && yum install -y openssh-server
RUN echo "123456" | passwd --stdin root
RUN /etc/init.d/sshd start && /etc/init.d/sshd stop
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

通过dockerfile生成镜像
[root@docker centos6.9]# docker image build -t "tye/centos6.9-sshd:v1.0" ./
[root@docker centos6.9]# docker image ls
REPOSITORY           TAG       IMAGE ID       CREATED              SIZE
tye/centos6.9-sshd   v1.0      51762c7dec10   About a minute ago   332MB
centos               6.10      f1af727749c4   4 weeks ago          194MB
centos               7         eeb6ee3f44bd   4 weeks ago          204MB
centos               latest    5d0da3dc9764   4 weeks ago          231MB
nginx                1.14      295c7be07902   2 years ago          109MB
ubuntu               15.10     9b9cb95443b5   5 years ago          137MB
#可以通过--rm参数实现容器关闭后自动销毁
[root@docker centos6.9]# docker container run -it --rm b3072f59a537 /bin/bash
#删除镜像时,使用以下命令可以删除掉通过dockerfile生成的中间镜像(前提是先删除正式镜像后,才能删除中间镜像,否则会报错)
[root@docker ~]# docker image rmi `docker image ls -a | grep 'none' | awk '{print $3}'`
通过新创建的镜像启动容器
[root@docker centos6.9]# docker run -d -p 222:22 51762c7dec10
d74c1bcd77410c9812e6dbf148c4a55dcf8bd083e3787ee098aa0485344f3c73
[root@docker centos6.9]# docker container ls
CONTAINER ID   IMAGE                 COMMAND               CREATED              STATUS              PORTS                                   NAMES
d74c1bcd7741   51762c7dec10          "/usr/sbin/sshd -D"   3 seconds ago        Up 3 seconds        0.0.0.0:222->22/tcp, :::222->22/tcp     distracted_jepsen
查看连接情况
#通过ssh连接宿主机的222端口,可以连接表示容器的sshd服务正常
[C:\~]$ ssh 192.168.88.101 222
Connecting to 192.168.88.101:222...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
[root@d74c1bcd7741 ~]# 
dockerfile基于centos7.9构建nginx(使用阿里yum源)
#centos_nginx
#使用Centos7基础镜像
FROM centos:7
#备份原有yum源,配置阿里yum源
ENV YUMPROFILE=/etc/yum.repos.d
RUN yum install -y wget && cd ${YUMPROFILE} && mkdir bak && mv *.repo bak/ && wget -O ${YUMPROFILE}/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum install -y epel-release && yum makecache fast && yum install -y nginx
#暴露80端口
EXPOSE 80
#启动容器时启动nginx
CMD ["/usr/sbin/nginx","-g","daemon off;"]
基于busybox镜像构建简单的httpd服务
FROM busybox:latest
LABEL maintainer="Tye <tye@admin.com>" app="httpd"
ENV WEB_DOC_ROOT=/data/web/html
RUN mkdir -p ${WEB_DOC_ROOT} && \
    echo "<h1>BusyBox httpd Server--Tye</h1>" > ${WEB_DOC_ROOT}/index.html
#此处命令使用bash子进程方式启动
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
dockerfile构建lamp
#dockerfile---lamp
# centos6.10_sshd_LAMP
#基础镜像
FROM centos:6.10
#配置本地yum源
RUN cd /etc/yum.repos.d && mkdir bak && mv *.repo bak/ && echo -e "[local]\nname=linuxbase\nbaseurl=ftp://192.168.88.101/centos6new\ngpgcheck=0\nenabled=1\n">/etc/yum.repos.d/local.repo && yum makecache fast && yum install -y openssh-server httpd mysql mysql-server php php-mysql
#启动sshd服务,并创建root密码
RUN /etc/init.d/sshd start && /etc/init.d/sshd stop && echo '123456' | passwd --stdin root
#初使化mysql,并创建授权用户和discuz数据库
RUN /etc/init.d/mysqld start && mysql -e "grant all on *.* to root@'%' identified by '123456';" && mysql -e "grant all on *.* to discuz@'%' identified by '123456';" && mysql -e "create database discuz charset utf8;"
RUN /etc/init.d/httpd start
#拷贝php测试文件至httpd网站目录下
COPY index.php /var/www/html/
#拷贝discuz压缩文件至httpd网站目录下并解压
ADD bbs.tar /var/www/html/
#拷贝启动脚本至一个目录,为后面CMD启动做准备
COPY init.sh /var/www/html/
#暴露sshd,mysqld,httpd端口
EXPOSE 22
EXPOSE 3306
EXPOSE 80
CMD ["/bin/bash","/var/www/html/init.sh"]

#init.sh内容如下
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值