Назад | Перейти на главную страницу

Можно ли запустить сервер Ubuntu на 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.04

RUN sudo apt-get update
RUN sudo apt-get install -y build-essential autoconf libtool 
RUN sudo apt-get install -y python-setuptools python-dev python3-dev
RUN sudo apt-get install -y python-pip python3-pip
RUN 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.04
RUN 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 Каталог будет изменен на вашем локальном жестком диске по мере его монтирования.