Можно ли запустить Ubuntu server в Docker?

Моя команда разрабатывала наш проект на сервере Ubuntu 16.04, работающем на VirtualBox. Поскольку к нашему проекту присоединяются новые разработчики, нам очень сложно помочь им создать новый сервер Ubuntu на VirtualBox и установить все зависимости только для того, чтобы каждый раз запускать проект.

Мы решили решить проблему с помощью Docker. Итак, я пытаюсь запустить наш проект на Ubuntu в Docker с помощью приведенного ниже Dockerfile и docker-compose.yml, но я не могу найти много ресурсов, таких как how to run Ubuntu on Docker. Иду ли я в правильном направлении для запуска Ubuntu в Docker с помощью приведенного ниже способа?

Одна вещь, с которой меня смущает, - это то, почему я не могу получить ip-адрес при запуске ifconfig на моем сервере Ubuntu, работающем в Docker?

Файл Dockerfile

FROM ubuntu:16.04RUN sudo apt-get updateRUN sudo apt-get install -y build-essential autoconf libtool RUN sudo apt-get install -y python-setuptools python-dev python3-devRUN sudo apt-get install -y python-pip python3-pipRUN sudo apt-get install -y python-virtualenv unixodbc-dev libffi-dev git...

docker-compose.yml

version: '3'services:  ubuntu:    build:      context: .      dockerfile: ./Dockerfile    ports:     - "8000:8000"    container_name: dev_ubuntu...

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

На самом деле Docker не предназначен для запуска операционной системы. Он предназначен для запуска одного процесса в замкнутой (изолированной) среде. Контейнер использует то же ядро, что и на хосте.

Когда вы создаете образ Docker с помощью FROM ubuntu вы начинаете свой образ с нескольких предварительно созданных слоев, которые содержат некоторые части стандартной файловой системы и пакетов, которые вы могли бы найти на сервере Ubuntu.

Затем вы добавляете свои собственные дополнительные слои, добавляя двоичные файлы и файлы, необходимые для запуска вашей программы / процесса.

Изображение будет (обычно, но не обязательно) иметь CMD команда или ENTRYPOINT команда для запуска чего-либо.

Каждая строка в Dockerfile это команда, инструктирующая Docker о том, как создать образ. Каждая строка/команда приводит к появлению еще одного слоя. Чтобы установить пакеты, вы, вероятно, захотите сделать что-то вроде этого:

FROM ubuntu:16.04RUN apt-get -qq update && \    apt-get -y install build-essential autoconf libtool && \    apt-get install -y python-setuptools python-dev python3-dev && \    apt-get install -y python-pip python3-pip && \    apt-get install -y python-virtualenv unixodbc-dev libffi-dev git && \    apt-get clean && \    rm -rf /var/lib/apt/lists/*

Это уменьшит размер вашего изображения.

Тогда вам нужно будет действительно что-то запустить...

CMD python

Тогда вы сможете создать свой образ:

docker build -t myimage .

И используй это...

docker run --rm -it myimage

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

Итак, вы, похоже, создаете контейнер для создания некоторого кода. Вы хотели бы смонтировать свой каталог с кодом внутри контейнера, когда вы его запустите. Я не знаю, какую ОС вы используете на своей рабочей станции или сервере, поэтому я обращусь к этому сообщению для получения дополнительной информации: https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10/41489151#41489151

Допустим, вы строите с помощью команды make, ты мог бы сделать это:

docker run --rm -it -v $(pwd):/usr/src/project myimage make

Для этого потребуется строка в вашем Dockerfile чтобы сделать рабочий реж /usr/src/project:

WORKDIR /usr/src/project

Что произойдет, если вы запустите docker приведенная выше командная строка заключается в том, что она создаст контейнер из изображения с именем myimage (команда сборки, показанная ранее), смонтируйте текущий каталог, в котором вы находитесь, как /usr/src/project внутри нового контейнера. Запустите программу make команда внутри контейнера, а затем выход. То --rm параметр сообщает Docker, чтобы он не оставлял контейнер рядом, как только он завершит работу. То -it параметры означают interactive и tty.

Если вы хотите просто иметь доступ к какой-либо оболочке, чтобы вы могли вручную запустить make или другие команды специальным образом, вы также можете сделать это:

docker run --rm -it -v $(pwd):/usr/src/project myimage /bin/bash

Это создало бы контейнер из myimage изображение и запустите bash. Потому что bash не завершается, и у вас есть -it параметр, вы окажетесь в подсказке контейнера, где вы можете делать все, что захотите.

Просто помните, что любой файл, который вы изменяете внутри контейнера, не будет сохранен, и в следующий раз вы вернетесь к состоянию по умолчанию. Конечно, любые файлы из /usr/src/project каталог будет изменен на вашем локальном жестком диске, поскольку он монтируется с него.

В Linux не используйте ifconfig (net-tools), используйте ip (iproute2), который имеет больше возможностей. iproute2 существует уже 20 лет, а net-tools устарел и почти не поддерживается в течение 15 лет. linux - Should I quit using Ifconfig? - Server Fault