解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.1 Docker包含两方面技术:
1.镜像技术,打破“代码即应用”的概念,透过镜像将运作应用程式所需要的系统环境,自底向上打包应用,达到应用程式跨平台间的无缝运作。即一次封装,到处运行。2.容器虚拟化技术,基于容器的虚拟化,仅包含业务运行所需的runtime环境。1.2 Docker的优势(DevOps):
1.更快速的应用交付和部署2.更快捷的升级和扩缩容3.更简单的系统运维4.更高效的计算资源利用从远程仓库pull的镜像,就是一个只读的模版,用来创建Docker容器,并且一个镜像可以创建很多容器。
1.容器,Docker利用容器独立运行一个或一组应用,容器是用镜像创建的运行实例(runtime环境)。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易版的Linux环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。2.仓库,集中存放镜像文件的场所。3.镜像,Docker本身是一个容器运行载体或称之为管理引擎(daemon)。我们将应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。一个容器运行一种服务,当我们需要的时候,就可以通过Docker客户端创建一个对应的容器。如何配置阿里云镜像加速器?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
1.Docker容器后台运行就必须有一个前台进程。
2.容器运行的命令如果不是那些一直挂起的命令(top、tail等),就会自动退出。
3.这个是docker的机制问题,容器为后台进程模式运行,就导致docker前台没有运行的应用,容器就会立即停止。
4.最佳的解决方案,将要运行的程序以前台进程的形式运行。
5.后台运行某一个程序,容器就会一直运行,例如:
docker run -d centos /bin/sh -c 'while trues; do echo hello-world; sleep 2; done' #可用查看容器日志命令,后台一直在打印‘hello-world’镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件。 特点:Docker镜像都是只读的,当容器启动时每一个新的可写层被加载到镜像的顶部。这一层通常被称为“容器层”,“容器层”之下的都叫“镜像层”。
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交,来一层层的额叠加,同时可以将不同目录挂载到同一个虚拟文件系统。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于镜像,可以制作各种具体的应用镜像。
特性,一次同时加载多个文件系统,但是从外部看,只能看到一个文件系统,联合加载会把各层文件系统叠加,这样最终的文件系统会包含所有底层的文件和目录。Docker镜像的底层原理,docker的镜像实际上是由一层一层的文件系统组成,即联合文件系统。最大的好处就是,共享资源。
有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时在内存中也只需加载一份base镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享。例如,下载镜像的时候第一次很慢,但接着下载就会很快。因为,docker将base镜像进行了缓存。基于base镜像,只需要下载各种具体的应用镜像。数据卷即数据持久化。为了能够保存容器中数据,我们可以使用容器数据卷,类似于Redis里的RDB和AOF文件,相当于活动硬盘。
目的:
1.将应用和环境打包形成容器运行,运行可以伴随着容器,但是我们有时需要将数据进行持久化。2.容器间继承和容器之间有时需要共享数据。1.docker run -it -v /宿主机Data文件夹:/容器Data文件夹 镜像名
此命令相当于在容器与宿主机之间Data文件建立了数据共享的连接,可以使用上述的docker -inspect 容器id命令查看详细信息,可以看到宿主机和容器之间Data文件夹的绑定。
docker run -it -v /myDataVolume:/dataVolumeContainer centos注意:容器停止退出后,主机修改后数据同步。类似于redis的持久化,因为redis是运行在内存中,当redis停止再次启动,会读取持久化的数据进行回写。
2.docker run -it -v /宿主机Data文件夹:/容器Data文件夹:ro 镜像名
此命令加上ro,表示容器对与宿主机Data文件夹only read权限,只能读取宿主机传过来的数据。
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos1.宿主机目录下新建mydocker文件夹进入。
2.File构建,在DockerFile中使用VOLUME指令给镜像添加一个或多个数据卷。
From centos VOLUME ["dataVolumeContainer1","dataVolumeContainer2","dataVolumeContainer3"] CMD echo "finished,--------------succeess" CMD /bin/bash3.File进行build生成镜像,使用docker images命令可查看生成的镜像。
docker build -f /mydocker/dockerfile -t mm/centos . #-f表示dockerFile文件 -t表示镜像名称 .表示当前文件夹4.run 镜像生成容器。
docker run -it mm/centos宿主机中的容器卷默认位置,快使用docker inspect 容器id,进行查看。
VOLUME指令
VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]说明:
1.考虑到可移植和分享的考虑,用-v命令这种方法不能直接在DockerFile中实现。2.由于宿主机目录是依赖于特定宿主机,并不能够保证所有的宿主机都存在这样的特定目录。命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享。挂载数据卷的容器,称之为数据容器卷。
上一步新建的镜像mm/centos为模版并运行容器dc01、dc02/dc03,这三个数据卷容器都包含三个数据卷 “dataVolumeContainer1”, “dataVolumeContainer2”,“dataVolumeContainer3”。以该两个父容器为继承对象实现容器间传递共享(–volumes-from)。
docker run -it --name dc02 --volumes-from doc1 mm/centos docker run -it --name dc03 --volumes-from doc2 mm/centos数据卷容器之间的关系为继承和共享关系,容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。构建三步骤为:create、build、run。
1.scratch是所有镜像文件的主键类,类似于java里的Objext类,FROM scratch引用。2.每条保留指令都必须为大写字母且后面必须跟随至少一个参数。3.指令按照从上到下,顺序执行。4.每条指令都会创建一个新的镜像层,并对镜像进行提交。1.dockerfile是构成镜像的基础,面向开发。
dockerfile定义了进程所需要的一切东西,包括执行代码(文件)、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程。
2.docker镜像,成为交付标准。
用Dockerfile定义一个文件后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。
3.docker容器是docker镜像的运行态,涉及部署和运维。
容器是直接提供服务的。
1.FROM,基础镜像,当前新镜像是基于哪个镜像的。
2.MAINTAINER,镜像维护者的姓名和邮箱。
3.RUN,容器构建时需要运行的具体命令(例如,run redis镜像时,需要创建的用户组)。
4.EXPOSE,当前容器对外暴露的端口号。
5.WORKDIR,指定在创建容器后,终端默认登录进来的工作目录。
6.ENV,用来在构建镜像过程中设置环境变量。
7.ADD,将宿主机目录下的文件拷贝进镜像且自动处理URL和解压tar压缩包。
8.COPY,类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中的文件或目录复制到新的一层的镜像内。
9.VOLUME,容器数据卷,用于数据保存和持久化工作。
10.CMD,指定一个容器启动时需要的命令。Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。
CMD指令的格式和RUN相似,也是两种格式:
1.shell格式:CMD<命令>2.exec格式:CMD[“可执行文件”,“参数1”,“参数2”,……]参数列表格式:CMD[“参数1”,“参数2”,……],在指定了ENTRYPOINT指令后,用CMD指定具体的参数。11.ENTRYPOINT,指定一个容器启动时需要的命令。ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数。区别在于:CMD会覆盖掉前面的CMD指令,只有最后一个生效;ENTRYPOINT是追加命令。
12.ONBUILD,当构建一个被继承的Dockfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发。
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
1.自定义镜像mycentos2.CMD/ENTRYPOINT镜像案例3.ONBUILD使用4.自定义镜像Tomcat9目的: 自定义mycentos使我们自己的镜像具备,登录后的指定路径、有vim编辑器、能查看网络配置ifconfig支持。
流程:
1.编写
Hub默认Centos镜像编写DockerFile文件 FROM centos MAINTAINER mm<1806483840@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success---------ok" CMD /bin/bash2.构建
Docker build -f dockerfile路径名 -t 新镜像名:TAG .
docker build -f /mydocker/dockerfile2 -t mycentos:1.0 .3.运行
docker run -it 新镜像名:TAG4.列出镜像的变更历史
docker history 镜像名目的: CMD和ENTRYPOINT的区别
1.CMD
CMD会被docker run 之后的参数替换,只有最后一个生效,。
2.ENTRYPOINT
docker run 之后的参数传递给ENTRYPOINT,之后形成新的命令组合。
流程:
1.构建用CMD的dockerfile。
FROM centos RUN yum -y curl CMD ["curl","-s",http://ip.cn]2.构建用ENTRYPOINT的dockerfile。
FROM centos RUN yum -y curl ENTRYPOINT ["curl","-s",http://ip.cn]3.具体步骤同案例一,只是run的时候,一个不可以加-i(会被覆盖为CMD -i),另一个可以加参数-i。
目的:
父镜像的dockerfile文件中加上ONBUILD,当有其他的镜像通过dockerfile里的FROM命令继承该父镜像时,会触发ONBUILD并打印信息。流程:
1.新建dockerfile文件
FROM centos MAINTAINER mm<1806483840@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success---------ok" CMD /bin/bash ONBUILD RUN echo"father is mycentos1"2.将上述dockerfile 进行build命令,生成镜像mycentos1。
3.构建子镜像的dockerfile文件
FROM mycentos1 MAINTAINER mm<1806483840@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim EXPOSE 80 CMD echo $MYPATH4.build第三步的dockerfile,会打印父镜像dockerfile里的ONBUILD命令的语句,也就是进行了回调。
目的:
构建属于自己特有的Tomcat流程:
1.构建dockerfile
FROM centos MAINTAINER mm<1806483840@qq.com> #把宿主机当前上下文的c.txt拷贝到容器/usr/local路径下 COPY c.txt /usr/local/cincontainer.txt #将java和tomcat添加到容器内,进行解压缩 ADD jdk1.8.0_101.tar.gz /usr/local ADD apache-tomcat-9.0.26.tar.gz /usr/local #安装vim编辑器 RUN yum -y install vim #设置工作访问时候的WORKDIR路径 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_101 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.26 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.26 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat #ENTRYPOINT ["usr/local//bin/startup.sh"] CMD /usr/local/apache-tomcat-9.0.26/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.26/bin/logs/catalina.out2.build dockerfile
docker build -t mmtomcat9 .3.run dockerfile
docker run -it -p 9080:8080 --name mtomcat9 -v /myDataVolume/mtomcat9/test:/usr/local/apache-tomcat-9.0.26/webapps/test -v /myDataVolume/mtomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.26/logs --privileged=true mmtomcat94.验证
5.发布
1.将容器进行commit
docker commit -a mm -m "mycentos first push " 44910358112d mycentos:1.12.进入阿里云开发者平台
docker login --username=账户名 registry.cn-hangzhou.aliyuncs.comdocker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xmm_666/mmdocker:[镜像版本号]docker push registry.cn-hangzhou.aliyuncs.com/xmm_666/mmdocker:[镜像版本号]1.docker pull redis:3.2 ,拉取redis官方镜像。
2.docker run redis镜像(docker容器的端口号可以指定任意未被占用端口,redis如果需要使用其他端口,需要修改redis.conf配置文件)。
docker run -p 6389:6379 -v /mydocker/myredis/data:/data -v /mydocker/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes3.使用容器
在宿主机redis.conf目录下新建redis.conf文件,并使用vim编辑,可以保存并共享到容器内。
4.开启redis服务,redis-cli
docker exec -it f79c16d34035 redis-cli5.redis持久化。
cd /mydocker/myredis/data,进入到宿主机data目录。vim appendonly.aof ,查看redis的持久化数据。最后修改于日期:2020年9月15日