dockerfile

构建镜像三种方式

  1. Dockerfile
  2. 基于本地模板进行构建
  3. 基于已有的镜像容器进行创建镜像

用于容器进行大批量修改,镜像并没有修改的时候,打包成镜像上传到镜像仓库,给别人使用

Dockerfile

Docker镜像分层

Dockerfile中的每个指令都会创建一个新的(临时)镜像层

镜像层将被缓存和复用

当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

在这里插入图片描述

容器(可读,可写层)
服务本身镜像层(只读层,模板)
依赖环境镜像层(只读层,模板)
基础镜像镜像层(为以上的系统服务提供支持)
底层内核层

dockerfile操作指令

指令含义
FROM 镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字说明新镜像的维护人信息
RUN命令在所基于的镜像上执行命令,并提交到新的镜像中
CMD [”要运行的程序”,”参数1,"参数2 "]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行
EXPOSE 端口号指定新镜像加载到Docker时要开启的端口
ENV 环境变量 变量值设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录"]在容器中创建一个挂载点
USER 用户名/UID指定运行容器时的用户
WORKDIR 路径(类似cd)为后续的RUN、CMD、ENTRYPOINT指定工作自录
ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查
  • COPY和ADD的区别
  1. COPY 只能复制
  2. ADD ① 复制,②解压,③ 可操作的对象,不仅是文件,也可以是URL
  • CMD和entrypoint区别
  1. CMD:CMD指令是我们自定义的,让容器运行时的一个执行程序,在dockerfile里面如果出现多个CMD指令,只会最后一个生效
  2. ENTRYPOINT:是指系统在启动时默认运行的第一个执行程序

dockerfile运用

使用Dockerfile安装apache

[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
FROM centos                         #基于的基础镜像
MAINTAINER shuaige                  #维护镜像的用户信息
RUN yum -y update                   #镜像操作指令安装apache软件
RUN yum -y install httpd        
EXPOSE 80                           #开启80端口
ADD index.html /var/www/html/index.html   #复制网站首页文件
ADD run.sh /run.sh                  #执行脚本复制到镜像中
RUN chmod 755 /run.sh  
CMD ["/run.sh"]                     #启动容器时执行脚本

[root@docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*                 #删除Apache缓存
exec /usr/shbin/apachectl -D FOREGROUND   
#exec执行,apachectl -D 守护进程 FOREGROUND启动

[root@docker apache]# vim index.html
so cool

##生成镜像
[root@docker apache]# docker build -t http:centos .     #注意末尾有"."  .为本地目录的意思
.....
Successfully built 84d4a3aa3679
Successfully tagged http:centos

[root@docker apache]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
http          centos    84d4a3aa3679   14 minutes ago   541MB    #镜像创建成功
  • 过程解析
[root@docker apache]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
33588b023839   bc3cbf8d85b2   "/bin/sh -c 'yum -y …"   13 minutes ago   Exited (1) 12 minutes ago             naughty_nash
5a31b7c04d8d   bc3cbf8d85b2   "/bin/sh -c 'yum -y …"   16 minutes ago   Exited (1) 16 minutes ago             quirky_colden
d84f134e223d   f6d0b4767a6c   "/docker-entrypoint.…"   33 hours ago     Exited (0) 33 hours ago               focused_jemison
7050105cee05   f6d0b4767a6c   "/docker-entrypoint.…"   33 hours ago     Exited (137) 33 hours ago             sweet_yonath

由此可见,dockerfile在运行过程中,每一步运行会创建一个临时容器和镜像,运行完成后将临时容器删除,再进行下一步操作。

  • 新镜像运行容器
[root@docker apache]# docker run -d -p 1234:80 http:centos
# -p(小写):表示指定内部容器端口映射的端口号,与外部通信
# -P(大写): 表示随机端口
[root@docker apache]# docker ps -a 
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                       PORTS                  NAMES
58f908ac43d5   httpd:centos   "/run.sh"                2 minutes ago    Up 2 minutes                 0.0.0.0:1234->80/tcp   beautiful_mclean
  • 验证效果

访问 http://192.168.15.11:1234/

在这里插入图片描述

使用Dockerfile安装tomcat

[root@docker tomcat]# mkdir /opt/tomcat
[root@docker ~]# cd /opt/tomcat/
[root@docker tomcat]# ls    #需要传入文件
apache-tomcat-8.5.16.tar.gz  jdk-8u91-linux-x64.tar.gz    
[root@docker tomcat]# vim dockerfile
from centos:7
maintainer good
add jdk-8u91-linux-x64.tar.gz /usr/local
workdir /usr/local/
run mv jdk1.8.0_91/ /usr/local/java
env JAVA_HOME /usr/local/java
env JAVA_JRE /usr/local/java/jre
env PATH $PATH:/use/local/java/bin:/usr/local/java/jre/bin
env CLASSPATH /usr/lcoal/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charests.jar
add apache-tomcat-8.5.16.tar.gz /usr/local
workdir /usr/local/
run mv apache-tomcat-8.5.16 /usr/local/tomcat8
expose 8080
#cmd ["/usr/local/tomcat8/bin/catalina.sh","run"]
entrypoint ["/usr/local/tomcat8/bin/catalina.sh","run"]

[root@docker tomcat]# docker build -t tomcat:centos .
Successfully built eef0a7ea4f40
Successfully tagged tomcat:centos
[root@docker tomcat]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
tomcat        centos    eef0a7ea4f40   About a minute ago   960MB

[root@docker tomcat]# docker run -d --name tomcat -P  tomcat:centos
bb9e94f7555b089342fd267b0343841bba6cff6c9f429d6d54a35b4780c0531b
[root@docker tomcat]# docker ps -a 
CONTAINER ID   IMAGE           COMMAND                  CREATED              STATUS                       PORTS                     NAMES
bb9e94f7555b   tomcat:centos   "/usr/local/tomcat8/…"   About a minute ago   Up About a minute            0.0.0.0:49153->8080/tcp   tomcat
  • 验证效果

访问 http://192.168.15.11:49153/

在这里插入图片描述

基于已有的镜像容器进行创建镜像

[root@docker ~]# docker create nginx:latest /bin/bash
[root@docker ~]# docker run -itd nginx:latest /bin/bash
89bfcae5132c8b673c94162f4070efe740ac6f725d29cb0418a55216c9417a27
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                      PORTS     NAMES
89bfcae5132c   nginx:latest   "/bin/bash"   3 seconds ago   Up 1 second                           cool_torvalds
[root@docker ~]# docker commit -m "new" -a "dk"  89bfcae5132c dk:test
sha256:d1cc00154c5d18168d565f7a71796c9c722ab77051eb94f2637ae7cf6dc52733
#-m:指定描述信息;标签   -a:指定名称

[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
dk            test      d1cc00154c5d   13 seconds ago   131MB
tomcat        centos    eef0a7ea4f40   9 hours ago      960MB
httpd         centos    76556b056456   43 hours ago     541MB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值