Docker学习笔记

1、Docker是什么 

我们在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机。我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件。每台虚拟机都需要有自己的操作系统,每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。     Docker的英文本意是“搬运工”,在程序的世界里,Docker搬运的就是集装箱(Container),集装箱里装的就是任意类型的APP,开发者通过Docker可以将APP变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行,不依赖于任何语言、框架或系统。

2、Docker VS VM

Docker学习笔记_第1张图片

3、Docker基本概念

Docker学习笔记_第2张图片

3.1Docker镜像

    从概念上来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

3.2容器

    容器,它的定义和镜像(Image)几乎一模一样,类似于就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

3.3仓库

    仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。通常情况下一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。类似于我们之前常用的代码仓库。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。

4Docker安装

Centos下安装Docker

Docker 要求 CentOS 系统的内核版本高于 3.10。

安装依赖: sudo yum install -y yum-utils device-mapper-persistent-data lvm2

需要添加Docker源: sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装Docker:sudo yum install docker-ce

启动Docker:sudo systemctl start docker

输入命令查看Docker版本:docker version 。如果看到docker相应的版本信息,说明docker已经安装完成。

5.1Docker镜像基本操作

登录docker:docker login

搜索命令:docker search xxx    

    例子:docker search centos

拉取镜像:docker pull xxx:tag    

    例子:docker pull centos:latest

查看本地镜像:docker images

查找指定镜像:docker image ls centos:latest

删除镜像:docker image remove centos

重命名:docker tag imageId xxxx

推送镜像:docker push xxx/xxx:xxx

5.2Docker容器基本操作

启动容器:docker run -d -i -t -p 80:80 nginx    

    -d:后台模式运行    

    -i:允许你对容器内的标准输入 (STDIN) 进行交互。    

    -t:在新容器内指定一个伪终端或终端。    

    -p:端口映射,后面跟着的80:80,意思是把容器内的80端口映射到外面的80端口

查看运行中的容器:docker ps

查看所有容器:docker ps -la

停止容器:docker stop

容器ID 删除容器:docker rm 容器ID

容器转镜像:docker commit -m “备注” 容器ID xxx/xxx:xxx

进入容器:docker exec -it 容器ID /bin/sh

6Docker之Dockerfile

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。    

Dockerfile 语法

FROM:

    FROM {base镜像}

    必须放在DOckerfile的第一行,表示基于哪个镜像构建

MAINTAINER:

    可选的,用来标识镜像作者的信息,例如MAINTAINER Calon [email protected].

RUN:

    每一个RUN指令都会是在一个新的容器里面运行,并提交为一个镜像作为下一个RUN的基础 一个Dockerfile中可以包含多个RUN,按定义顺序执行

    RUN支持两种运行方式:

        RUN 这个会当作/bin/sh -c “cmd” 运行 RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径

        RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx

CMD:

    CMD的作用是作为执行容器时候的默认行为(容器默认的启动命令) 当运行容器的时候声明了command,则不再用镜像中的CMD默认所定义的命令 一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用

    CMD定义的三种方式:

        CMD 这个会当作/bin/sh -c "cmd"来执行

        CMD [“executable”,“arg1”,….]

        CMD [“arg1”,“arg2”],这个时候CMD作为ENTRYPOINT的参数

EXPOSE 声明端口

    格式为 EXPOSE <端口1> [<端口2>…]。

    EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

entrypoint:

    entrypoint的作用是,把整个容器变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建容器的方式。但是可以通过参数传递的方法影响到容器内部 每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效 当定义了entrypoint以后,CMD只能够作为参数进行传递 entrypoint定义方式: entrypoint [“executable”,“arg1”,“arg2”],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数 entrypoint ,当作/bin/bash -c "cmd"运行命令

ADD & COPY:

    当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到镜像中 ADD和COPY的源必须在context路径下 当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以work ADD相对COPY还有一个多的功能,能够进行自动解压压缩包

ENV:

    ENV key value 用来设置环境变量,后续的RUN可以使用它所创建的环境变量 当创建基于该镜像的容器的时候,会自动拥有设置的环境变量

WORKDIR:

    用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准

USER:

    指定UID或者username,来决定运行RUN指令的用户

ONBUILD:

    ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令 可以定义多个ONBUILD指令 当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候  定义的ONBUILD指令 ONBUILD

VOLUME:

    用来创建一个在image之外的mount point,用来在多个container之间实现数据共享 运行使用json array的方式定义多个volume VOLUME [“/var/data1”,“/var/data2”] 或者plain text的情况下定义多个VOLUME指令

例子

FROM calonmo/java8:base 

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

RUN mkdir -p /app

WORKDIR /app

EXPOSE 8090 

ADD ./target/xxx.jar ./ 

CMD java -jar -Xms64m -Xmx256m xxx.jar

 

你可能感兴趣的:(Docker)