Es posible ejecutar Ubuntu Server en Docker?

Mi equipo ha estado desarrollando nuestro proyecto en el servidor Ubuntu 16.04 que se ejecuta en VirtualBox. A medida que los nuevos desarrolladores se unen a nuestro proyecto, es una gran molestia para nosotros ayudarlos a crear un nuevo servidor Ubuntu en VirtualBox e instalar todas las dependencias solo para comenzar el proyecto cada vez.

Decidimos resolver el problema con Docker. Entonces, estoy tratando de ejecutar nuestro proyecto en Ubuntu en Docker con lo siguiente Dockerfile y docker-compose.yml, pero no encuentro muchos recursos como how to run Ubuntu on Docker. ¿Voy en la dirección correcta para ejecutar Ubuntu en Docker de la siguiente manera?

Una cosa con la que estoy confundido es por qué no puedo obtener la dirección IP cuando ejecuto ifconfig en mi servidor Ubuntu que se ejecuta en 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...

El primer error es pensar que una imagen/contenedor de Docker es similar a una máquina virtual. Hay parecidos pero no son lo mismo y, francamente, no es realmente similar.

Docker no es, en realidad, para ejecutar un sistema operativo. Es para ejecutar un solo proceso en un entorno contenido (aislado). El contenedor usa el mismo núcleo que el que está en el host.

Al crear una imagen de Docker con FROM ubuntu está comenzando su imagen con algunas capas precreadas que incorporan algunas partes de un sistema de archivos y paquetes estándar que encontraría en un servidor Ubuntu.

Luego agrega sus propias capas adicionales, agregando binarios y archivos que son necesarios para ejecutar su programa / proceso.

La imagen tendría (normalmente, pero no es obligatoria) un CMD comando o ENTRYPOINT comando para ejecutar algo.

Cada línea en una Dockerfile es un comando que indica a Docker cómo crear la imagen. Cada línea / comando da como resultado una capa más. Para instalar paquetes, probablemente desee hacer algo como esto:

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/*

Eso mantendrá su imagen más pequeña.

Entonces necesitarás ejecutar algo...

CMD python

Entonces puedes construir tu imagen:

docker build -t myimage .

Y úsalo...

docker run --rm -it myimage

ifconfig no funciona porque el binario no está en la imagen. No es realmente necesario, ya que no administra la red desde el contenedor.

Así que parece que estás haciendo un contenedor para construir algún código. Querrá montar su directorio con el código dentro del contenedor cuando lo ejecute. No se que sistema operativo ejecuta en su estación de trabajo o servidor, así que me referiré a esta publicación para obtener más información: https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10/41489151#41489151

Digamos que está construyendo con el comando make, podrías hacer esto:

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

Esto requeriría una línea en su Dockerfile para hacer el directorio de trabajo /usr/src/project:

WORKDIR /usr/src/project

Qué pasará si corres el docker la línea de comando anterior es que creará un contenedor a partir de la imagen llamada myimage (comando build mostrado anteriormente), monte el directorio actual en el que se encuentra como /usr/src/project dentro del nuevo contenedor. Ejecute el make comando dentro del contenedor y luego salir. El --rm el parámetro le dice a Docker que no mantenga el contenedor una vez que termine de ejecutarse. El -it los parámetros significan interactive y tty.

Si solo quería tener acceso a algún shell para poder ejecutar manualmente make u otros comandos de forma ad-hoc, también puede hacer esto:

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

Esto crearía el contenedor a partir de la myimage imagen, y correr bash. Porque bash no sale y tienes el -it de lo contrario, estará en el indicador del contenedor donde puede hacer lo que quiera.

Solo recuerde que cualquier archivo que modifique desde el interior del contenedor no se conservará y la próxima vez que comience de nuevo al estado predeterminado. Por supuesto, cualquier archivo de la /usr/src/project el directorio se modificará en su disco duro local a medida que se monte desde él.

En Linux, no use ‘ifconfig’ (net-tools), use ip (iproute2) que tiene más funciones. iproute2 existe desde hace 20 años, y net-tools está obsoleto y apenas se ha mantenido durante 15 años. linux - Should I quit using Ifconfig? - Server Fault