Primeros pasos con docker-compose

Ruby on Rails con docker-compose

Si desea usar la aplicación Docker for Rails y usar la base de datos, debe saber que todos los datos en el contenedor Docker se destruirán (a menos que configure el contenedor específicamente para guardar datos) A veces, necesita crear un contenedor docker con una aplicación y adjuntarlo a un contenedor antiguo con una base de datos.

Como ejemplo de aplicación de rieles, utilicé una aplicación simple. Puedes crearlo desde el comando:

rails new compose-app --database=postgresql

Por supuesto, debe instalar rieles, ruby, etc. de antemano.

Luego, cree Dockerfile en su proyecto y configure estos datos:

FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /compose-app
WORKDIR /compose-app
ADD Gemfile /compose-app/Gemfile
ADD Gemfile.lock /compose-app/Gemfile.lock
RUN bundle install
ADD . /compose-app

Siguiente paso: cree docker-compose.yml con los datos:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -e development -p 80 -b '0.0.0.0'
    volumes:
      - .:/compose-app
    ports:
      - "80:80"
    depends_on:
      - db

Puede reemplazar el puerto 80 (-p 80) con otro.

La sección de desarrollo de la configuración de base de datos.yml debe cambiarse a:

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

Ahora puedes crear imágenes desde el comando:

docker-compose build

(Ejecutar esto en el directorio del proyecto)

Y empieza todo desde:

docker-compose up

Si todo se hace correctamente, podrá ver los registros de los rieles en la consola.

Cerrar consola. Estará funcionando.

Si desea eliminar solo el contenedor con la aplicación de rieles sin la base de datos, debe ejecutarlo en el directorio del proyecto:

docker-compose stop web
docker-compose build web
docker-compose up -d --no-deps web

Se creará y lanzará una nueva aplicación de contenedor con rieles.

Instalación

Si ejecuta Docker en OS X o Windows, debe incluir docker-compose en su instalación de Docker para Windows o Docker Toolbox.

En Linux, puede obtener los archivos binarios más recientes directamente desde la página de publicación de GitHub: https://github.com/docker/compose/releases

Puede instalar la versión específica con los siguientes comandos:

curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Para obtener más información, consulte página de documentación

Crear una aplicación sencilla

Instalar Docker Compose

Ejecutar comando en el servicio docker-compose

Docker Componer hola mundo

Un docker-compose.yml muy básico se ve así:

version: '2'
services:
  hello_world:
    image: ubuntu
    command: [/bin/echo, 'Hello world']

Este archivo hace que haya un servicio hello_world, que se inicializa desde la imagen ubuntu:latest y que, cuando se ejecuta, simplemente ejecuta echo 'Hello world'

Si está en el directorio carpeta (y contiene este archivo docker-compose.yml), puede hacer docker-compose up y debería ver

Creating folder_hello_world_1
Attaching to folder_hello_world_1
hello_world_1 | Hello world
folder_hello_world_1 exited with code 0

Esto creó el contenedor a partir de la imagen de ubuntu y ejecutó el comando que se especificó en docker-compose.yml

Docker-Compose usa el nombre de la carpeta como el nombre del proyecto para prefijar contenedores y redes. Para establecer otro nombre de proyecto, puede llamar a docker-compose --project-name NAME {arriba|abajo|...} o puede proporcionar un archivo llamado .env junto a su docker-compose.yml y escribe COMPOSE_PROJECT_NAME=name en él. Es mejor evitar los nombres de proyectos largos con guiones (-) porque docker compose se comporta de forma extraña con este tipo de nombres.

Nota: docker-compose le permite ejecutar múltiples contenedores docker en un solo host. Si desea ejecutar varios contenedores en más de un nodo, consulte una solución como swarm/kubernetes.