Docker每天学一点05 - Registry
前面已经学会怎样构建镜像了,这一章介绍怎样分发镜像给多个Docker Host使用, 可以通过复制Dockerfile、将镜像上传至公共Registry、搭建私有Registry三种方式。
这里将后面两种方式,怎样使用公共Registry和搭建私有Registry。
前面已经学会怎样构建镜像了,这一章介绍怎样分发镜像给多个Docker Host使用, 可以通过复制Dockerfile、将镜像上传至公共Registry、搭建私有Registry三种方式。
这里将后面两种方式,怎样使用公共Registry和搭建私有Registry。
是时候系统学习 Dockerfile 了,下面介绍 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。
镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。
如果我们想要创建自己的镜像,肯定要先了解镜像的内部结构。
hello-world 是 Docker 官方提供的一个镜像,通常用来验证 Docker 是否安装成功。 我先从这个最小镜像开始说下,之前已经把它下载下来了。
hello-world 的 Dockerfile 内容如下:
1 | FROM scratch # 此镜像是从白手起家,从 0 开始构建。 |
镜像 hello-world 中就只有一个可执行文件 “hello”,其功能就是打印出 “Hello from Docker ……” 等信息。
Docker 的核心组件包括:
Docker 架构图如下:

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。 客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。 开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
可以将容器想象成运输行业中的集装箱,Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。 Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。
其实,”集装箱” 和 “容器” 对应的英文单词都是 “Container”。”容器” 是国内约定俗成的叫法, 可能是因为容器比集装箱更抽象,更适合软件领域的原故吧。Docker 的 Logo 不就是一条鲸鱼上面一堆集装箱吗?
第一篇我先搭建实验环境,尽快让一个容器运行起来,我使用的操作系统是CentOS7.2,安装的是免费的社区版CE。
在泛型编程时,使用部分限定的形参时,<? super T>和<? extends T>的使用场景容易混淆,
PECS原则可以帮助我们很好记住它们:提供者(Provider)使用extends,消费者(Consumer)使用super。
[!NOTE] Provider指的就是该容器从自己的容器里提供T类型或T的子类型的对象供别人使用;
Consumer指的就是该容器把从别处拿到的T类型或T的子类型的对象放到自己的容器。
上一篇介绍了Unix系统支持的I/O模型,以及相应的在Java中的实现方式。本篇重点讲解一下Reactor模型原理和实现机制。
I/O多路复用又被称为”事件驱动”,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪), 能够通知程序进行相应的读写操作,技术上是通过调用操作系统的select、pselect、poll、epoll来实现。
与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
Reactor是一种应用在服务器端的开发模式,目的是提高服务端程序的并发能力,其实就是实现了I/O多路复用这种I/O模型。
同步、异步、阻塞、非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作。而在文件读取这件事儿上,可以有多种方式。
本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几种I/O模型,以及Java支持的I/O模型。
在解释I/O模型之前,我先说明一下几个操作系统的概念
在Nginx调试问题的时候经常需要打印请求头和响应头信息,这里记录一下Nginx日志的配置方法。
一般的应用都是通过Nginx来做为反向代理,并且Nginx还可能是多层的。如果想在内部服务里面获取最原始的客户端IP地址。 则需要做一些配置。