一、Docker的产生的原因
1、为什么要使用docker:
- 开发在本机进行开发,代码打成war包,运维工程师在主机去部署,开发和运维之间由于环境和配置的问题会产生问题和分歧,版本的迭代,环境如此复杂,而docker软件可以带环境安装,安装的时候把原始环境一模一样的复制过来,这样可以消除编码是环境不同的问题。
- 代码即应用------》镜像即应用
- 自动扩缩容,应用跨平台运行
二、Docker的理念
- 一次封装、到处运行;
- 只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
三、Docker是什么
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
四、Docker能干什么
- 虚拟机技术缺点:
- 容器虚拟化技术,linux容器不是模拟一个完整的操作系统,
- 开发运维更方便
五、Docker三要素
仓库、集中存放镜像文件的场所,仓库和仓库注册器区别,公开库和私有库
镜像:模板
容器:用镜像创建的运行实例,启动、开始、停止、删除每个容器是互相隔离的
六、安装Docker
- CentOs6.5(64bit)版本以上
yum install -y epel-release
yum install -y docker-io
安装后配置文件 etc/sysconfig/docker
启动Docker后台服务 service docker start
docker verison验证
2.CentOS7安装Docker
linux没有网络下载 https://download.docker.com/linux/static/stable/x86_64/
yum install -y epel-release
yum install -y docker-io
安装后配置文件 etc/sysconfig/docker
启动Docker后台服务 service docker start
docker verison验证
systemctl start docker
systemctl enable docker
七、阿里云加速镜像加速配置
1、 阿里云地址:http://dev.alibaba.com/search.html
2、登录,找到镜像加速器,获取加速器镜像地址
3、配置:7以下的:etc/sysconfig/docker other_ages=""
7及7以上:vim etc/docker/daemon.json systemctl daemon-reload
4、重启docker
八、helloworld镜像
docker run hello-world 从本地取最新的镜像,取不到,从阿里云拉取镜像
Unable to find image 'hello-world:latest' locally
九、docker运行底层原理
1、docker是怎么工作的:C/S结构 docker守护进程运行在主机上,通过socket连接客户端访问,守护进程从客户端接受命令并管理运行主机上的容器。容器是运行时环境,就是我们前面说的集装箱
2、为什么docker比vm块:docker有更少的抽象层,不需要硬件资源的虚拟化,docker 利用的是宿主机的内核。
十、docker的常用命令
1、帮助命令:docker version \ docker info \ docker --help
2、镜像命令:
docker images 列出本地的所有镜像 REPOSITORY(仓库源) TAG(标签) IMAGE ID (镜像ID) CREATED (创建时间) SIZE(大小)
docker images -a 列出所有镜像(含中间镜像层)
docker images -q 显示当前镜像的ID -qa ID所有
docker images -digests 镜像摘要信息
docker images --no-trunc 镜像完整信息
docker search docker Hub 上搜索镜像
docker search -s 30 tomcat 搜索点赞数超过30
docker search -s 30 --no-trunc tomcat 搜索点赞数超过30的未被省略的信息
docker search -automated 只列出 automated build 类型的镜像
docker pull 下载镜像默认最新版 docker pull tomcat:latest
docker rmi 删除镜像 默认最新版 -f 强制删除
docker rmi -f hello-world ngix 删除多个
docker rmi -f $(docker images -qa)删除全部镜像
3、容器命令:
docker run 新建并运行容器实例
docker run -it --name mycentos0115 centos -i 以交互式运行容器,通常与-t同时使用
-d 后台运行接口
-t 为容器重新分配一个伪输入端,通畅和-i同事使用
--name 为容器指定一个名字
-P 随机端口映射
-p 指定端口映射,有以下4种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker run -d centos --使用docker ps -a 进行查看会发现容器已经退出,很重要的信息说明: docker容器后台运行就必须要有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(top,tail),就会自动退出的
这个是docker容器的机制问题,所以最佳的解决方式就是将你要运行的容器以前台进程的形式运行
docker ps 列出所有正在运行容器
docker ps -l 上一个运行容器
docker ps -a 现在的和以前运行的容器
docker ps -q 静默模式,只显示容器号
docker ps --no-trunc 静默模式,不截断输出
exit 关闭并退出容器
ctrl+p+q 退出容器,但不关闭,回到宿主机
docker start 容器ID 启动容器
docker restart 容器ID 重启ID
docker stop 容器ID 停止容器
docker kill 容器id 强制关闭容器
docker rm 容器ID 删除已经停止的容器
docker rm -f 容器ID 强制删除的容器
docker rm -f $(docker -a -q) 强制删除所有的容器
docker -logs -f -t --tail 容器ID 日志 -t 时间戳 -f
docker top 容器ID 查看容器内的进程
docker inspect 容器ID 查看容器的内部细节
docker attch 容器ID 进入正在运行的容器,并以交互式运行容器
docker exec -t 容器ID ls -l/tmp 未进入容器中执行容器终端的相关命令
docker exec -t 容器ID /bin/bash 相当于attch
docker cp 容器ID:路径 目标路径 容器里面的内容拷贝到宿主机
十一、镜像的原理
1、是什么:轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时库,环境变量和配置文件
unionFS(联合文件系统)是一种分层的,轻量级的高性能的文件系统,它支持对文件系统的修改,作为一次提交,来一层一层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下,union文件系统是docker镜像的基础,镜像可以通过分层来继承基于基础镜像可以制作出各种应用的镜像
特点:一次同时加载多个文件系统不,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
2、docker的镜像加载原理:
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs,这一层与我们典型的linux系统是一样的包含boot加载器和内核。当整个boot加载完成后,整个内核就都在内存中了,此时内存的使用权已由bootfs专交给内核,此时内存也会卸载bootfs;
rootfs(root file system)
在bootfs之上,包含的主要是linux系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同操作系统发行版,比如ubuntu,centos等
平时我们安装centos有好几个G,为啥容器却只有几百M呢,
对于一个精简的OS系统来说,rootfs很小,只需要包括最基本的命令、工具、和程序库就可以,因为直接使用Host的的kernel,自己只需要提供rootfs就行了,由此可见不同的linxu版本,bootfs基本可以共用的,rootfs可以共用的。
分层的镜像 kernel+centos+jdk+tomcat
为什么docker镜像要采用分层结构--资源共享,base镜像+各种
特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层 ,容器层下的都叫镜像层
docker镜像的commit操作
docker commit 提交容器副本使之成为一个新的镜像
docker run -it -p 8888:8080 tomcat
docker commit -m(提交的描述信息) -a(作者) 容器id要创建的目标镜像名
十二、docker容器数据卷
1、是什么:保存数据,数据持久化,一句话,有点类似我们redis里面的rdb和aof文件
2、能干嘛:卷就是目录和文件,存在于一个和多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过uniosFS文件,提供一些用于持续存储和共享数据的特性,
卷的设计就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除是删除其挂载的数据卷
特点:数据卷可在容器之间共享和重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含于镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
4、数据卷:
容器卷添加:直接命令添加:
docker run -it -v /宿主机目录绝对路径:/容器内目录 镜像ID
docker inspect 查看容器卷是否挂载成功
容器与宿主机之间是数据共享
容器停止退出后,主机修改后数据是否同步?同步
命令(带权限) docker run -it -v /宿主机目录绝对路径:/容器内目录:ro 镜像ID 容器内文件夹智能读取,不能添加
dockerfile添加 dockerfile是什么:镜像模板的描述文件
根目录下新建mydocker文件夹并进入
可在dockerfile文件中使用VOLUME命令来给镜像添加一个或多个数据卷 VOLUME["/datacontainer","/datacontainer","/datacontainer"]
由于可移植和分享的考虑,用-v /宿主机目录绝对路径:/容器内目录 这种方法不能直接在dockerfile上实现,由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样特定的目录
file构建: #volume test
FROM centos
VOLUME["/dataVolumeContainer","dataVolumeContainer1"]
CMD echo"finished,----success"
CMD /bin/bash
build后生成镜像 docker build -f /mydocker/dockerfile1 -t zzyy/centos.
run容器
通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪? 默认读写权限,docker inspect查看
主机对应默认地址
备注:
数据卷容器: 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器称为数据卷容器;
以上一步新建的镜像/zzyy/centos为模板运行容器dc01/dc02/dc03
他们已经具有数据卷 /dataVolumeContainer01 /dataVolumeContainer02
容器间数据共享(--volumes-from) :
先启动一个父容器dc01 docker run -it --name dc01 /zzyy/centos 启动后在容器卷datacontainer02里面创建文件 touch dc01_add.txt
新建dc02和dc03 继承dc01 docker run -it --name dc02 --volumes-from dc01 zzyy/centos 启动后在容器卷datacontainer02里面创建文件 touch dc02_add.txt
docker run -it --name dc03 --volumes-from dc01 zzyy/centos 启动后在容器卷datacontainer02里面创建文件 touch dc03_add.txt
回到dc01可以看到dc02和dc03各自添加的都能共享了
删除dc01,dc02修改后,dc03能否访问
删除dc02后,dc03能否访问
新建dc04继承dc03后再删除dc03
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
十三、dockerfile文件
是什么:dockeFile 是用来构建镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步走:编写dockerfile文件 ,docker build 创建镜像 docker run 容器云行
文件什么样 :
FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-6-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20181006"
CMD ["/bin/bash"]
dockerfile构建过程解析:
dockerfile内容基础知识:1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、#标识注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
docker执行dockerfile的大致流程:1、docker从基础镜像运行一个容器
2、执行一条指令,并对容器做出修改
3、执行类似docker commit操作提交一个新的镜像层
4、docker在基于刚提交的容器
5、执行dockerfile中的下一个指令,直到所有的指令都执行完成
总结:从应用软件的角度看:Dockerfile、docler容器、docker镜像分别代表软件的三个不同阶段
1、dockerfile是软件的原材料
2、docker镜像是软件的交付品
3、docker容器则可以认为是软件的运行状态
dockerfile面向开发,docker镜像成为交付标准、docker容器则涉及部署和运维,三者缺一不可,合力充当docker体系的基石
dockerfile的体系结构(保留字指令):
FROM 基础镜像,当前镜像是基于那个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来构建镜像过程中设置环境变量
ADD 将宿主机下的命令拷贝到镜像中,且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD拷贝文件和目录到镜像中去
将从构建上下文目录<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
VOLUME 容器数据卷,用于保存和持久化工作
CMD 指定一个容器启动时执行的命令
docker中有多个CMD命令,但只有最后一个生效,CMD会被Docker run 之后的命令替换
ENTRYPOINT 指定一个容器启动时执行的命令
ENTRYPOINT 和CMD一样都是在指定容器启动程序和参数
ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
案例:base镜像(scratch) docker hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像(mycentos) 初始centos运行该镜像时默认路经是 /
不支持ifconfig 、不支持 vim
目标:登录后默认路径
支持vim
支持ifconfig
编写dockerfile文件: FROM centos
MAINTAINER lijw@asiainfo.com
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $mypath
CMD echo "SUCCESS"
CMD /bin/bash
创建镜像 docker build -f dockerfile -t mycentos:1.3 .
运行 docker run -it mycentos:1.3
列出镜像的历史:docker history 镜像ID
CMD和ENTRYPOINT镜像案例:都是指定一个容器启动时要运行的命令
CMD dockerfile中有多个CMD命令,但只有最后一个生效,CMD会被Docker run 之后的命令替换
tomcat讲解 docker run -it -p 8888:8080 tomcat ls -l 容器不会启动
ENTRYPOINT Docker run 后面的参数会被当做参数传递给 ENTRYPOINT,之后组成新的命令组合
制作CMD版可以查询IP的信息的容器
如果我们需要显示HTTP头消息,就需要加上-i参数 CMD会报错,因为它替换了原先最后一行的命令,而ENTRYPOINT则不会,会追加-i的操作
ONBUILD学习:
自定义镜像(tomcat9)1、 mkdir -p/zzyyuse/mydockerfile/tomcat9
2、在上面目录下,touch c.txt
3、将jdk和tomcat安装的压缩包拷贝进上一步目录
4、在/zzyyuse/mydockerfile/tomcat9 目录下新建dockerfile文件
FROM centos
MAINTAINER LIJW@asiainfo.com
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.TXT /usr/local/container.txt
#把java和tomcat添加到容器中
ADD tomcat.tar.gz /usr/local/
ADD jdk.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问的时候的WORKDIR路径,登录落脚点
ENV MYPATH /user/local
WORKDIR $MYPATH
#配置java与tomcat的环境变量
ENV JAVA_HOME /user/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_BASE/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行TOMCAT
#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 && -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
5、构建 docker build -t zzzyyyTomcat
6、运行 docker run -d -P 9090:8080 --name myTomcat
-v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true
zzzyyyTomcat
7、验证
8、结合前述的容器卷将测试的web服务test发布
总结:
十四、本地镜像发布到阿里云
创建新的镜像:docker commit -a 作者 -m 描述
创建仓库空间:
将镜像推送到阿里云:docker login
docker tag
docker push