以下内容根据2016年2月4日晚【Rancher | 实战群】微信群的分享内容整理。分享人:江松,拥有超过16年的国内外企业级软件基础架构研发经验,对企业级存储,云计算都有很深的技术造诣和行业理解。对Rancher和Docker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论! (注:【Rancher | 实战群】QQ群现已同步开通,惯用PC端办公的伙伴可加入参与相关讨论。)
注:本期分享由江松原创,云舒网络整理发布。
今天想谈谈我突然很想知道的一件事。就是Docker每次起容器都生成一个容器ID,还有一个默认的名称,看似好像没啥规律,这到底是个啥?谁知道Docker 容器ID一长串数字到底是多少个?因为好奇我专门去看过:
首先,在Daemon/Daemon.go里
func (daemon *Daemon) newContainer(name string, config *containertypes.Config, imgID image.ID) (*container.Container, error) {
var (
id string
err error
noExplicitName = name == ""
)
id, name, err = daemon.generateIDAndName(name)
if err != nil {
return nil, err
}
...
然后
func (daemon *Daemon) generateIDAndName(name string) (string, string, error) {
var (
err error
id = stringid.GenerateNonCryptoID()
)
if name == "" {
if name, err = daemon.generateNewName(id); err != nil {
return "", "", err
}
return id, name, nil
}
if name, err = daemon.reserveName(id, name); err != nil {
return "", "", err
}
return id, name, nil
}
就是调用Stringid包里的GenerateNonCryptoID
Stringid包里
// GenerateNonCryptoID generates unique id without using cryptographically
// secure sources of random.
// It helps you to save entropy.
func GenerateNonCryptoID() string {
return generateID(false)
}
func generateID(crypto bool) string {
b := make([]byte, 32)
r := random.Reader
if crypto {
r = rand.Reader
}
for {
if _, err := io.ReadFull(r, b); err != nil {
panic(err) // This shouldn't happen
}
id := hex.EncodeToString(b)
// if we try to parse the truncated for as an int and we don't have
// an error then the value is all numeric and causes issues when
// used as a hostname. ref #3869
if _, err := strconv.ParseInt(TruncateID(id), 10, 64); err == nil {
continue
}
return id
}
}
就是生成一个32个字节的伪随机数,没有用sha1等算法;然后名字部分,就是用形容词而且是很好的形容词在左边,著名的科学家在右边。
/ GetRandomName generates a random name from the list of adjectives and surnames in this package
// formatted as "adjective_surname". For example 'focused_turing'. If retry is non-zero, a random
// integer between 0 and 10 will be added to the end of the name, e.g `focused_turing3`
func GetRandomName(retry int) string {
rnd := random.Rand
begin:
name := fmt.Sprintf("%s_%s", left[rnd.Intn(len(left))], right[rnd.Intn(len(right))])
if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
goto begin
}
// Docker, starting from 0.7.x, generates names from notable scientists and hackers.
// Please, for any amazing man that you add to the list, consider adding an equally amazing woman to it, and vice versa.
right = [...]string{
// Muhammad ibn J?bir al-岣?rr?n墨 al-Batt?n墨 was a founding father of astronomy. https://en.wikipedia.org/wiki/Mu%E1%B8%A5ammad_ibn_J%C4%81bir_-%E1%B8%A4arr%C4%81n%C4%AB_al-Batt%C4%81n%C4%AB
"albattani",
// Frances E. Allen, became the first female IBM Fellow in 1989. In 2006, she became the first female recipient of the ACM's Turing Award. https://en.wikipedia.org/wiki/Frances_E._Allen
"allen",
每个科学家还有一行简介文字说明,然后是wiki。
docker/pkg/namesgenerator/names-generator.go里是左边的形容词和好多科学家。
比如,上面代码里还有一段 if name == "boring_wozniak" /* Steve Wozniak is not boring */ { goto begin }
就是如果容器名字不幸命中了boring_wozniak, 那么另外选一个名字;因为Docker作者认为Steve Wozniak不是太boring。
看Docker源码还能顺便对科学家致敬,好的IT产品都需要人文关怀啊!本次分享到这先结束了。(下期预告:Rancher培训视频翻译与文字回播。)
本文电子书下载:
网页下载:http://www.cloudsoar.com/down/ddoc/v1.1/
百度云盘下载: http://pan.baidu.com/s/1jHfP9Dc
――――――――――――――――――――――――――――――――――――
温馨提示:
云舒网络携手Rancher Labs推出【Rancher | 实战微信群】,在线为您分享Docker技术干货,更有往期回顾精选期刊等你拿!
本群汇集了Rancher中国最强技术精英团队及业内技术派高人,宗旨是为了大家拥有更专业的平台交流Rancher实战技术,实时与Rancher创始团队面对面!同时欢迎各位分享自己的经验、疑难问题,我们将定期邀请分享嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。
对Rancher和Docker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论!
加微信群方法:
1.关注【云舒网络】公众号
2.留言”我要加群”
QQ群号:216521218