Always keep a beginner's mind, don'|

园龄:粉丝:关注:

📂工具
🔖doker
2025-03-01 17:41阅读: 6评论: 0推荐: 0

Docker基础篇

Docker基础篇

Docker基础篇

常见问题

1. docker中的mysql容器中无法使用vim命令

Docker简介

前提知识

  • git
  • maven

课程定位

  • javaee工程师

    • java--->springmvc,springboot,mybatis...
  • docker工程师

    • go---->swarm/compose/k8s.......
  • 总结:这节课只是docker基础,后面可能会有高级

是什么

  • 问题:为什么会有docker出现

    • 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验,
      Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以==消除协作编码==时“在我的机器上可正常工作”的问题。
    • 之前在服务器配置一个应用的运行环境,要安装各种软件,就拿尚硅谷电商项目的环境来说吧,Java/Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
    • 传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
  • docker理念

    • Docker是基于Go语言实现的云开源项目.Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
    • Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
  • 总结:解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

    • 软件容器:集装箱
    • 整体发布:驮着很多集装箱的鲸鱼

能干嘛

  • 之前的虚拟机技术

    • 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

    • 虚拟机的缺点:

      • 资源站占用多(因为本来有一个os,还要再占用资源启动一个os)
      • 冗余步骤多
      • 启动慢
  • 容器虚拟化技术

    • 由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

      • Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
  • 比较了 Docker 和传统虚拟化方式的不同之处

    • *传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
    • *而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
    • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
  • 开发/运维(Dev/Ops)

    • 一次构建、随处运行

      • 更快速的应用交付和部署

        传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

      • 更便捷的升级和扩缩容

        随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

      • 更简单的系统运维

        应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

      • 更高效的计算资源利用

        Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

去哪下

Docker安装

前提说明

  • CentOS Docker 安装

    • Docker支持以下的CentOS版本:

      • CentOS 7 (64-bit)
      • CentOS 6.5 (64-bit) 或更高的版本
    • 前提条件

      • 目前,CentOS 仅发行版本中的内核支持 Docker。
      • Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
      • Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

Docker的基本组成

  • 镜像(image)

    • Docker 镜像(Image)就是一个只读的模板。,本质上就是一种容器,又叫做镜像文件,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
  • 容器(container)

    • Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

    • 特点

      • 它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
      • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
      • 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
  • 仓库(repository)

    • 仓库(Repository)是集中存放镜像文件的场所

      • 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

      • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

        • 最大的公开仓库是 Docker Hub(https://hub.docker.com/),
        • 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
  • docker图标的含义

    • 蓝色的大海:代表宿主机linux
    • 鲸鱼:就是docker服务本身
    • 集装箱:就是容器,就是运行中的镜像
    • 镜像:在码头等待装入鲸鱼的集装箱
  • 小总结

    • 需要正确的理解仓储/镜像/容器这几个概念:

      • Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
      • image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
      • 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
      • 至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

安装步骤

  • CentOS6.8安装Docker

    • yum install -y epel-release

      Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EPEL包。

    • yum install -y docker-io

    • 安装后的配置文件:/etc/sysconfig/docker

    • 启动Docker后台服务:service docker start

    • docker version验证

  • CentOS7安装Docker

    • https://docs.docker.com/install/linux/docker-ce/centos/

    • 安装步骤

      • 官网中文安装参考手册

      • 确定你是CentOS7及以上版本

        • cat /etc/redhat-release
      • yum安装gcc相关

        • CentOS7能上外网
        • yum -y install gcc
        • yum -y install gcc-c++
      • 卸载旧版本

        • yum -y remove docker docker-common docker-selinux docker-engine

        • 2018.3官网版本

          yum remove docker
          docker-client
          docker-client-latest
          docker-common
          docker-latest
          docker-latest-logrotate
          docker-logrotate
          docker-selinux
          docker-engine-selinux
          docker-engine

      • 安装需要的软件包

        • yum install -y yum-utils device-mapper-persistent-data lvm2
      • 设置stable镜像仓库

      • 更新yum软件包索引

        • yum makecache fast
      • 安装DOCKER CE

        • yum -y install docker-ce
      • 启动docker

        • systemctl start docker
      • 测试

        • docker version
        • docker run hello-world
      • 配置镜像加速

        • mkdir -p /etc/docker

        • vim /etc/docker/daemon.json

          #网易云
          {"registry-mirrors": ["http://hub-mirror.c.163.com"] }

          #阿里云
          {
          "registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
          }

        • systemctl daemon-reload

        • systemctl restart docker

      • 卸载

        • systemctl stop docker
        • yum -y remove docker-ce
        • rm -rf /var/lib/docker

永远的HelloWorld

  • 阿里云镜像加速

    • 是什么

    • 注册一个属于自己的阿里云账户(可复用淘宝账号)

    • 获得加速器地址连接

      • 登陆阿里云开发者平台
      • 获取加速器地址
    • 配置本机Docker运行镜像加速器

      鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,
      我使用的是阿里云的本人自己账号的镜像地址(需要自己注册有一个属于你自己的): https://xxxx.mirror.aliyuncs.com

      • vim /etc/sysconfig/docker
        将获得的自己账户下的阿里云加速地址配置进
        other_args="--registry-mirror=https://你自己的账号加速信息.mirror.aliyuncs.com"
    • 重新启动Docker后台服务:service docker restart

    • Linux 系统下配置完加速器需要检查是否生效

      如果从结果中看到了配置的--registry-mirror参数说明配置成功,如下所示:

  • 启动Docker后台容器(测试运行 hello-world)

    • docker run hello-world

      • 输出这段提示以后,hello world就会运行输出内容,然后停止运行,容器自动终止。
    • run干了什么

底层原理

  • Docker是怎么工作的

    • Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
  • 为什么Docker比较比VM快

    • (1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
    • (2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

Docker常用命令

帮助命令

  • docker version
  • docker info:比version命令更加详细
  • docker --help

镜像命令

  • docker images:列出本地主机上的镜像

    • 结果说明

      • REPOSITORY:表示镜像的仓库源
      • TAG:镜像的标签
      • IMAGE ID:镜像ID
      • CREATED:镜像创建时间
      • SIZE:镜像大小
    • docker images OPTIONS说明:

      • -a :列出本地所有的镜像(含中间映像层),镜像像是洋葱一样,一层套一层
      • -q,--quiet :只显示镜像ID。
      • --digests :显示镜像的摘要信息
      • --no-trunc :不截取镜像信息,显示完整的镜像信息,镜像id很长
  • docker search 某个XXX镜像名字

    • 网站

      • https://hub.docker.com,docker是从官网上查,但是下载的时候从阿里云下载
    • 命令

      • docker search [OPTIONS] 镜像名字

      • OPTIONS说明:

        • --no-trunc : 显示完整的镜像描述
        • -s : 列出收藏数不小于指定值的镜像。
        • --automated : 只列出 automated build类型的镜像;
  • docker pull 某个XXX镜像名字

    • 下载镜像
    • docker pull 镜像名字[:TAG]
  • docker rmi 某个XXX镜像名字ID

    • 删除镜像

    • 删除单个

      • docker rmi -f 镜像ID
    • 删除多个

      • docker rmi -f 镜像名1:TAG 镜像名2:TAG
    • 删除全部

      • docker rmi -f $(docker images -qa)
  • 思考

    • 结合我们Git的学习心得,大家猜猜是否会有
      docker commit /docker push??

容器命令

  • 有镜像才能创建容器,这是根本前提(下载一个CentOS镜像演示)

    • docker pull centos
  • 新建并启动容器

    • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

      • OPTIONS说明

        • --name="容器新名字": 为容器指定一个名称;

        • -d: 后台运行容器,并返回容器ID,也即启动守护式容器;

        • -i:以交互模式运行容器,通常与 -t 同时使用;

        • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;

        • -it:登录docker启动的这个容器,并利用返回的一个终端跟容器进行交互,如果我们不加上这个-it 参数,那么我们则无法使用ctrl+p+q来暂时分离伪终端

        • -P: 随机端口映射;

        • -p: 指定端口映射,有以下四种格式

          • ip:hostPort:containerPort
          • ip::containerPort
          • hostPort:containerPort
          • containerPort
        • --privileged

          • 当我们想在 docker 容器内部中使用 systemctl 时,我们需要加上这个选项才可以

            • docker run --privileged -tid --name keepalived_slave keepalived_master:v1 /usr/sbin/init
      • 启动交互式容器

        • #使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。(如果不执bin/bash会导致我们无法正常 attatch,因为我们可能只是启动了一个服务程序,如 mysqld,该服务不接受用户的输入,所以在docker attach的时候会直接卡死)
        • docker run -it centos /bin/bash:只是进入 linux 环境,还需要手动启动对应的服务
  • 列出当前所有正在运行的容器

    • docker ps [OPTIONS]

      • OPTIONS说明

        • -a :列出当前所有正在运行的容器+历史上运行过的
        • -l :显示最近创建的容器。
        • -n:显示最近n个创建的容器。
        • -q :静默模式,只显示容器编号。
        • --no-trunc :不截断输出。
  • 退出容器

    • 两种退出方式

      • exit

        • 容器停止退出
      • ctrl+P+Q(ctlr 全程按住)

        • 容器不停止退出,要求启动容器时需要带上-it选项才能正常使用这个功能
  • 启动容器

    • docker start 容器ID或者容器名:要求容器已经事先存在,直接启动镜像是不行的,比如我们通过run启动了一个容器,接着又通过stop停止了一个容器,此时便用docker ps -n 2来查看之前运行的容器id,然后使用docker start 容器id来启动容器

    • docker run 镜像di:是新建并启动一个容器,本质上是先把镜像变为一个容器,然后启动

      • docker run -d 镜像id:后台启动服务,但是无法使用attach 容器id来重新接入容器的终端,但是我们可以使用exec -it 容器id shell来接入容器终端.这是因为attatch使用的是容器默认的 shell 进程,而默认的 shell 进程正在用来输出日志,而使用exec -it会自动生成一个新的 shell 进程来接入容器

        • 使用docker exec -it 2b725c3734a2 pwd是可以输出该命令的结果的
        • 使用docker exec -it 2b725c3734a2 /bin/sh可以接入终端
        • 使用docker attach  2b725c3734a2:会直接卡死
      • docker run -it 镜像id:前台启动服务(日志直接输出在前台),可以通过exec -it来重新接入容器的终端,但是通过attach会卡死,因为我们没有启动任何进程来接收用户的输入.,因为通过exec -it是重新建立一个 shell 进程,而 attach 使用的是默认的 shell 进程,而默认的shell 进程用来输出日志

        • 在前台日志使用用ctrl+C:直接容器也退出

        • 在前台日志使用ctrl+p+q:容器进入后台模式

          • 使用docker exec -it 9da972507350 pwd直接输出命令结果
          • 使用docker exec -it 9da972507350 /bin/sh进入容器终端
          • 使用docker attach 9da972507350接入容器终端卡住
      • docker run -it 镜像id /bin/bash:自动进入 docker 终端,但是不启动镜像对应的服务,我们需要在docker 终端中手动启动该服务,比较麻烦,但是可以在以后通过attach和exec来重新接入容器的终端

        • 在"开局"就给出的终端使用exit,直接退出容器

        • 使用ctrl+p+q让容器进入后台

      • (推荐)docker run -itd 镜像id:后台启动服务,可以通过exec来重新接入容器的终端,通过attach也不会卡死,因为我们选择了在后运行程序

        • 这个有待验证,因为我使用 tomcat 容器在这种情况下启动,使用attach也会卡死,所以应该跟容器的工作模式有关系,比如说 mysql 容器需要读取用户的输入,而tomcat 容器只是输出日志,根本不需要读取用户的输入,所以上述关于 attach 的说法不一定准确
  • 重启容器

    • docker restart 容器ID或者容器名
  • 停止容器

    • docker stop 容器ID或者容器名
  • 强制停止容器

    • docker kill 容器ID或者容器名
  • 删除已停止的容器

    • docker rm 容器ID

      • 一次性删除多个容器

        • docker rm -f $(docker ps -a -q)
        • docker ps -a -q | xargs docker rm
  • ==重要==

    • 启动守护式容器

      • docker run -d 镜像名

        • #使用镜像centos:latest以后台模式启动一个容器:docker run -d centos

        • 问题:然后docker ps -a 进行查看, 会发现容器已经退出?说好的后台运行呢?

        • 解决:很重要的要说明的一点: ==Docker容器后台运行,就必须有一个前台进程.==,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。centos后台启动就会自动关闭,但是tomcat后台启动就可以一直驻留

          • 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start,但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
      • docker run -d -p host端口号:容器内部端口号

    • 查看容器日志

      • docker logs -f -t --tail=数字 容器ID

        • 选项

          • -t 是加入时间戳
          • -f 跟随最新的日志打印
          • --tail=数字 显示最后多少条
        • 使用步骤

            1. 在shell中运行一下命令:docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
            1. docker logs -tf --tail=5 f3100284bf98使用该命令查看后台运行容器的输出日志
    • 查看容器内运行的进程(注意是容器)

      • docker top 容器ID
    • 查看容器内部细节

      • docker inspect 容器ID
    • 进入正在运行的容器并以命令行交互(就是我们使用ctrl+p+q来暂时退出容器的方式)

      • 两种方式

        • 第一种

          • docker exec -it 容器ID ls /etc:这种直接不进入容器,只获取容器的执行命令返回的结果

          • docker exec -it 容器ID /bin/bash :这种可以像是attach的效果一样,进入容器的虚拟终端

            • 比如我们启动了一个tomcat的容器,然后我们使用docker exec -it tomcat容器ID /bin/bash,就会进入一个linux中的/usr/lcoal/tomcat目录,这也说明了tomcat是运行在一个linux中的,容器是一个小型Linux,也说明tomcat镜像的层级结构
        • 第二种

          • 重新进入docker attach 容器ID
      • 上述两个区别

        • attach 直接进入容器启动命令的终端,不会启动新的进程
        • exec 是在容器中打开新的终端,并且可以启动新的进程,exec更为强大
    • 从容器内拷贝文件到宿主机上

      • docker cp 容器ID:容器内部路径 宿主机路径
    • 从宿主机上向容器内拷贝文件

      • docker cp 宿主机路径 容器ID:容器内部路径

小总结

  • 常用命令

    • attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
    • build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
    • commit Create a new image from a container changes # 提交当前容器为新的镜像
    • cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
    • create Create a new container # 创建一个新的容器,同 run,但不启动容器
    • diff Inspect changes on a container's filesystem # 查看 docker 容器变化
    • events Get real time events from the server # 从 docker 服务获取容器实时事件
    • exec Run a command in an existing container # 在已存在的容器上运行命令
    • export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
    • history Show the history of an image # 展示一个镜像形成历史
    • images List images # 列出系统当前镜像
    • import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
    • info Display system-wide information # 显示系统相关信息
    • inspect Return low-level information on a container # 查看容器详细信息
    • kill Kill a running container # kill 指定 docker 容器
    • load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
    • login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
    • logout Log out from a Docker registry server # 从当前 Docker registry 退出
    • logs Fetch the logs of a container # 输出当前容器日志信息
    • port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
    • pause Pause all processes within a container # 暂停容器
    • ps List containers # 列出容器列表
    • pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
    • push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
    • restart Restart a running container # 重启运行的容器
    • rm Remove one or more containers # 移除一个或者多个容器
    • rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    • run Run a command in a new container # 创建一个新的容器并运行一个命令
    • save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
    • search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
    • start Start a stopped containers # 启动容器
    • stop Stop a running containers # 停止容器
    • tag Tag an image into a repository # 给源中镜像打标签
    • top Lookup the running processes of a container # 查看容器中运行的进程信息
    • unpause Unpause a paused container # 取消暂停容器
    • version Show the docker version information # 查看 docker 版本号
    • wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值

Docker 镜像

引入

  • tomcat为什么那么大

镜像是什么

  • 直接理解

    • 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  • 镜像底层原理

    • UnionFS(联合文件系统)

      • UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它==支持对文件系统的修改作为一次提交来一层层的叠加==,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
      • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • Docker镜像加载原理

    • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

      • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
      • rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
    • 问题: 平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

      • 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
    • 问题:为什么tomcat要几百M,平时使用的tomcat并没有那么大?

      • 因为tomcat要运行起来需要一个基本的环境,所以文件会一层层包装起来,最后暴露一个tomcat
      • 我们实际在docker中安装centos也是分层次下载文件
  • 为什么 Docker 镜像要采用这种分层结构呢

    • 最大的一个好处就是 - 共享资源

      • 比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
      • 这也是为啥卸载了docker的centos镜像,但是第二次下载就会很快,因为docker内部建立了缓存

特点

  • Docker镜像都是只读的
  • 当容器启动时,一个新的可写层被加载到镜像的顶部。
  • 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

Docker镜像commit操作补充

  • docker commit提交容器副本使之成为一个新的镜像

  • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

  • 案例演示

    • 从Hub上下载tomcat镜像到本地并成功运行

      • docker run -it -p 8080:8080 tomcat

        • -p 主机端口:docker容器端口
        • -P 随机分配端口
        • i:交互
        • t:终端
    • 故意删除上一步镜像生产tomcat容器的文档

    • 也即当前的tomcat运行实例是一个没有文档内容的容器,以它为模板commit一个没有doc的tomcat新镜像atguigu/tomcat02

      • docker commit -m "on docs tomcat" -a "raymond" 0b2622fc462e raymond/tomcat:2.0
    • 启动我们的新镜像并和原来的对比

      • 启动raymond/tomcat:2.0,它没有docs
      • 新启动原来的tomcat,它有docs

Docker容器数据卷

是什么

  • 一句话:有点类似我们Redis里面的rdb和aof文件

  • 先来看看Docker的理念:

    • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望有可能共享数据
    • Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。
  • 数据卷

    • 概念

      • 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
    • 特点

      • 1:数据卷可在容器之间共享或重用数据
      • 2:卷中的更改可以直接生效
      • 3:数据卷中的更改不会包含在镜像的更新中
      • 4:数据卷的生命周期一直持续到没有容器使用它为止

能干嘛

  • 容器的持久化
  • 容器间继承
  • 宿主机和容器之间共享数据:做到二者共享的文件夹之间数据实时同步

数据卷

  • 容器内添加数据卷

    • 直接命令添加

      • 命令

        • docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 /bin/bash
      • 查看数据卷是否挂载成功

        • docker inspect 容器ID
      • 特点

        • 容器和宿主机之间数据实时同步共享
        • 即使容器停止退出后,主机修改后数据也会在容器中进行同步
      • 命令(带权限)

        • docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

          • ro:read only,主机对于共享目录可读可写,但是容器对共享目录只能读,不能写
    • DockerFile添加

      • 引入:什么是DockerFile

        • DockerFIle之于Image就像是Person.class之于Person.java一样,DockerFile文件是其对应的镜像文件的描述文件,我们拿到DockerFile文件然后运行docker build命令,就可以获得对应的镜像文件,DockerFile内部的代码是对其对应的镜像文件的描述,语法上类似SHELL编程
      • 步骤

        • 根目录下新建mydocker/文件夹并进入

        • 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷:VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"],==这里的目录都是容器的目录,没有宿主机的目录,之后会分析宿主机对应的目录==

          • 说明:出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法(即为直接命令添加共享卷的方法)不能够直接在Dockerfile中实现。这是因为宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。所以我们的DockerFile描述的镜像文件就不能保证可以在所有的机器中进行运行
        • 新建一个dockerfile文件

          volume test

          FROM centos
          VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
          CMD echo "finished,--------success1"
          CMD /bin/bash

        • 使用docker build后生成镜像:$ docker build -f /root/dockerfiles/mydockerfile -t raymodn/centos .,并获取一个新的镜像raymodn/centos

        • docker run新build获得到的容器raymond/cenos

        • 通过上述步骤,容器内的卷目录地址已经知道
          对应的主机目录地址哪??docker有默认的地址

          • 1. 使用docker inspect 容器id,根据返回的内容获取宿主机对应的共享目录
            1. 根据第一步内容去宿主机的对应目录查看同步的数据
    • 使用 docker 命令添加(而不是在 docker run 的时候指定)

      • 举例

        $ docker volume create portainer_data
        $ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
        • 我们首先创建一个docker数据卷,该数据卷自动映射到/var/lib/docker/volumes/portainer_data/_data
    • 备注

      Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
      解决办法:在挂载目录后多加一个--privileged=true参数即可

数据卷容器

  • 是什么

    • 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

    • 我的理解

      • 建立一个父容器来挂载数据卷,其他容器通过挂载这个父容器来实现数据共享,这个父容器称为数据卷容器
      • 有点像一条绳子上的蚂蚱
  • 总体介绍

    • 以上一步新建的镜像raymond/centos为模板并运行容器dc01/dc02/dc03

    • dc01/02/03都会具有容器卷,因为他们都是以镜像raymond/centos为基础来运行的,所以都会有一下两个volunme卷

      • /dataVolumeContainer1
      • /dataVolumeContainer2
  • 容器间传递共享(--volumes-from)

    • 先启动一个父容器dc01:docker run -it --name=dc01 raymodn/centos,然后并在/dataVolumeContainer2目录下新增内容

    • dc02/dc03继承自dc01

      • --volumes-from参数:表示继承

      • dc02/03命令

        • 执行docker run -it --name=dc02 --volumes-from=dc01 raymodn/centos,并在dataVolumeContainer2新增内容
        • 执行docker run -it --name=dc03 --volumes-from=dc01 raymodn/centos,并在dataVolumeContainer2新增内容
    • 回到dc01可以看到02/03各自添加的都能共享了

    • 删除dc01,dc02修改后dc03仍然可以访问所有文件

    • 删除dc02后dc03仍然可以访问所有文件

    • 新建dc04继承dc03后再删除dc03,dc04仍然可以访问所有文件

    • 总结:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

DockerFile解析

是什么

  • Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

  • 构建三步骤

    • 编写Dockerfile文件
    • docker build获取一个由Dockerfile编译而来的镜像
    • docker run 编译而来的镜像
  • dockerfile文件什么样

    • 以我们熟悉的CentOS为例

DockerFile构建过程解析

  • Dockerfile内容基础知识

    • 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
    • 2:指令按照从上到下,顺序执行
    • 3:#表示注释
    • 4:==每条指令都会创建一个新的镜像层,并对镜像进行提交commit==
  • Docker执行Dockerfile的大致流程

    • (1)docker从基础镜像scratch运行一个容器,scratch是docker的基础镜像,就像是java中的Object类
    • (2)执行一条指令并对容器作出修改
    • (3)执行类似docker commit的操作提交一个新的镜像层
    • (4)docker再基于刚提交的镜像运行一个新容器
    • (5)执行dockerfile中的下一条指令直到所有指令都执行完成
  • 小总结

    • 从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

      • Dockerfile是软件的原材料,可以编译出来docker镜像
      • 1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
      • Docker镜像是软件的交付品,通过docker run产生docker容器
      • 2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
      • Docker容器则可以认为是软件的运行态。
      • 3 Docker容器,容器是直接提供服务的。

DockerFile体系结构(保留字指令)

  • FROM

    • 基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER

    • 镜像维护者的姓名和邮箱地址
  • RUN

    • 容器构建时需要运行的shell命令
  • EXPOSE

    • 当前容器对外暴露出的端口
  • WORKDIR

    • 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • ENV

    • 用来在构建镜像过程中设置环境变量

      • 定义:ENV MY_PATH /usr/mytest
      • 使用:WORKDIR $MY_PATH
      • 这个环境变量可以在后续的任何RUN指令其他指令中使用,这就如同在命令前面指定了环境变量前缀一样;
  • ADD

    • 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY

    • 类似ADD,拷贝主机的文件和目录到镜像中,但是不会自动处理URL和解压tar压缩包.将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

      • COPY src dest
      • COPY ["src", "dest"]
  • VOLUME

    • 容器数据卷,用于数据保存和持久化工作
  • CMD

    • 指定一个容器启动时要运行的命令

    • 特点

      • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效(最后一个命令前的所有命令都会被覆盖掉)
      • CMD 会被 docker run 之后的参数替换,即为覆盖dockerfile中的CMD的最后一行
  • ENTRYPOINT

    • 指定一个容器启动时要运行的命令

    • 特点

      • ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
      • ENTRYPOINT, docker run 之后的参数会追加在ENTRYPOINT后
  • ONBUILD

    • 当构建一个被继承的Dockerfile时运行ONBUILD命令,父镜像在被子继承后父镜像的onbuild被触发
  • 小总结

案例

  • Base镜像(scratch)

    • Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的
  • 自定义镜像mycentos

    • 引入

      • Hub默认CentOS镜像什么情况

        • 自定义mycentos目的使我们自己的镜像具备如下:

          • 修改登陆后的默认路径
          • 有vim编辑器
          • 可以使用查看网络配置ifconfig
    • 步骤

      • 编写

        • 准备编写DockerFile文件

          • centos2.0

            FROM centos
            MAINTAINER zzyy<zzyy167@126.com>
            ENV MYPATH /usr/local
            WORKDIR $MYPATH
            RUN yum -y install vim
            RUN yum -y install net-tools
            EXPOSE 80
            CMD echo $MYPATH
            CMD echo "success--------------ok"
            CMD /bin/bash

      • 构建

        • docker build -f /tmp/centos2.o -t 新镜像名字:TAG .(注意这里有一个.表示当前路径)
      • 运行

        • docker run -it 新镜像名字:TAG ,可以看到,我们自己的新镜像已经支持vim/ifconfig命令,扩展成功了。
      • 列出镜像的变更历史

        • docker history 镜像名
  • CMD/ENTRYPOINT 镜像案例

    • 都是指定一个容器启动时要运行的命令

    • CMD

      • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,不仅如此,CMD还会被 docker run 之后的参数替换

      • 案例

        • tomcat的讲解演示

          • docker run -it -p 8888:8080 tomcat pwd:发现tomcat没有运行起来,但是控制台却打印了pwd命令的结果,可见tomcat最后一句的CMD ["catalina.sh", "run"]docker run命令后的shell命令替换了,而没有去执行启动tomcat命令
    • ENTRYPOINT

      • docker run 之后的参数会被==当做参数传递给 ENTRYPOINT==,之后形成新的命令组合

      • 案例

        • 在dockerfile中使用CMD来执行命令

          • 制作CMD版可以查询IP信息的容器

            FROM centos
            RUN yum install -y curl
            CMD [ "curl", "-s", "http://ip.cn" ]
            • crul命令解释

              curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。
              如果系统没有curl可以使用yum install curl安装,也可以下载安装。
              curl是将下载文件输出到stdout

              使用命令:curl http://www.baidu.com
              执行后,www.baidu.com的html就会显示在屏幕上了

              这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数 -i

          • 问题

            • 如果我们希望显示 HTTP 头信息,就需要加上 -i 参数
          • 结果

            • 我们可以看到可执行文件找不到的报错,executable file not found。之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。因此这里的 -i 替换了原来的 CMD,而不是添加在原来的 curl -s http://ip.cn 后面。而 -i 根本不是命令,所以自然找不到。
            • 那么如果我们希望加入 -i 这参数,我们就必须重新完整的输入这个命令:docker run myip curl -s http://ip.cn -i,但是这样我们的dockerfile中的CMD命令不就是毫无意义了吗?
        • 在dockerfile中使用ENTRYPOINT来执行命令

          • 使用ENTROYPOINT替换CMD制作dockerfile

            FROM centos
            RUN yum install -y curl
            ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
          • 问题

            • 当我们使用docker run myip -i命令启动docker容器,发现请求头一并输出在控制台上
          • 结论

            • 证明我们的docker run后面的-i参数并没有覆盖掉我们的ENTRYPOINT命令,而是作为参数追加到了命令后
  • 自定义镜像Tomcat9

    • 1. 在宿主机上下载上述两个文件

    • 在/root/dockerfiles/mytomcat目录下,创建mytomcat9文件,内容如下

      FROM centos
      MAINTAINER raymond<88888888@qq.com>
      #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
      COPY host.txt /usr/local/cincontainer.txt
      #把java与tomcat添加到容器中
      ADD jdk-8u261-linux-x64.tar.gz /usr/local/
      ADD apache-tomcat-9.0.37.tar.gz /usr/local/
      #安装vim编辑器
      RUN yum -y install vim
      #设置工作访问时候的WORKDIR路径,登录落脚点
      ENV MYPATH /usr/local
      WORKDIR $MYPATH
      #配置java与tomcat环境变量
      ENV JAVA_HOME /usr/local/jdk1.8.0_261
      ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
      ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37
      ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/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.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out

    • 使用$ docker build -f mytomcat9 -t raymond/mytomcat9 .构建镜像

    • docker run -p 8888:8080 -v /root/dockerfiles/webapps/test/:/usr/local/apache-tomcat-9.0.37/webapps/test/ -v /root/dockerfiles/logs/:/usr/local/apache-tomcat-9.0.37/logs/ raymond/mytomcat9

      • 注意在使用-v命令来建立共享文件夹的时候,一定要注意==容器中的共享文件夹一定要是空的,如果不是空的,则容器启动失败==,但是宿主机的共享文件夹可以不为空
    • 验证

      • 直接使用curl http://localhost:8888
    • 结合前述的容器卷将测试的web服务test发布

      • 在宿主机上的共享文件夹中/root/dockerfiles/webapps/test/中添加web.xmla.jsp

        • web.xml

          <?xml version="1.0" encoding="UTF-8"?> 
          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns="http://java.sun.com/xml/ns/javaee" 
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
           id="WebApp_ID" version="2.5"
            
           <display-name>test</display-name> 
            
          </web-app> 
        • a.jsp

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
          <html> 
           <head> 
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
            <title>Insert title here</title> 
           </head> 
           <body> 
            -----------welcome------------ 
            <%="i am in docker tomcat self "%> 
            <br> 
            <br> 
            <% System.out.println("=============docker tomcat self");%> 
           </body> 
          </html> 
      • 测试

小总结

Docker常用安装

总体步骤

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止容器
  • 移除容器

安装tomcat

  • docker hub上面查找tomcat镜像

    • docker search tomcat
  • 从docker hub上拉取tomcat镜像到本地

    • docker pull tomcat

      • 1官网命令
      • 2拉取完成
  • docker images查看是否有拉取到的tomcat

  • 使用tomcat镜像创建容器(也叫运行镜像)

    • docker run -it -p 8080:8080 tomcat

      • -p 主机端口:docker容器端口
      • -P 随机分配端口
      • i:交互
      • t:终端

安装mysql

  • docker hub上面查找mysql镜像

  • 从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.6

  • 使用mysql5.6镜像创建容器(也叫运行镜像)

    • 使用mysql镜像

      命令说明:。-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。-v /zzyyuse/mysql/data:/var/lib/mysql :将主机/zzyyuse/mysql目录下的data目录挂载到容器的 /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。-d mysql:5.6 : 后台程序运行mysql5.6

      docker exec -it MySQL运行成功后的容器ID /bin/bash

      • docker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

        • -p 12345:3306:将主机的12345端口映射到docker容器的3306端口
        • --name mysql:运行服务名字
        • -v /zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d/目录中来
      • 示例

        • docker run -p 3306:3306 --name mysql5.7 -v /root/dockerData/mysql/conf:/etc/mysql/conf.d -v /root/dockerData/mysql/logs:/logs -v /root/dockerData/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    • 外部Win10也来连接运行在dokcer上的mysql服务

    • 数据备份小测试(可以不做)

      docker exec myql服务容器ID sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /zzyyuse/all-databases.sql

安装redis

  • 从docker hub上(阿里云加速器)拉取redis镜像到本地标签为3.2

  • 使用redis3.2镜像创建容器(也叫运行镜像)

    • 使用镜像

      docker run -p 6379:6379 -v /zzyyuse/myredis/data:/data -v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

    • 在主机/zzyyuse/myredis/conf/redis.conf目录下新建redis.conf文件
      vim /zzyyuse/myredis/conf/redis.conf/redis.conf

      Redis configuration file example.

      Note that in order to read the configuration file, Redis must be

      started with the file path as first argument:

      ./redis-server /path/to/redis.conf

      Note on units: when memory size is needed, it is possible to specify

      it in the usual form of 1k 5GB 4M and so forth:

      1k => 1000 bytes

      1kb => 1024 bytes

      1m => 1000000 bytes

      1mb => 1024*1024 bytes

      1g => 1000000000 bytes

      1gb => 102410241024 bytes

      units are case insensitive so 1GB 1Gb 1gB are all the same.

      ################################## INCLUDES ###################################

      Include one or more other config files here. This is useful if you

      have a standard template that goes to all Redis servers but also need

      to customize a few per-server settings. Include files can include

      other files, so use this wisely.

      Notice option "include" won't be rewritten by command "CONFIG REWRITE"

      from admin or Redis Sentinel. Since Redis always uses the last processed

      line as value of a configuration directive, you'd better put includes

      at the beginning of this file to avoid overwriting config change at runtime.

      If instead you are interested in using includes to override configuration

      options, it is better to use include as the last line.

      include /path/to/local.conf

      include /path/to/other.conf

      ################################## NETWORK #####################################

      By default, if no "bind" configuration directive is specified, Redis listens

      for connections from all the network interfaces available on the server.

      It is possible to listen to just one or multiple selected interfaces using

      the "bind" configuration directive, followed by one or more IP addresses.

      Examples:

      bind 192.168.1.100 10.0.0.1

      bind 127.0.0.1 ::1

      ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the

      internet, binding to all the interfaces is dangerous and will expose the

      instance to everybody on the internet. So by default we uncomment the

      following bind directive, that will force Redis to listen only into

      the IPv4 lookback interface address (this means Redis will be able to

      accept connections only from clients running into the same computer it

      is running).

      IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES

      JUST COMMENT THE FOLLOWING LINE.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      #bind 127.0.0.1

      Protected mode is a layer of security protection, in order to avoid that

      Redis instances left open on the internet are accessed and exploited.

      When protected mode is on and if:

      1) The server is not binding explicitly to a set of addresses using the

      "bind" directive.

      2) No password is configured.

      The server only accepts connections from clients connecting from the

      IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain

      sockets.

      By default protected mode is enabled. You should disable it only if

      you are sure you want clients from other hosts to connect to Redis

      even if no authentication is configured, nor a specific set of interfaces

      are explicitly listed using the "bind" directive.

      protected-mode yes

      Accept connections on the specified port, default is 6379 (IANA #815344).

      If port 0 is specified Redis will not listen on a TCP socket.

      port 6379

      TCP listen() backlog.

      In high requests-per-second environments you need an high backlog in order

      to avoid slow clients connections issues. Note that the Linux kernel

      will silently truncate it to the value of /proc/sys/net/core/somaxconn so

      make sure to raise both the value of somaxconn and tcp_max_syn_backlog

      in order to get the desired effect.

      tcp-backlog 511

      Unix socket.

      Specify the path for the Unix socket that will be used to listen for

      incoming connections. There is no default, so Redis will not listen

      on a unix socket when not specified.

      unixsocket /tmp/redis.sock

      unixsocketperm 700

      Close the connection after a client is idle for N seconds (0 to disable)

      timeout 0

      TCP keepalive.

      If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence

      of communication. This is useful for two reasons:

      1) Detect dead peers.

      2) Take the connection alive from the point of view of network

      equipment in the middle.

      On Linux, the specified value (in seconds) is the period used to send ACKs.

      Note that to close the connection the double of the time is needed.

      On other kernels the period depends on the kernel configuration.

      A reasonable value for this option is 300 seconds, which is the new

      Redis default starting with Redis 3.2.1.

      tcp-keepalive 300

      ################################# GENERAL #####################################

      By default Redis does not run as a daemon. Use 'yes' if you need it.

      Note that Redis will write a pid file in /var/run/redis.pid when daemonized.

      #daemonize no

      If you run Redis from upstart or systemd, Redis can interact with your

      supervision tree. Options:

      supervised no - no supervision interaction

      supervised upstart - signal upstart by putting Redis into SIGSTOP mode

      supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET

      supervised auto - detect upstart or systemd method based on

      UPSTART_JOB or NOTIFY_SOCKET environment variables

      Note: these supervision methods only signal "process is ready."

      They do not enable continuous liveness pings back to your supervisor.

      supervised no

      If a pid file is specified, Redis writes it where specified at startup

      and removes it at exit.

      When the server runs non daemonized, no pid file is created if none is

      specified in the configuration. When the server is daemonized, the pid file

      is used even if not specified, defaulting to "/var/run/redis.pid".

      Creating a pid file is best effort: if Redis is not able to create it

      nothing bad happens, the server will start and run normally.

      pidfile /var/run/redis_6379.pid

      Specify the server verbosity level.

      This can be one of:

      debug (a lot of information, useful for development/testing)

      verbose (many rarely useful info, but not a mess like the debug level)

      notice (moderately verbose, what you want in production probably)

      warning (only very important / critical messages are logged)

      loglevel notice

      Specify the log file name. Also the empty string can be used to force

      Redis to log on the standard output. Note that if you use standard

      output for logging but daemonize, logs will be sent to /dev/null

      logfile ""

      To enable logging to the system logger, just set 'syslog-enabled' to yes,

      and optionally update the other syslog parameters to suit your needs.

      syslog-enabled no

      Specify the syslog identity.

      syslog-ident redis

      Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7.

      syslog-facility local0

      Set the number of databases. The default database is DB 0, you can select

      a different one on a per-connection basis using SELECT where

    • 测试redis-cli连接上来

      docker exec -it 运行着Rediis服务的容器ID redis-cli

    • 测试持久化文件生成

本地镜像发布到阿里云

本地镜像发布到阿里云流程

镜像的生成方法

  • 前面的DockerFile

  • 从容器创建一个新的镜像
    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

    • OPTIONS说明:

      • -a :提交的镜像作者;
      • -m :提交时的说明文字;

将本地镜像推送到阿里云

  • 本地镜像素材原型

  • 阿里云开发者平台

  • 创建仓库镜像

    • 命名空间
    • 仓库名称:一个仓库对应一个应用
  • 将镜像推送到registry

  • 公有云可以查询到

  • 查看详情

将阿里云上的镜像下载到本地

  • 下载到本地

本文作者:欢迎来到红豆绿豆部落格

本文链接:https://www.cnblogs.com/hdld/p/18745211/docker-basics-2ufip9

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   红豆绿豆abc  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起