美文网首页Docker
三、Image与Container

三、Image与Container

作者: Suny____ | 来源:发表于2020-03-12 00:16 被阅读0次

1、image

  • image层的概念

现有的image都是怎么来的呢?其实image就是通过编译运行Dockerfile所得来的,这也是推荐使用的一种方式。

每个image其实都是如下图这种结构,底层是操作系统的image,在上层不断的添加新的层,最终形成自己想要的image。

image.png
  • 创建 image

    • 方式一:Dockerfile【推荐】

      我们可以看官方的Tomcat image是怎么做的

      FROM openjdk:8-jdk
      
      ENV CATALINA_HOME /usr/local/tomcat
      ENV PATH $CATALINA_HOME/bin:$PATH
      RUN mkdir -p "$CATALINA_HOME"
      WORKDIR $CATALINA_HOME
      
      ....省略....
      
      EXPOSE 8080
      CMD ["catalina.sh", "run"]
      

      image就是通过Dockerfile进行各种命令的组成,在基础image之上又添加了自己需要的内容。

      当我们使用 docker pull tomcat

      image.png

      这些步骤其实就是在运行Dockerfile中的命令。

      • 构建自定义 image
      FROM openjdk:8-jdk
        
      MAINTAINER Sunny
      LABEL name="Sunny"
      
      COPY spring-boot-docker-1.0.jar /spring-boot-docker-1.0.jar
      
      EXPOSE 8080
      CMD ["java","-jar","spring-boot-docker-1.0.jar"]
      
      image.png

通过docker build 命令可以根据Dockerfile生成新的 image。上面的 Step 1 ~ 6 就是我们在Dockerfile中编写的命令,一个步骤就是一层。

运行自己的容器,就可以访问映射到物理机的端口了。

image.png
  • 方式二:docker commit

    想要创建一个新的image,不仅可以使用Dockerfile来生成,还可以在一个已有的container之上增加新的功能,使其形成新的image。

    image.png

可以看到原来的 tomcat 镜像是没有 vim 命令的,我们通过yum install vim安装。结果发现 yum也没有,此时可以通过其他方式进行安装。

image.png

再敲 yum 命令就可以看到已经安装好了


image.png

接下来通过 docker commit myTomcat new-tomcat创建一个新的image

image.png

可以看到通过 commit 方式也可以创建 image,通过这个 image 启动的容器就会有安装好的 vim 命令了

不推荐用 commit 方式创建 image,因为通过这种方式创建的 image 我们完全不知道它是怎么来的。
而通过Dockerfile的方式创建的 image 我们知道它是经过哪些步骤哪些命令从而产生的 image。

  • Dockerfile 语法

    • FROM

      • 指定基础镜像
      • FROM openjdk:8-jdk
    • MAINTAINER

      • 作者信息
      • MAINTAINER Sunny
    • RUN

      • 在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用 \
      • RUN groupadd -r mysql && useradd -r -g mysql mysql
    • ENV

      • ENV MYSQL_MAJOR 5.7
      • 设置变量的值,可以通过docker run --e key=value修改,后面可以直接使
        用${MYSQL_MAJOR}
    • LABEL

      • 设置镜像标签

        LABEL email="sunny@163.com"

        LABEL name="sunny"

    • VOLUME

      • 指定数据的挂在目录
      • VOLUME /var/lib/mysql
    • COPY

      • 将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
      • COPY docker-entrypoint.sh /usr/local/bin/
    • ADD

      • 将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
      • ADD mysql-5.7.tar /usr/local
    • WORKDIR

      • 指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建

        WORKDIR /usr/local

        WORKDIR tomcat

        RUN touch test.txt

        会在/usr/local/tomcat下创建test.txt文件

        WORKDIR /root
        ADD app.yml test/

        会在/root/test下多出一个app.yml文件

    • CMD

      • 容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效
      • CMD ["java", "-jar", "xxx.jar"] 或 CMD java
    • ENTRYPOINT

      • 和CMD的使用类似
      • ENTRYPOINT ["docker-entrypoint.sh"]
    • 基本的一些语法就说这些,其他的一些命令大家根据自己的需要去查询,后面也会慢慢补充。

2、镜像仓库

​ 我们想要拉取镜像或者推送镜像都需要一个仓库,而docker的镜像仓库有很多,比如官方的仓库、阿里的仓库,还有自己搭建的仓库。

​ 如果要推送镜像到仓库,首先得有一个账户,这块大家自己去注册就好。接下来看如何推送 image 到镜像仓库中。

  • 官方镜像仓库

    • 在docker机器上登录

      • docker login
      • 输入用户名和密码
    • docker push [docker id docker仓库自己的用户名]/test-springboot

      • 如果要给 image 打个标签

        • docker tag test-springboot[[docker id]/test-springboot-image:v1.0
      image.png
      • 推送打上标签的 image 即可
    • push 成功之后,就可以通过 docker pull [docker id]/test-springboot-image:v1.0 拉取镜像了

  • 阿里云镜像仓库

image.png image.png
  • 仓库类型如果是私有,那只有管理员自己才可以下载,公开的就别人也可以下载。

  • 点击创建好的仓库,阿里云会告诉你如何去拉取和推送镜像

image.png image.png
  • 自建镜像仓库

    • 自建仓库其实已经有人帮我们实现了,可以在github中搜索 harbor 项目,下载到想当做仓库服务器的机器上。

    • 使用 harbor 有个前提,就是必须得先安装好 docker-compose

    • 解压tar包后进入harbor目录,修改 harbor.yml 文件

      • 主要是ip地址的修改成当前机器的ip地址
      • 同时也可以看到Harbor的密码,默认是Harbor12345
      # Configuration file of Harbor
      
      # The IP address or hostname to access admin UI and registry service.
      # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
      # 配置外网可以访问的域名或ip
      hostname: reg.mydomain.com
      
      # http related config
      http:
        # port for http, default is 80. If https enabled, this port will redirect to https port
        port: 80
      
      # 安全的https协议
      https:
        # https port for harbor, default is 443
        port: 443
        # The path of cert and key files for nginx
        certificate: /your/certificate/path
        private_key: /your/private/key/path
      
      # 默认密码
      harbor_admin_password: Harbor12345
      
      # Harbor DB configuration
      database:
        # The password for the root user of Harbor DB. Change this before any production use.
        password: root123
        # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
        max_idle_conns: 50
        # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
        # Note: the default number of connections is 100 for postgres.
        max_open_conns: 100
      
      # The default data volume
      data_volume: /data
      
      clair:
        # The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.
        updaters_interval: 12
      
      jobservice:
        # Maximum number of job workers in job service
        max_job_workers: 10
      
      notification:
        # Maximum retry count for webhook job
        webhook_job_max_retry: 10
      
      chart:
        # Change the value of absolute_url to enabled can enable absolute url in chart
        absolute_url: disabled
      
      # Log configurations
      log:
        # options are debug, info, warning, error, fatal
        level: info
        # configs for logs in local storage
        local:
          # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
          rotate_count: 50
      
          rotate_size: 200M
          # The directory on your host that store log
          location: /var/log/harbor
      
      _version: 1.10.0
      
      proxy:
        http_proxy:
        https_proxy:
        # no_proxy endpoints will appended to 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair,chartmuseum,notary-server
        no_proxy:
        components:
          - core
          - jobservice
          - clair
      
  • 安装harbor

    • sh install.sh
  • 安装完成后会默认以当前机器的80端口启动,访问之后输入用户名密码即可。

    • 用户名为:admin
  • 推送 image

    • 标记镜像
      • docker tag [image名称] [:TAG] [域名]/[仓库]/[image名称] [:TAG]
    • 推送镜像
      • docker push [域名]/[仓库]/[image名称] [:TAG]

3、Image常用操作

  • 查看本地image列表

    • docker image ls
    • docker images
  • 获取远端镜像

    • docker pull
  • 删除镜像 [注意此镜像如果正在使用,或者有关联的镜像,则需要先删除容器]

    • docker rm -f $(docker ps -aq) 删除所有容器
    • docker image rm imageid
    • docker rmi -f imageid
    • docker rmi -f $(docker image ls) 删除所有镜像
  • 运行镜像

    • docker run image
  • 发布镜像

    • docker push

4、container

  • container介绍

    前面我们已经知道 container 是由 image 运行起来的,那么可以理解为 container 和 image 是有某种关系存在的。

    其实可以理解为 container 只是基于 image 之后的 layer(层)而已,也就是可以通过docker run image 创建出一个 container 出来。

    下面这张图中,Container Layer 就是我们在运行一个容器之后增加的层,它是可以进行读写操作的,而下面的层都是只读的,不能去进行修改。

image.png

在上一节中,我们知道 container 是由 image 生成的,而 image 也可以由 container 去形成,这里就不再重复了。

  • container资源限制

    在前面章节中我们知道 docker 创建的容器是共享物理机资源的,如果不对 container 的资源进行限制,它就会无限制地使用物理机的资源,这样显然是不合适的。

    • 查看资源情况

      • docker stats tomcat01
        • 类似于Linux中的 top 命令
      • docker top tomcat01
        • 类似于Linux中的 ps -ef | grep tomcat
    • 内存限制

      • docker run -d --memory 100M --name tomcat01 tomcat

      • 限制 tomcat 容器的内存大小为100M

      image.png
  • CPU限制

    • --cpu-shares
      • docker run -d --cpu-shares 1024 --name tomcat02 tomcat
      • 设置容器 tomcat02 的权重为1024,默认就是1024
      • shares 不能单纯的通过一个容器的share值来看,而是多个在一起对比,比如A和B两个容器,A配置的是1024,B配置的是512,那么A最大可以使用的CPU资源是B的两倍
      • 这种配置是有弹性的,如果A容器一直闲着,那B容器是可以使用空闲资源的
    • --cpu-period 和 --cpu-quota
      • 这两个参数是相互配合使用的,--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而--cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟--cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。
      • 默认的 完全公平调度周期是100毫秒。
      • docker run -d --cpu-period=50000 --cpu-quota=25000 --name tomcat02 tomcat
        • 如果有1个CPU,这意味着容器每50毫秒可以获得50%的CPU运行时间。
        • --cpus=0.5 可以达到上面同样的效果,如果设置 --cpus=0.0,则相当于无限制
    • --cpuset-cpus
      • 设置允许容器执行的CPU。
      • docker run -it --cpuset-cpus="0-2" --name tomcat03 tomcat
        • 这意味着容器中的进程可以在cpu 1和cpu 3上执行。
      • docker run -it --cpuset-cpus="0-2" --name tomcat04 tomcat
        • 这意味着容器中的进程可以在cpu 0、cpu 1和cpu 2上执行。
  • 图形化资源监控

    • github上也有人已经开发好了,搜索weaveworks/scope

      • https://github.com/weaveworks/scope

      • sudo curl -L git.io/scope -o /usr/local/bin/scope

      • sudo chmod a+x /usr/local/bin/scope

      • scope launch ip1 ip2

        • 可以同时监控多台机器,不过每台机器都需要执行上面相同的命令
      • scope stop 停止scope

      • 按照步骤操作即可


        image.png
  • container常用操作

    • 根据镜像创建容器

      • docker run -d --name -p 9090:8080 my-tomcat tomcat
    • 查看运行中的container

      • docker ps
    • 查看所有的container[包含退出的]

      • docker ps -a
    • 删除container

      • docker rm containerid
      • docker rm -f $(docker ps -a) 删除所有container
    • 进入到一个container中

      • docker exec -it container bash
    • 根据container生成image

      • docker build
    • 查看某个container的日志

      • docker logs container
    • 查看容器资源使用情况

      • docker stats
    • 查看容器详情信息

      • docker inspect container
    • 停止/启动容器

      • docker stop/start container

5、 底层技术支持

Container是一种轻量级的虚拟化技术,不用模拟硬件创建虚拟机。

Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自
定义容器格式,从而提供一套虚拟运行环境。

  • Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等
  • CGroups: Controller Groups用来做资源限制,比如内存和CPU等
  • Union file systems:用来做image和container分层

相关文章

  • 三、Image与Container

    1、image image层的概念 现有的image都是怎么来的呢?其实image就是通过编译运行Dockerfi...

  • Docker浅尝(一)

    一 Container和Image Docker底层技术支持 Image Container Dockerfile...

  • Docker常用指令, since 2021-12-16

    镜像(image)和容器(container) container基于images,是image的'实例化'。注:...

  • Flutter入门

    一.Text 二.Container 三.Image 四.ListView 五.网格列表

  • Docker_2_基础常用命令

    首先应该搞懂docker的image和container是什么关系。image:container = class...

  • Docker简介

    Docker的三大核心概念:镜像(Image)、容器(Container)、仓库(Repository)。

  • Docker常用命令

    Docker包括镜像(image)、容器(container)和仓库(repository) Docker安装与启...

  • 容器启动的shell 脚本

    #!/bin/bash -ilex container=medical-cloud_container image...

  • Docker Container

    上一篇讲了docker image,接下来讲讲container。感觉“container 是image的运行实例...

  • docker的container

    1 container 构建 image 既然container是基于image之上的,想想是否能够由一个cont...

网友评论

    本文标题:三、Image与Container

    本文链接:https://www.haomeiwen.com/subject/uafljhtx.html