He estado leyendo y aprendiendo sobre Docker , y estoy tratando de elegir correctamente la configuración de Django para usar. Hasta ahora hay:
Entiendo que Dockerfilesse usan Docker Compose, pero no estoy seguro de si es una buena práctica poner todo en un gran Dockerfile con múltiples FROMcomandos para las diferentes imágenes.
Quiero usar varias imágenes diferentes que incluyen:
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
Indique cuáles son las mejores prácticas para configurar este tipo de entorno con Docker .
Si ayuda, estoy en una Mac, así que estoy usando boot2docker .
Algunos problemas que he tenido:
- Docker Compose no es compatible con Python3
- Quiero contener mi proyecto en contenedores, por lo que si un Dockerfile grande no es ideal, creo que tendré que romperlo con Docker Compose
- Estoy de acuerdo en hacer que el proyecto Py2 y Py3 sean compatibles, así que me estoy inclinando hacia django-compose
docker
docker-compose
dockerfile
development-environment
boot2docker
Aaron Lelevier
fuente
fuente

Respuestas:
La respuesta es ninguno.
Docker Compose (en lo sucesivo denominado componer) utilizará el Dockerfile si agrega el comando de compilación a su proyecto
docker-compose.yml.Su flujo de trabajo de Docker debe ser para construir una adecuada
Dockerfilepara cada imagen que desea crear, luego use componer para ensamblar las imágenes usando elbuildcomando.Puede especificar la ruta a sus Dockerfiles individuales utilizando
build /path/to/dockerfiles/blahdónde/path/to/dockerfiles/blahes dóndeDockerfilevive blah .fuente
docker-composeen producción o solo dev? Gracias por tu ayuda.docker-compose.ymlsolo utilizo la imagen pública (extrayendo la imagen de Internet / docker hub), entonces uno no necesita un Dockerfile para ejecutar el comandodocker-compose up.Dockerfile
Un Dockerfile es un archivo de texto simple que contiene los comandos que un usuario podría llamar para ensamblar una imagen.
Ejemplo, Dockerfile
Docker Compose
Docker Compose
es una herramienta para definir y ejecutar aplicaciones Docker de contenedores múltiples.
defina los servicios que componen su aplicación
docker-compose.ymlpara que puedan ejecutarse juntos en un entorno aislado.hacer que una aplicación se ejecute en un solo comando simplemente ejecutando
docker-compose upEjemplo, docker-compose.yml
fuente
image: redispero ¿es de dockerhub? directorio local? etc ... esto hace que sea confuso para un novato como yo entender lo que realmente está sucediendoTambién parece que Compose se considera seguro para la producción a partir de 1.11 , ya que https://docs.docker.com/v1.11/compose/production/ ya no tiene una advertencia de no usarlo en producción como https: // docs .docker.com / v1.10 / compose / production / does.
fuente
docker-compose existe para evitar que tengas que escribir una tonelada de comandos que tendrías que hacer con docker-cli.
docker-compose también facilita el inicio de varios contenedores al mismo tiempo y los conecta automáticamente con alguna forma de red.
El propósito de docker-compose es funcionar como docker cli pero emitir múltiples comandos mucho más rápido.
Para utilizar Docker-compose, debe codificar los comandos que estaba ejecutando antes en un
docker-compose.ymlarchivo.No solo va a copiar pegarlos en el archivo yaml, hay una sintaxis especial.
Una vez creado, debe alimentarlo al cli docker-compose y dependerá del cli analizar el archivo y crear todos los diferentes contenedores con la configuración correcta que especifiquemos.
Por lo tanto, tendrá contenedores separados, digamos, por ejemplo, uno es
redis-servery el segundo esnode-appy desea que se cree usando elDockerfileen su directorio actual.Además, después de hacer ese contenedor, debería asignar algún puerto desde el contenedor a la máquina local para acceder a todo lo que se ejecuta dentro de él.
Entonces, para su
docker-compose.ymlarchivo, querrá comenzar la primera línea de esta manera:version: '3'Eso le dice a Docker la versión
docker-composeque quieres usar. Después de eso tienes que agregar:Tenga en cuenta la sangría, muy importante. Además, observe que para un servicio estoy tomando una imagen, pero para otro servicio le digo
docker-composeque mire dentro del directorio actual para construir la imagen que se usará para el segundo contenedor.Luego, desea especificar todos los puertos diferentes que desea abrir en este contenedor.
Tenga en cuenta el guión, un guión en un archivo yaml es cómo especificamos una matriz. En este ejemplo, estoy mapeando
8081en mi máquina local8081en el contenedor de esta manera:Entonces, el primer puerto es su máquina local, y el otro es el puerto en el contenedor, también puede distinguir entre los dos para evitar confusión de la siguiente manera:
Al desarrollar un
docker-compose.ymlarchivo como este, creará estos contenedores esencialmente en la misma red y tendrán acceso gratuito para comunicarse entre ellos de la forma que deseen e intercambiar la información que deseen.Cuando los dos contenedores se crean usando
docker-composeno necesitamos ninguna declaración de puerto.Ahora, en mi ejemplo, necesitamos hacer una configuración de código en la aplicación Nodejs que se vea así:
Utilizo este ejemplo anterior para hacerle saber que puede haber alguna configuración específica que tendría que hacer además del
docker-compose.ymlarchivo que puede ser específico para su proyecto.Ahora, si alguna vez te encuentras trabajando con una aplicación Nodejs y redis, quieres asegurarte de que conoces el puerto predeterminado que Nodejs usa, así que agregaré esto:
Entonces, Docker verá que la aplicación Node está buscando
redis-servery redirigirá esa conexión a este contenedor en ejecución.Todo el tiempo, el
Dockerfileúnico contiene esto:Entonces, mientras que antes tendría que ejecutar
docker run myimagepara crear una instancia de todos los contenedores o servicios dentro del archivo, puede ejecutar,docker-compose upy no tiene que especificar una imagen porque Docker buscará en el directorio de trabajo actual y buscará undocker-compose.ymlarchivo dentro de allí.Antes
docker-compose.yml, teníamos que lidiar con dos comandos separados dedocker build .ydocker run myimage, pero en eldocker-composemundo si quieres reconstruir tus imágenes, escribesdocker-compose up --build. Eso le dice a Docker que vuelva a iniciar los contenedores pero que lo reconstruya para obtener los últimos cambios.Por
docker-composelo tanto, es más fácil trabajar con múltiples contenedores. La próxima vez que necesite iniciar este grupo de contenedores en segundo plano puede hacerlodocker-compose up -dy detenerlos puede hacerlodocker-compose down.fuente
docker-compose upsi solo un servicio en mi situación. Otra palabra, comparar condocker run xxx, ¿algún beneficio si lo usodocker-compose up?docker-composecontenedores individuales6379es el puerto predeterminado de Redis).En mi flujo de trabajo, agrego un Dockerfile para cada parte de mi sistema y lo configuro para que cada parte pueda ejecutarse individualmente. Luego agrego un docker-compose.yml para reunirlos y vincularlos.
Mayor ventaja (en mi opinión): al vincular los contenedores , puede definir un nombre y hacer ping a sus contenedores con este nombre. Por lo tanto, su base de datos podría ser accesible con el nombre
dby ya no por su IP.fuente
"mejor" es relativo. Todo depende de cuáles sean sus necesidades. Docker compose es para orquestar múltiples contenedores. Si estas imágenes ya existen en el registro de Docker, es mejor enumerarlas en el archivo de redacción. Si estas imágenes u otras imágenes tienen que construirse a partir de archivos en su computadora, entonces puede describir los procesos para construir esas imágenes en un Dockerfile.
El uso de múltiples FROM en un solo dockerfile no es una muy buena idea porque hay una propuesta para eliminar la función. 13026
Si, por ejemplo, desea acoplar una aplicación que usa una base de datos y tener los archivos de la aplicación en su computadora, puede usar un archivo de composición junto con un dockerfile de la siguiente manera
docker-compose.yml
Dockerfile
fuente
Dockerfile y Docker Compose son dos conceptos diferentes en Dockerland. Cuando hablamos de Docker, lo primero que viene a la mente es la orquestación, la virtualización a nivel del sistema operativo, las imágenes, los contenedores, etc. Trataré de explicar cada uno de los siguientes:
Imagen: una imagen es un archivo inmutable y compartible que se almacena en un registro confiable de Docker. Una imagen de Docker se crea a partir de una serie de capas de solo lectura. Cada capa representa una instrucción que se da en el Dockerfile de la imagen. Una imagen contiene todos los archivos binarios necesarios para ejecutarse.
Contenedor: una instancia de una imagen se denomina contenedor . Un contenedor es solo un binario de imagen ejecutable que debe ejecutar el sistema operativo host. Una imagen en ejecución es un contenedor.
Dockerfile: un Dockerfile es un documento de texto que contiene todos los comandos / instrucciones de compilación, un usuario puede llamar a la línea de comandos para ensamblar una imagen. Esto se guardará como a
Dockerfile. (Tenga en cuenta la minúscula 'f').Docker-Compose: Compose es una herramienta para definir y ejecutar aplicaciones Docker de contenedores múltiples. Con Compose, utiliza un archivo YAML para configurar los servicios (contenedores) de su aplicación. Luego, con un solo comando, crea e inicia todos los servicios desde su configuración. El archivo de composición se guardará como
docker-compose.yml.fuente
Imagina que eres el gerente de una compañía de software y acabas de comprar un nuevo servidor. Solo el hardware.
Piense
Dockerfileen un conjunto de instrucciones que le diría a su administrador de sistema qué instalar en este nuevo servidor. Por ejemplo:/var/www)Por el contrario, piense
docker-compose.ymlen un conjunto de instrucciones que le diría al administrador de su sistema cómo el servidor puede interactuar con el resto del mundo. Por ejemplo,(Esta no es una explicación precisa, pero es lo suficientemente buena para comenzar).
fuente
Los Dockerfiles son para construir una imagen, por ejemplo, desde un Ubuntu simple, puede agregar
mysqlllamadomySQLen una imagen ymywordpressen una segunda imagen llamadamywordpress.Componer archivos YAML son para tomar estas imágenes y ejecutarlas de manera coherente. por ejemplo, si tiene en su
docker-compose.ymlarchivo una llamada de serviciodb:y un servicio llamado worpress como:
luego dentro del contenedor mywordpress puede usar
dbpara conectarse a su contenedor mySQL. Esta magia es posible porque su host Docker crea un puente de red (superposición de red).fuente
En el mundo de los microservicios (que tiene una base de código compartida común), cada microservicio tendría un
Dockerfilemientras que en el nivel raíz (generalmente fuera de todos los microservicios y donde reside su POM principal) definiría undocker-compose.ymlgrupo para agrupar todos los microservicios en una aplicación completa.En su caso, se prefiere "Docker Compose" sobre "Dockerfile". Piense "Aplicación" Piense "Componer".
fuente
Dockerfile es un archivo que contiene comandos de texto para ensamblar una imagen.
Docker compose se usa para ejecutar un entorno de contenedores múltiples.
En su escenario específico, si tiene múltiples servicios para cada tecnología que mencionó (servicio 1 usando reddis, servicio 2 usando rabbit mq, etc.), entonces puede tener un Dockerfile para cada uno de los servicios y un docker-compose.yml común para ejecutar todo el "Dockerfile" como contenedores.
Si los quiere a todos en un solo servicio, docker-compose será una opción viable.
fuente