DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on • Edited on

มาดูกันว่า ชื่อแปลกๆของ Docker container นั้นสร้างมายังไง

ใครที่ใช้ Docker กันอยู่น่าจะรู้ว่าถ้าเราไม่ได้ระบุชื่อ container (--name container_name) ตอนที่เรารัน มันจะสร้างชื่อสุ่มๆมาให้ เช่น

$ docker run -d --hostname my-rabbit rabbitmq:3-management
bbf6843f716bb17ba91527b2181a5b363a35004954b0dd19f05c8fb442260bc0

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                                                  NAMES
bbf6843f716b   rabbitmq:3-management   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp   dreamy_booth
Enter fullscreen mode Exit fullscreen mode

ได้ชื่อ dreamy_booth มา ทีนี้อยากรู้มั้ยว่า ชื่อนี้มันมาได้ยังไง

ผมลองไปค้นดูแล้วก็เจอโค้ดที่ทำหน้าที่สุ่มชื่อนี้อยู่ที่นี่ https://github.com/moby/moby/blob/master/pkg/namesgenerator/names-generator.go

จะเห็นว่ามี array สอง array คือ left กับ right ที่รวมรายชื่อจากไหนก็ไม่รู้มา แต่ว่าตัว array ฝั่ง right เองมี comment บอกไว้ว่า

// 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.
Enter fullscreen mode Exit fullscreen mode

จะเป็นชื่อของ scientists หรือ hackers ที่มีชื่อเสียงนั่นเอง

เช่น booth ที่ผมได้ คนนี้คือ

// Kathleen Booth, she's credited with writing the first assembly language. https://en.wikipedia.org/wiki/Kathleen_Booth
        "booth",

Enter fullscreen mode Exit fullscreen mode

คนเริ่มต้นสร้างภาษา Assembly นั่นเอง 😲

ทีนี้มาดูโค้ดที่ใช้สุ่มชื่อจากในลิสต์นี้กัน

// 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 {
begin:
    name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])
    if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
        goto begin
    }

    if retry > 0 {
        name = fmt.Sprintf("%s%d", name, rand.Intn(10))
    }
    return name
}
Enter fullscreen mode Exit fullscreen mode

จะเห็นว่าจะเอาชื่อจากด้านซ้าย ซึ่งเขาบอกว่าเป็นคำ adjectives และนามสกุลของคนที่มีชื่อเสียงที่อยู่ในลิสต์ด้านขวา เอามาต่อกันโดยคั่นด้วย _ ก็มีเรื่อง retry ด้วยนิดหน่อยคงเพราะถ้าสุ่มแล้วชื่อไปชนกับที่รันไว้อยู่แล้วก็เอาเลขไปต่อท้ายเพื่อกันชื่อซ้ำนั่นเอง

ที่ตลกคือถ้าสุ่มได้ "boring_wozniak" จะกลับไปซุ่มใหม่อีกรอบ 😂

นี่ละก็เป็นที่มาของชื่อที่เราเห็นเวลาเราไม่ได้ระบุชื่อให้กับตอนรัน docker container

Buy Me A Coffee

Top comments (0)