2015-04-29 6 views
2

Я учусь использовать докер. Я знаю, что каждое изображение докеры построено на базовом изображении, у которого нет родителя.Что такое контейнер изображения докеры базы?

Затем с базового изображения мы можем настроить некоторые вещи через контейнеры (возможно, очень короткий контейнер для жизни), чтобы зафиксировать новое изображение.

Так что я понимаю, что этот процесс, как это: базовое изображение -> контейнер -> новое изображение 1 -> контейнер -> новое изображение 2

Однако я осмотреть JSon данные базового изображения. Я до сих пор можно увидеть, что она имеет Данные контейнера:

[{ 
"Architecture": "amd64", 
"Author": "", 
"Comment": "", 
"Config": { 
    "AttachStderr": false, 
    "AttachStdin": false, 
    "AttachStdout": false, 
    "Cmd": null, 
    "CpuShares": 0, 
    "Cpuset": "", 
    "Domainname": "", 
    "Entrypoint": null, 
    "Env": null, 
    "ExposedPorts": null, 
    "Hostname": "3f37dbc61890", 
    "Image": "", 
    "Labels": null, 
    "MacAddress": "", 
    "Memory": 0, 
    "MemorySwap": 0, 
    "NetworkDisabled": false, 
    "OnBuild": null, 
    "OpenStdin": false, 
    "PortSpecs": null, 
    "StdinOnce": false, 
    "Tty": false, 
    "User": "", 
    "Volumes": null, 
    "WorkingDir": "" 
}, 
"Container": "3f37dbc61890b0bb37cc8479db94602bcc2d6e177d76c0f3d7d53346c0dc580c", 
"ContainerConfig": { 
    "AttachStderr": false, 
    "AttachStdin": false, 
    "AttachStdout": false, 
    "Cmd": [ 
     "/bin/sh", 
     "-c", 
     "#(nop) ADD file:777fad733fc954c0c161670c48c10ea1787a6e5d544daa20e55d593279df3fa3 in /" 
    ], 
    "CpuShares": 0, 
    "Cpuset": "", 
    "Domainname": "", 
    "Entrypoint": null, 
    "Env": null, 
    "ExposedPorts": null, 
    "Hostname": "3f37dbc61890", 
    "Image": "", 
    "Labels": null, 
    "MacAddress": "", 
    "Memory": 0, 
    "MemorySwap": 0, 
    "NetworkDisabled": false, 
    "OnBuild": null, 
    "OpenStdin": false, 
    "PortSpecs": null, 
    "StdinOnce": false, 
    "Tty": false, 
    "User": "", 
    "Volumes": null, 
    "WorkingDir": "" 
}, 
"Created": "2015-04-21T22:18:45.67739694Z", 
"DockerVersion": "1.6.0", 
"Id": "706766fe101906a1a6628173c2677173a5f8c6c469075083f3cf3a8f5e5eb367", 
"Os": "linux", 
"Parent": "", 
"Size": 188104128, 
"VirtualSize": 188104128 
}] 

3f37dbc61890b0bb37cc8479db94602bcc2d6e177d76c0f3d7d53346c0dc580c является контейнером идентификатором базового изображения.

Что такое контейнер базового изображения? Я чувствую, что он становится именем хоста. На самом деле это имя хоста?

ответ

5

Я не уверен в вашей терминологии. Если базовое изображение по определению является изображением, у которого нет родителя, тогда образ в вашем примере не является базовым изображением.

Но изображение может не иметь родителя. scratch, например, не имеет родителя:

$ docker inspect -f '{{.Container}}' ubuntu 
a4c15f8c80978475a53f96721f935de5823bc8c29aff14eb00a15f9b9d96cddd 
$ docker inspect -f '{{.Container}}' scratch 

$ 

Вы также можете создать образ, который не имеет родителя с помощью import:

$ echo hello world > foo && tar -cf- foo | docker import - 
3e8fc0cb69fae0bd3f9711031df6d3b7bf6a7e8c9745657d9261e7b803718c67 
$ docker inspect -f '{{.Container}}' 3e8fc0c 

$ 

scratch В отличие, это изображение может иметь в нем файлы. Фактически, вы можете сгладить сложное изображение, используя эту технику.

$ docker create ubuntu # create container from image 
6b90bf145c193ef8e4ecb789372d2fd619769a20d96c8f3f586dcfbc501b0611 
$ docker export 6b90bf1 > ubuntu.tar # export container fs to tarball 
$ docker import - flat_ubuntu < ubuntu.tar 
4ef4ffb9514212acf6a19b2eeda8855b8c0445924311043ba5cba6574d40d772 
$ docker inspect -f '{{.Container}}' 4ef4ffb 

$ 

Важно отметить, что в то время как этот новый образ имеет те же файлы, что и исходное изображение, оно не имеет других возможностей Docker, как окружающая среда, объем, EntryPoint и т.д.

Я бы не обязательно называть это «базовым» изображением. Я бы назвал это «плоским» изображением. Я бы сказал, что базовое изображение - это изображение, которое вы указываете в директиве Dockerfile FROM. В моей терминологии базовое изображение не обязательно должно быть плоским.

+0

Благодарим за ответ. Образ, который я показал, является «базовым слоем» ubuntu, который я непосредственно вытащил. Я понимаю, что мы можем сфотографировать изображение, чтобы изображение не имело родительского или контейнера с экспортом/импортом. Но как мы можем сделать изображение, у которого нет родителя, но есть информация о контейнере? – user1167910

+0

@ user1167910 может быть возможно непосредственно вставить метаданные докера, но есть ли какое-либо значение для минимизации уровней? – kojiro

+0

Мне просто интересно. Большое спасибо. – user1167910