2016-10-25 2 views
0

Я новичок в докере и понимаю, что ядро ​​linux используется совместно с host-os и контейнерами. Но я действительно не понимаю, как глубокий докер эмулирует конкретное распределение Linux. Допустим, у нас есть простой докер файл так:Какие команды определенного дистрибутива Linux доступны в контейнере Docker?

FROM ubuntu:16.10 
RUN apt-get install nginx 

Это даст мне Docker контейнер с Nginx, установленных в 16.10 среде Ubuntu. Поэтому я должен был бы использовать apt-get в качестве менеджера пакетов по умолчанию для Ubuntu. Но насколько это глубоко? Могу ли я предположить, что типичные команды такого распределения, как lsb_release, эмулируются, как в полной виртуальной машине с установленной Ubuntu 16.10?

Причина моего вопроса в том, что дистрибутивы Linux различны. Мне нужно знать, какие команды доступны, например, когда я запускаю контейнер с Ubuntu 16.10, как и тот, который указан выше на хосте, где установлен другой дистрибутив (например, Red Hat, CentOS и т. Д.).

Изображение Ubuntu в Docker составляет около 150 МБ. Поэтому я думаю, что не все инструменты включены, как в реальной установке. Но как я могу знать, на каком я могу покинуть их там.

+0

Попробуйте запустить с помощью 'docker run --name myubuntu sleep infinity', а затем' docker exec -it myubuntu lsb_release', если вы получаете версию Ubuntu, это означает, что она работает – user2915097

ответ

0

Контейнер снабжает вас той же программной средой, что и неконтейнерное распределение. У него может не быть (на самом деле, вероятно, нет) всех одинаковых пакетов, установленных по умолчанию, но вы можете установить все, что вам нужно, используя соответствующий менеджер пакетов. Доступность программного обеспечения в контейнере не имеет ничего общего с дистрибутивом, запущенным на вашем хосте (изображение Ubuntu будет одинаковым независимо от того, работает ли ваш Docker под CentOS, Fedora, Ubuntu, Arch и т. Д.).

Если вам необходимы определенные команды, просто убедитесь, что они установлены в вашем файле Docker.

Одна из немногих вещей, которая работает иначе внутри контейнера является то, что обычно не процесс управления услугами работает (как init или systemd или любой другой), так что вы не можете начать обслуживающая такие же, как вы можете на хосте без немного работы.

1

Образы базовой ОС для Docker намеренно удаляются, а для Ubuntu они удаляют больше команд с каждой новой версией. Изображение предназначено как база для отдельного приложения для запуска, вы обычно не подключаетесь к контейнеру и не запускаете команды внутри него, а меньшее изображение легче перемещаться и имеет меньший вектор атаки.

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

например, это Dockerfile строит правильно:

FROM ubuntu:trusty 
RUN ping -c 1 127.0.0.1 

Это один терпит неудачу:

FROM ubuntu:xenial 
RUN ping -c 1 127.0.0.1 

Это потому, что ping был удален из образа для выпуска xenial. Если вы только что использовали FROM ubuntu, то тот же файл Docker был бы построен правильно, если trusty был тегом latest, а затем сработал, когда он был заменен на xenial.

Смежные вопросы