镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的全部内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像是由一系列文件系统叠加而成:java
(1)在linux引导过程当中,root文件系统起初会只读装载,当引导结束并完成了完整性检查后,会被切换成读写模式
(2)在Docker里面,root文件系统始终都是只读模式,而且利用联合加载技术,在root文件系统层上加载更多的只读文件系统
联合加载:指的是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含全部底层的文件和目录
Docker将这样的文件系统称为镜像linux
好比:想要修改一个文件,这个文件会从下面的只读层复制到该读写层,该文件的只读版本仍然存在,可是被该文件在读写层中的可读写副本所隐藏。
这种机制也就是写时复制,这是Docker如此强大的技术之一。nginx
5: Docker镜像的表示格式:
Image Hub/namespace/image name :tag
Image Hub:存放image的仓库地址,若是没有这个部分,表示缺省docker官方hub
Namespace:命名空间,是一个用户或组织中全部镜像命名的集合
image name:镜像的名称
tag:区分同一镜像的不一样版本,不写标签默认就是latest
layer:镜像由一系列层组成,每层都用64位的十六进制数表示web
Image ID:镜像最上层的layer ID就是该镜像的ID
本地镜像和容器都保存在docker宿主机的/var/lib/docker目录下,保存在docker 所采用的存储驱动里面,多是aufs或者devicemapper。
(1) aufs的全称是advanced multi-layered unification filesystem,主要功能是把多个文件夹的内容合并到一块儿,提供一个统一的视图,使用的操做系统如Ubuntu、Debian等
(2) Device Mapper是Linux系统中基于内核的高级卷管理技术框架,而devicemapper是Docker基于Device Mapper提供的一种存储驱动,使用的操做系统如RHEL、Centos等
Docker镜像操做补充docker
docker commit:提交容器副本,如: docker commit -m=“提交的描述信息” -a=“指定镜像做者” 容器ID 要建立的目标镜像名 docker build:根据Dockerfile来建立一个新的镜像,如: docker build -t 要建立的镜像名称 . ,最后一个点表示Dockerfile 文件所在目录,能够指定Dockerfile 的绝对路径 docker tag:为镜像添加一个新的标签,如: docker tag 源镜像 新镜像名
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。数据库
2:指令按照从上到下,顺序执行apache
(1)docker从基础镜像运行一个容器
(2)执行一条指令,对容器做出修改
(3)执行相似docker commit的操做,提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令,直到全部指令都执行完成ubuntu
指定一个已经存在的镜像,也是构建的基础镜像,Dockerfile的第一条必须是FROMcentos
设置做者,联系邮件数组
指定要运行的命令,建议使用数组的格式,也是exec的格式,如:
RUN[“apt-get”,”install”,”-y”,”nginx”]
向容器外部公开容器内的端口
指定在建立容器的时候,在容器内部设置一个工做目录,entroypoint和CMD指定的程序会在这个目录执行
能够在docker run中使用-w来覆盖工做目录
指定该镜像以什么样的用户去执行,能够单独指定用户,也能够指定用户和组,格式:USER uid:gid,能够在docker run中经过-u来覆盖,若是都不指定,默认是root
指定一个容器启动时要运行的命令,若是指定了多条CMD,只有最后一条会执行
例如:CMD[“/bin/bash”,”-l”] 若是在docker run 后面跟上要执行的命令,会覆盖Dockerfile里面的cmd指定的命令
也用来指定一个容器启动时要运行命令
2:能够和CMD一块儿用,好比:
ENTROYPOINT[“/usr/sbin/nginx”]
CMD[“-h”]
这样若是docker run的时候不覆盖CMD,那么就是按照
/usr/sbin/nginx –h来运行
若是运行的时候:docker run –it 容器id –g“daemon off;”
那么实际运行就是:
/usr/sbin/nginx –g “daemon off;”了
用来在构建镜像过程当中设置环境变量,例如:
ENV MY_PATH /usr/my 这个环境变量能够在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀同样;也能够在其它指令中直接使用这些环境变量,好比: WORKDIR $MY_PATH
能够在docker run 命令中使用 –e来指定环境变量,这些变量只在运行时有效
小技巧:
能够在不须要构建缓存的前面,添加一个ENV语句,这样,要后面更新的时候,就修改一下这个ENV的值
用来将构建环境下的文件或目录复制到镜像中。
注意:ADD会使得构建缓存无效,ADD后续指令都不能使用以前的构建缓存了
相似于ADD,COPY只作构建上下文中复制文件,而不会去作文件提取和解压的工做
若是源文件是目录,那么这整个目录会被复制到容器中
用来向镜像建立的容器添加卷,一个卷是能够存在于一个或者多个容器内的特定目录,这个目录能够绕过联合文件系统,并提供以下共享数据或者对数据进行持久化:
1:卷能够在容器间共享和重用
卷可让咱们把数据、数据库或其它内容添加到镜像中,而不是将这些内容提交到镜像中,而且容许咱们在多个容器间共享这些内容。
注意:若是删除了最后一个使用卷的容器,内部卷就不见了。
可在docker run的时候,使用-v来把宿主机的目录映射到容器,这样数据就能一直保存了
指定当镜像作为其它镜像的基础镜像时,该镜像触发执行的功能。
ONBUILD在子镜像build的时候,在FROM以后就先执行,而且只能被执行一次,不会被孙镜像继承
以制做一个tomcat9的镜像为例。
下载好要使用的jdk和tomcat,这里下载的是:
jdk-8u144-linux-x64.tar.gz apache-tomcat-9.0.1.tar.gz
FROM ubuntu MAINTAINER cc #把java与tomcat添加到容器中 ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.1 /usr/local/apache-tomcat-9.0.1 #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.1 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.1 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # CMD ["/usr/local/apache-tomcat-9.0.1/bin/catalina.sh","run"] # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.1/bin/startup.sh" ] CMD /usr/local/apache-tomcat-9.0.1/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.1/bin/logs/catalina.out
docker build -t cctomcat9 . ,注意后面有个 . ,表示在当前路径找Dockerfile
apache-tomcat-9.0.1
apache-tomcat-9.0.1.tar.gz Dockerfile jdk-8u144-linux-x64.tar.gz
docker run -i -t -d -p 9080:8080 --name myt9 -v /ccdockermake/tomcat9/test:/usr/local/apache-tomcat-9.0.1/webapps/test -v /tomcat9logs/:/usr/local/apache-tomcat-9.0.1/logs --privileged=true cctomcat9
centos 7 Docker 启动一个web服务 可是启动时 报WARNING: IPv4 forwarding is disabled. Networking will not work.
编辑 /usr/lib/sysctl.d/00-system.conf
添加以下代码:net.ipv4.ip_forward=1 重启network服务:systemctl restart network 查看是否修改为功:sysctl net.ipv4.ip_forward 若是返回为“net.ipv4.ip_forward = 1”则表示成功了
关于web应用放的位置
静态引入:能够把web应用直接copy到容器中,分发方便
动态引入:就是如上这样把宿主机上的目录挂载到容器,方便调试
1:先把tomcat9镜像运行起来
2:进入运行中的容器:docker exec -it 容器id /bin/bash,固然,先经过docker ps获取容器号
3:进入运行起来的tomcat容器,删除掉webapps里面的东西,
而后再把本身的server.xml从宿主机拷贝到容器中,如:
docker cp ./server.xml 容器id:/usr/local/apache-tomcat-9.0.1/conf/server.xml
4:制做镜像
docker commit -m=“remove default webapps” -a=“cc” 容器id cctomcat:9.0