为什么会有docker?
软件可以带环境安装.也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
如何工作?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境。
和虚拟机的区别
(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。如下图,右边是docker,可以发现共用了Operating System。
(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
常用命令
dokcer pull 镜像名:版本 版本省略的话默认latest
一般用 docker run -it image /bin/.bash 使用镜像以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker exec 在容器中打开终端,可以启动新进程,简单的说就是,可以不进入容器,对容器进行操作
Docker镜像
镜像是一个联合文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加。简单来说就是一个镜像里面是包含了多个镜像的。
加载原理
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
这就是为什么docker中的Centos都才几百m的原因。因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。
怎么证明是镜像是分层的?
为什么要用分层结构?
共享资源! 如果很多镜像都要centos,那么宿主机只要保存一份,且内存也只要加载一份。
特点
镜像都是只读的,如果要实现可读可写,那么就需要在镜像上面加上一层,容器层。
Docker容器数据卷
1.对数据进行持久化,我们不可能对容器进行修改之后就提交容器形成一个新的镜像,这样麻烦。
使用
1.docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
注意,这里没有设置宿主机的位置,只是设置了容器中的。这是出于可移植来考虑的,因为宿主机目录是依赖于宿主机的,我们不能保证宿主机都有这个目录把?
那么宿主机的路径是什么?是随机的,我们可以在docker inspect 容器id 中查看
DockerFile
怎么构建?
构建的流程
1.docker从基础镜像运行一个容器, 其中有个一个最基本的镜像,所有镜像都是在他的基础上构建的。
指令
例子
CMD echo "success--------------ok"
解释一下,centos最新版的作为基础镜像,以键值对的形式设置MYPATH。设置第一次进入容器时的路径为MYPATH。装vim 装 net-tools 开放接口80
最后执行命令 /bin/bash。这里注意一下,CMD只有最后一个是生效的。
第二个例子
MAINTAINER zzyy<zzyybs@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out