Моя команда разрабатывала наш проект на сервере 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
Каталог будет изменен на вашем локальном жестком диске по мере его монтирования.