当我们pull一个registry镜像或者自己制作一个镜像之后,使用命令docker run -d -p 5000:5000 registry,就可以启动一个私有容器服务,那么究竟是怎么做到的呢?

首先docker ps显示cmd是 "docker-registry",但是启动的时候并没有输入。
  root@host-10-9-27-62:/home/opuser# docker ps
  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  ffca4ca34c3f registry "docker-registry" 24 hours ago Up 22 hours 0.0.0.0:5000->5000/tcp desperate_lumiere

记得dockerfile中可以指定启动docker后执行的命令,下面看看创建registry镜像的Dockerfile
  root@ffca4ca34c3f:/# cat docker-registry/Dockerfile
# VERSION 0.1
# DOCKER-VERSION 0.7.3
# AUTHOR: Sam Alba <sam@docker.com>
# DESCRIPTION: Image with docker-registry project and dependecies
# TO_BUILD: docker build -rm -t registry .
# TO_RUN: docker run -p 5000:5000 registry

# Latest Ubuntu LTS
FROM ubuntu:14.04

# Update
RUN apt-get update \
# Install pip
&& apt-get install -y \
swig \
python-pip \
# Install deps for backports.lzma (python2 requires it)
python-dev \
python-mysqldb \
python-rsa \
libssl-dev \
liblzma-dev \
libevent1-dev \
# Install deps for building gevent
curl \
cython \
&& rm -rf /var/lib/apt/lists/*

COPY . /docker-registry
COPY ./config/boto.cfg /etc/boto.cfg

# Install core
RUN pip install /docker-registry/depends/docker-registry-core

# Install gevent 1.0.1 using updated config.guess and config.sub
RUN curl https://pypi.python.org/packages/source/g/gevent/gevent-1.0.1.tar.gz | tar -xzf - -C / \
&& curl -o /gevent-1.0.1/libev/config.guess \
'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' \
&& curl -o /gevent-1.0.1/libev/config.sub \
'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' \
&& cp -pf /gevent-1.0.1/libev/config.guess /gevent-1.0.1/c-ares/config.guess \
&& cp -pf /gevent-1.0.1/libev/config.sub /gevent-1.0.1/c-ares/config.sub \
&& pip install /gevent-1.0.1

# Install registry
RUN pip install file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors]

RUN patch \
$(python -c 'import boto; import os; print os.path.dirname(boto.__file__)')/connection.py \
< /docker-registry/contrib/boto_header_patch.diff

ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml
ENV SETTINGS_FLAVOR dev

EXPOSE 5000

CMD ["docker-registry"]

可以看到最后一句CMD ["docker-registry"] ,就是这里了。

那么这个命令是怎么启动registry服务的呢?进入registry容器里
  root@ffca4ca34c3f:/# which docker-registry
  /usr/local/bin/docker-registry

  root@ffca4ca34c3f:/# cat /usr/local/bin/docker-registry
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'docker-registry==1.0.0-dev','console_scripts','docker-registry'
__requires__ = 'docker-registry==1.0.0-dev'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
sys.exit(
load_entry_point('docker-registry==1.0.0-dev', 'console_scripts', 'docker-registry')()
)
这里用到了Python的一个方法,不太清楚,可以参考文章
  http://blog.sina.com.cn/s/blog_85998e380101bojs.html
  http://www.cnblogs.com/babykick/archive/2012/03/09/2387808.html
继续往下看

  root@ffca4ca34c3f:/# cat /usr/local/lib/python2.7/dist-packages/docker_registry-1.0.0_dev-py2.7.egg-info/entry_points.txt
[console_scripts]
docker-registry = docker_registry.run:run_gunicorn
到这里就大概知道什么回事了,其实是调用了run.py的run_gunicorn方法

  root@ffca4ca34c3f:/# cat /usr/local/lib/python2.7/dist-packages/docker_registry/run.py
def run_gunicorn():
"""Exec gunicorn with our wsgi app.
......

args = [
gunicorn_path, 'gunicorn',
'--access-logfile', env.source('GUNICORN_ACCESS_LOG_FILE'),
'--error-logfile', env.source('GUNICORN_ERROR_LOG_FILE'),
'--max-requests', '100',
'-k', 'gevent',
'--graceful-timeout', env.source('GUNICORN_GRACEFUL_TIMEOUT'),
'-t', env.source('GUNICORN_SILENT_TIMEOUT'),
'-w', env.source('GUNICORN_WORKERS'),
'-b', address,
]

......

args += env.source('GUNICORN_OPTS')
args.append('docker_registry.wsgi:application')
# Stringify all args and call
os.execl(*[str(v) for v in args])

run_gunicorn()调用了gunicorn程序,在host上ps的时候可以看到,registry容器启动了5个gunicorn进程。
  root 17466 0.0 0.9 21504 19264 ? Ss Dec09 0:00 /usr/bin/python /usr/local/bin/gunicorn --access-logfile - --error-logfil
  root 17480 1.2 2.2 48896 45888 ? S Dec09 15:37 /usr/bin/python /usr/local/bin/gunicorn --access-logfile - --error-logfil
  root 17481 1.2 2.2 48960 46080 ? S Dec09 15:34 /usr/bin/python /usr/local/bin/gunicorn --access-logfile - --error-logfil
  root 17482 1.2 2.2 49088 46080 ? S Dec09 15:35 /usr/bin/python /usr/local/bin/gunicorn --access-logfile - --error-logfil
  root 17483 1.2 2.2 49664 46720 ? S Dec09 15:34 /usr/bin/python /usr/local/bin/gunicorn --access-logfile - --error-logfil

参考资料
  Gunicorn - Python WSGI HTTP Server for UNIX
  www.gunicorn.org

Docker Registry服务启动过程浅析的更多相关文章

  1. 在Ubuntu14.04系统POWER8服务器上搭建Docker Registry服务

    本文描述了如何在POWER8服务器上搭建一个本地化的Docker镜像仓库,主要涉及镜像制作,Docker Registry服务启动等.希望能够对在非X86服务器上搭建Docker仓库的同学提供参考. ...

  2. Linux入门——开机启动过程浅析

    Linux开机启动过程浅析 Introduction 开机启动过程分为以下6个步骤,分别是BIOS, MBR, GRUB, Kernel, Init, RunLevel, RunDefinition ...

  3. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  4. Android AudioPolicyService服务启动过程

    AudioPolicyService是策略的制定者,比如什么时候打开音频接口设备.某种Stream类型的音频对应什么设备等等.而AudioFlinger则是策略的执行者,例如具体如何与音频设备通信,如 ...

  5. docker compose 服务启动顺序控制

    概要 docker-compose 可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序. docker-comp ...

  6. A20(Cubieboard2)启动过程浅析

    A20支持从NAND Flash.SPI NOR Flash.SD card(SDC 0/2)和USB启动.当系统上电时,首先检测Boot Select Pin(BSP)管脚,如果为低电平,则直接从U ...

  7. Framework启动过程浅析

    浅显的总结一下Framework启动大概过程 总体 Android底层是linux系统,因而在开机时仍然是运行天字第一号进程inti,读取init.rc来创建第一个Dalvik进程zygote,下面是 ...

  8. Harbor安装部署--基于 Docker Distribution 的企业级 Registry 服务

    harbor简介 Harbor 是一个企业级 Registry 服务.它对开源的 Docker Registry 服务进行了扩展,添加了更多企业用户需要的功能.Harbor 被设计用于部署一套组织内部 ...

  9. 部署私有Docker Registry

    安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...

随机推荐

  1. 库函数API和C语言汇编语言混合式编程

    C语言代码内嵌汇编的方法: 在C语言文件中以如下格式加入汇编代码 __asm__( “汇编语句模板” :输出部分 :输入部分 :“破坏描述部分” ) asm可以由__asm__代替,为其别名. 可加上 ...

  2. codeforces 722C (并查集)

    题目链接:http://codeforces.com/contest/722/problem/C 题意:每次破坏一个数,求每次操作后的最大连续子串和. 思路:并查集逆向操作 #include<b ...

  3. Ansible-Tower快速入门-8.创建组织【翻译】

    创建组织 首行,点击组织标签,组织中将包括有:用户,团队,项目,和清单等项,在tower的对象层级中,组织是最高级对象. 然后,点击增加按钮,如: 为所创建的组织键入一个简单的名称和描述,这些信息你在 ...

  4. [转]透过 Linux 内核看无锁编程

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

  5. Unity3D-坐标转换笔记

    Transform.TransformPoint 作用 : 将一个点从以自身为坐标系的本地坐标转换成世界坐标 Transform.InverseTransformPoint 作用 : 将一个点从世界坐 ...

  6. .NET涉及的一些名词

    本文在最为概略的层次上对.NET涉及的一些名词进行解释, 包括: 通用语言基础架构(Common Language Infrastructure, CLI). 虚拟执行系统(Virtual Execu ...

  7. 《Android深度探索HAL与驱动开发》第三章阅读心得

    Git是Linux内核代码对源代码进行管理的软件,他的各方面要优与其他同类的源代码管理软件. 安装Git后,查看Git文档在Linux下可以直接使用man命令看指令的帮助文档.安装git-doc后会安 ...

  8. archlinux vmware一些问题

    虚拟机没法上网 sudo modprobe vmnet sudo vmware-network --start

  9. ns115 step by step

    一,安装环境: sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev lib ...

  10. LeetCode() Binary Tree Level Order Traversal

    感觉我这个思路好 先记录上一层有几个节点 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN ...