简介
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时"在我的机器上可正常工作"的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。
Docker优点
简化程序: Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。
避免选择恐惧症: 如果你有选择恐惧症,还是资深患者. Docker帮你打包你的纠结!比如Docker镜像; Docker镜像中包含了运行环境和配置,所以ocker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。
节省开支: 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件, Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式
容器和虚拟机
Docker架构
Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布
左边的是客户端-Client
中间的是服务端-Server
右边的是镜像库-Registry
Docker安装
1.安装yml
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.安装软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.下载docker
yum -y install docker-ce
4.配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的阿里云镜像"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker镜像
将软件环境打包好的模板,用来创建容器的,一个镜像可以创建多个容器。
位于下层的镜像称为父镜像(Parent Image),最底层的称为基础镜像(Base Image)最上层为“可读写”层,其下的均为"只读”层。
镜像版本为latest这是官方最新版
DockerFile
DockerFile介绍
DockerFile仅仅只是构建Docker镜像的源代码,
Docker可以通过读取DockerFile中的指令来自动构建镜像,Dockerfile是一种文本文档,它包含用户在启动镜像时的命令、参数行,使用docker构建,用户可以创建一个连续执行多个命令行指令的自动构建
DockerFile格式
格式:
#:注释
INSTRUCTION :参数
指令不区分大小写然而,惯例是他们是大写的,以区别它们与参数
Docker运行指令在Dockerfile中按顺序第一条指令开始执行
第一条必须是“FROM”,以便指定要从中构建的基本映像
DockerFile语法
FROM 必须,用于构建基础镜像
ENV 用来给镜像定义所需要的环境变量,并且可以被Dockerfile文件中位于其后的其他指令如(ENV,ADD,COPY)等调用,调用格式 $ key 、${key}
格式1:EVN key value
这种格式只能一次设置一个值
格式2:EVN key1=value1 key2=value2
这种格式一次可以设置多个值
ARG 用户相同与EVN,指定一个变量,可以在docker build创建镜像的时候,使用–build-arg key=value来指定参数
ARG key=value
WORKDIR 用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、和ADD指定操作的工作目录,只会影响当前WORKDIR之后的子类,WORKDIR指令在Dockerfile文件中可以出现多次,路径可以为相对路径,但是它是相对于前一个WORKDIR指令指定的路径,另外WORKDIR可以是ENV指定定义的变量
ENV CATALINA HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin: $PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
RUN 用来指定docker build过程中运行指定的命令
RUN command
第一种格式command就是一个shell命令,以/bin/sh -c 来运行它
RUN ["/bin/bash","-c","executable","param"]
第二种格式的参数是一个JSON格式的数组,当中executable是要运行的命令,后面是传递命令的选项或者参数,但是这种格式不会用/bin/sh -c来发起,所以常见的shell操作像量比变量替换和通配符替换不会进行
CMD,ENTRYPOINT :都是指定容器启动的核心脚本,容器运行时生效
ENTRYPOINT:类似CMD命令,用于给容器指定默认运行程序,和CMD不同的是ENTRYPOINT启动的程序不会被docker run命令的参数锁覆盖,
而且这些命令行为参数会被当做参数传递给ENTRYPOINT指定的程序,但是(docker run命令的–entrypoint参数可以覆盖ENTRYPOINT)
docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为参数使用,
同样Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效,
Dockerfile中如果既有CMD又有ENTRYPOINT并且CMD是一个完整的可执行命令,那么谁在最后谁生效
COPY、ADD :COPY、ADD都是从容器外复制资源到容器里面的,区别COPY只能复制宿主机上的数据,ADD可以复制网络资源,COPY直接解压压缩包,ADD需要手动解压
EXPOSE 对外暴露端口
VOLUME 目录映射
ONBUILD 用来在Dockerfile中定义一个触发器,Dockerfile用来构建镜像文件,镜像文件也可以当成基础镜像被另外一个Dockerfile用作FROM指令的参数,在后面这个Dockerfile中的FROM质量在构建过程中被执行的时候,会触发基础镜像里面的ONBUILD指令,ONBUILD不能自我前台ONBUILD不会触发FROM和MAINTAINER指令,在ONBUILD指令中使用ADD和COPY要小心,因为新构建过程中的上下文在缺少指定的源文件是会失败
ONBUILD instruction
ignore文件
忽略扫描的文件
Dockerfile镜像制作
我们以springboot项目为例
1.将springboot项目编译打包好放入指定目录
2.编写Dockerfile文件
FROM java:8
EXPOSE 8080
ADD *.jar /tmp/app.jar
RUN bash -c 'touch /tmp/app.jar'#touch /tmp/app.jar刷新jar的时间信息
#ENTRYPOINT ["java","-jar","/tmp/app.jar"]
CMD java -jar /tmp/app.jar
3.构建镜像
docker build -t imageName:v1 .
imageName:镜像名
v1:版本号
. docker的上下文路径