文章目录
构建镜像三种方式
- Dockerfile
- 基于本地模板进行构建
- 基于已有的镜像容器进行创建镜像
用于容器进行大批量修改,镜像并没有修改的时候,打包成镜像上传到镜像仓库,给别人使用
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的区别
- COPY 只能复制
- ADD ① 复制,②解压,③ 可操作的对象,不仅是文件,也可以是URL
- CMD和entrypoint区别
- CMD:CMD指令是我们自定义的,让容器运行时的一个执行程序,在dockerfile里面如果出现多个CMD指令,只会最后一个生效
- 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