文章目录

  • 镜像和容器
  • Dockerfile 定制镜像
  • 常用指令
  • 项目实战
  • Docker Compose
  • 常用命令
  • 项目实战
  • Docker仓库
  • 常用的操作命令
  • 镜像相关的命令
  • 容器相关的命令


镜像和容器

  • docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。
    docker 容器=镜像+可读层
  • 容器是由镜像实例化而来。简单来说,镜像是文件,容器是进程。容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
  • 镜像你可以把它看成Java中的类,而容器可以看做是类的实例化对象。一个类可以有多个对象,同理,一个镜像可以有多个容器。
  • docker 的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
  • docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的linux环境(包含root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
  • docker镜像与容器区别 docker容器与镜像的关系_容器

  • 在Docker的生命周期中,最核心的两个部分,一个是镜像 Images,一个是容器 Containers。镜像运行起来就是容器。容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit)成为镜像。
  • docker镜像实际上是由一层一层的系统文件组成,这种层级的文件系统被称为UnionFS( Union file system 统一文件系统),镜像可以基于dockerfile构建,dockerfile是一个描述文件,里面包含了若干条密令,每条命令都会对基础文件系统创建新的层次结构。
  • docker提供了一个很简单的机制来创建镜像或更新现有的镜像。用户甚至可以从其他人那里下载一个已经做好的镜像直接使用。(镜像是只读的,可以理解为静态文件)
  • 相对于镜像来说容器是动态的,容器在启动的时候创建了一层可写层次作为最上层。

Dockerfile 定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

常用指令

docker镜像与容器区别 docker容器与镜像的关系_Docker_02

项目实战

创建Dockerfile文件

  • Dockerfile内容:
FROM java:8

WORKDIR /wms-center/wms-orders

ADD orders-service-1.0.0.jar ./

EXPOSE 8905

CMD java -jar orders-service-1.0.0.jar

docker镜像与容器区别 docker容器与镜像的关系_Docker_03

构建镜像

docker build -t wms-order .
#  wms-order  生成镜像的名字
#  . 表示当前目录 Dockerfile 的配置文件路径
#  . 指定Dockerfile 的上下文目录

docker镜像与容器区别 docker容器与镜像的关系_容器_04

  • docker images查看生成的镜像

Docker Compose

Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

  • 使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Docker Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
  • Docker Compose 中有两个重要的概念:
  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
  • Docker Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

常用命令

  • 前台运行:docker-compose up
  • 后台运行:docker-compose up -d
  • 启动:docker-compose start
  • 停止:docker-compose stop
  • 停止并移除容器:docker-compose down

项目实战

  • 通过docker-compose构建ELK日志分析系统
version: '3'
services:
  elasticsearch:
    image: elasticsearch
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
    volumes:
      - /home/asa/elk/es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /home/asa/elk/es/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana
    container_name: kibana
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200"
    ports:
      - 5601:5601
  logstash:
    image: logstash
    container_name: logstash
    volumes:
      - /home/asa/elk/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf 
    depends_on:
      - elasticsearch 
    links:
      - elasticsearch:es 
    ports:
      - 4560:4560
  • 在docker-compose所在文件夹执行docker-compose up -d

docker镜像与容器区别 docker容器与镜像的关系_Docker_05

Docker仓库

  • docker仓库是用来包含镜像的位置,docker提供了一个注册服务器(register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像,
  • docker运作中使用的默认仓库是docker hub公共仓库。
  • 仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用push命令将它上传到共有或者私有的仓库。这样下次再另外一台机器上使用这个镜像的时候只需要从仓库里面pull下来就可以了。

常用的操作命令

镜像相关的命令

  • docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] :从 Docker 镜像仓库获取镜像
  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。
  • docker push: 推送镜像到仓库
  • docker save <image-id>:docker save命令会创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。
  • docker export <container-id>:docker export命令创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容(译者注:expoxt后 的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像)。
  • docker load:加载压缩包为镜像
  • docker rmi id :命令会移除构成镜像的一个只读层。只能够使用docker rmi来移除最顶层(top level layer)(也可以说是镜像),你也可以使用-f 参数来强制删除中间的只读层。
  • docker images -a : 列出所用的镜像,也可以说列出所用的可读层
  • docker build [文件路径] :通过Dockerfile构建镜像

容器相关的命令

  • docker create <image -id > :为指定的镜像添加一个可读写层,构成一个新的容器;
  • docker start <container -id > :docker start 命令为容器文件系统创建一个进程的隔离空间。(运行容器)
  • docker run < image -id>: 这个是先利用镜像创建一个容器,然后运行了这个容器;
  • docker stop <container -id > :停止所用的进程;
  • docker kill <container -id > :向所用运行在容器的进行发送一个不友好的sigkill信号;
  • docker pause <container-id>: 将运行中的进程空间暂停
  • docker rm <container -id> :docker rm命令会移除构成容器的可读写层。注意,这个命令删除前需要保证容器是停止的。
  • docker commit <container-id>:docker commit命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。
  • docker history <image-id>:docker history命令递归地输出指定镜像的历史镜像。
  • docker ps : 会列出所有运行中的容器;
  • docker ps -a :列出运行中和未运行的容器;
  • docker exec :进入容器执行命令;
  • docker logs -f -t --tail 容器id : 查看容器运行日志
  • docker top 容器id :查看容器内运行的进程
  • docker inspect 容id :查看容器内的细节
  • docker cp 容器id [ 容器内的文件路径 ] [主机路径]:拷贝容器内的文件到虚拟机主机

你知道的越多,你不知道的越多。