¿Cómo instalar y configurar Docker Compose?

¿Se pregunta qué es Docker Compose?

Docker es la herramienta de contenedorización más popular en el mundo de DevOps. Pero, ¿qué es Docker Compose?

Docker Compose se usa para ejecutar aplicaciones que tienen múltiples contenedores usando un archivo YAML.

Puede haber varios casos en los que la aplicación Docker deba ejecutar varios contenedores para diferentes pilas de tecnología. Ahora, compilar, ejecutar y conectar archivos dockerfiles separados para cada contenedor puede ser una tarea difícil; aquí es donde docker-compose te ayuda.

Con un archivo docker-compose.yml único y sencillo, puede compilar, conectar y lanzar todos los contenedores ejecutando un solo comando. Esto es muy útil para aplicaciones empresariales en producción, donde varias aplicaciones se ejecutan dentro de contenedores. Ahorra mucho tiempo al ejecutar cientos de aplicaciones dentro de contenedores Docker con facilidad.

Installing Docker Compose

Docker ya debería estar instalado en su sistema antes de instalar compose.

Ejecute el siguiente comando para instalar docker-compose.

[email protected]:/home/geekflare$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  [sudo] password for geekflare:  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current  Dload  Upload   Total   Spent    Left  Speed  100   617    0   617    0     0   1209      0 --:--:-- --:--:-- --:--:--  1209  100 11.1M  100 11.1M    0     0   348k      0  0:00:32  0:00:32 --:--:--  476k

Ejecute el siguiente comando para configurar los permisos de archivo.

[email protected]:/home/geekflare$ sudo chmod +x /usr/local/bin/docker-compose

Compruebe si se instaló correctamente, debería devolver la versión de docker-compose.

[email protected]:/home/geekflare$ docker-compose --version  docker-compose version 1.23.1, build b02f1306

A continuación se muestra la lista de comandos que puede usar con docker-compose.

[email protected]:/home/geekflare$ docker-compose  Define and run multi-container applications with Docker.  Usage:  docker-compose [-f <arg>…] [options] [COMMAND] [ARGS…]  docker-compose -h|--help  Options:  -f, --file FILE             Specify an alternate compose file  (default: docker-compose.yml)  -p, --project-name NAME     Specify an alternate project name  (default: directory name)  --verbose                   Show more output  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)  --no-ansi                   Do not print ANSI control characters  -v, --version               Print version and exit  -H, --host HOST             Daemon socket to connect to   --tls                       Use TLS; implied by –tlsverify  --tlscacert CA_PATH         Trust certs signed only by this CA  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file  --tlskey TLS_KEY_PATH       Path to TLS key file  --tlsverify                 Use TLS and verify the remote  --skip-hostname-check       Don’t check the daemon’s hostname against the  name specified in the client certificate  --project-directory PATH    Specify an alternate working directory  (default: the path of the Compose file)  --compatibility             If set, Compose will attempt to convert deploy  keys in v3 files to their non-Swarm equivalent  Commands:  build              Build or rebuild services  bundle             Generate a Docker bundle from the Compose file  config             Validate and view the Compose file  create             Create services  down               Stop and remove containers, networks, images, and volumes  events             Receive real time events from containers  exec               Execute a command in a running container  help               Get help on a command  images             List images  kill               Kill containers  logs               View output from containers  pause              Pause services  port               Print the public port for a port binding  ps                 List containers  pull               Pull service images  push               Push service images  restart            Restart services  rm                 Remove stopped containers  run                Run a one-off command  scale              Set number of containers for a service  start              Start services  stop               Stop services  top                Display the running processes  unpause            Unpause services  up                 Create and start containers  version            Show the Docker-Compose version information

Docker Compose File

Aquí hay un ejemplo de archivo docker-compose que hace toda la magia.

version: '3'  services:  web:  build: .  ports:  - "5000:5000"  redis:  image: "redis:alpine"

La primera línea de este archivo especifica la versión que se está utilizando. Este número depende del motor Docker instalado en su sistema. Tengo instalado Docker 18.09.6, que pertenece a la versión 3 de docker-compose. Consulte más detalles sobre las versiones aquí: https://docs.docker.com/compose/compose-file/compose-versioning/

Este archivo de ventana acoplable ejecuta dos servicios / aplicaciones, web y Redis. El servicio web se crea a través de un archivo docker y se ejecuta en el puerto del servidor web del matraz predeterminado: 5000. El servicio Redis se ejecuta extrayendo la imagen de Redis del registro del concentrador de la ventana acoplable.

Para ejecutar el archivo docker-compose.yml, debe ejecutar un comando muy simple: docker-componer

Docker Compose Workflow

A continuación se muestran los tres pasos para usar docker-compose.

  1. Crea dockerfile de cada servicio
  2. Cree un archivo docker-compose.yml para conectar todos los archivos docker.
  3. Ejecute el comando docker-compose up para iniciar el sistema

Permítanme tomar un ejemplo del archivo docker-compose de muestra que vimos anteriormente y mostrarles cómo se creará la estructura del proyecto.

my-app  |-----web  |---------Dockerfile  |-----redis  |docker-compose.yml

my-app es mi directorio principal de proyectos. Este directorio tiene directorios de servicios web y de Redis y el archivo YAML de composición acoplable. Dockerfile del servicio web está presente en un directorio web. Dado que el servicio Redis se extrae directamente del concentrador de la ventana acoplable, no se requiere ningún archivo docker en el directorio de Redis. Así es como se ve el flujo de trabajo de docker-compose.

Containerizing A MEAN Stack Application using Docker Compose

Ahora que ha entendido los conceptos fundamentales. Permítanme mostrarles una demostración sobre cómo contener una aplicación de pila MEAN usando docker-compose.

MEAN significa MongoDB, Express, Angular y Node.js. Las aplicaciones que utilizan estos servicios juntos también se denominan aplicación MEAN / Full-stack.

Para esta demostración, ejecutaremos tres contenedores Docker:

Descarga la aplicación completa aquí: http://bit.ly/2St7r3A (no probado para producción)

Así es como se verá mi archivo docker-compose.yml para ejecutar estos tres contenedores:

version: '3'  services:  angular:  build: angular-client  ports:  - "4200:4200"  volumes:  - ./angular-client/:/var/www/app  express:  build: express-server  ports:  - "3000:3000"  volumes:  - ./express-server/:/var/www/app  links:  - database  database:  image: mongo  ports:  - "27017:27017"

Extraiga el proyecto en el directorio de inicio y vaya al directorio de cliente angular.

[email protected]:~$ cd mean  [email protected]:~/mean$ cd angular-client 

Ejecute el siguiente comando si no tiene el administrador de paquetes de nodos (npm) instalado en su sistema (ignore si está instalado).

[email protected]:~/mean/angular-client$ sudo apt install npm  [sudo] password for geekflare:  Reading package lists... Done  Building dependency tree  Reading state information... Done  The following additional packages will be installed:  gyp javascript-common libc-ares2 libhttp-parser2.8 libjs-async libjs-inherits libjs-is-typedarray  libjs-jquery libjs-node-uuid libjs-underscore libssl1.0-dev libuv1 libuv1-dev node-abbrev node-ajv  node-ansi node-ansi-color-table node-ansi-regex node-ansi-styles node-ansistyles node-aproba node-archy  node-are-we-there-yet node-async node-aws-sign2 node-balanced-match node-block-stream node-bluebird  node-boom node-brace-expansion node-builtin-modules node-camelcase node-caseless node-chalk node-cliui  node-clone node-co node-color-convert node-color-name node-combined-stream node-concat-map  node-config-chain node-console-control-strings node-cookie-jar node-copy-concurrently node-core-util-is  node-yallist node-yargs node-yargs-parser nodejs nodejs-dev nodejs-doc  Suggested packages:  apache2 | lighttpd | httpd node-aws-sign node-oauth-sign node-http-signature debhelper  The following NEW packages will be installed:  gyp javascript-common libc-ares2 libhttp-parser2.8 libjs-async libjs-inherits libjs-is-typedarray  libjs-jquery libjs-node-uuid libjs-underscore libssl1.0-dev libuv1 libuv1-dev node-abbrev node-ajv  node-ansi node-ansi-color-table node-ansi-regex node-ansi-styles node-ansistyles node-aproba node-archy  node-are-we-there-yet node-async node-aws-sign2 node-balanced-match node-block-stream node-bluebird  0 upgraded, 212 newly installed, 0 to remove and 233 not upgraded.  Need to get 10.5 MB of archives.  After this operation, 53.6 MB of additional disk space will be used.  Do you want to continue? [Y/n] Y  Get:1 http://us.archive.ubuntu.com/ubuntu cosmic/universe amd64 gyp all 0.1+20180428git4d467626-1 [237 kB]  Get:2 http://us.archive.ubuntu.com/ubuntu cosmic/main amd64 javascript-common all 11 [6,066 B]  Get:3 http://us.archive.ubuntu.com/ubuntu cosmic/main amd64 libhttp-parser2.8 amd64 2.8.1-1 [20.8 kB]  Get:4 http://us.archive.ubuntu.com/ubuntu cosmic/universe amd64 libjs-async all 0.8.0-3 [25.4 kB]  Get:5 http://us.archive.ubuntu.com/ubuntu cosmic/universe amd64 libjs-is-typedarray all 1.0.0-2 [2,934 B]  Get:6 http://us.archive.ubuntu.com/ubuntu cosmic/main amd64 libjs-jquery all 3.2.1-1 [152 kB]  Get:7 http://us.archive.ubuntu.com/ubuntu cosmic/universe amd64 libjs-node-uuid all 1.4.7-5 [11.5 kB]  Get:8 http://us.archive.ubuntu.com/ubuntu cosmic/main amd64 libjs-underscore all 1.8.3~dfsg-1 [59.9 kB]  Get:9 http://us.archive.ubuntu.com/ubuntu cosmic-updates/main amd64 libssl1.0-dev amd64 1.0.2n-1ubuntu6.2 [1,366 kB]  Fetched 10.5 MB in 1min 34s (112 kB/s)  Extracting templates from packages: 100%  Selecting previously unselected package gyp.  (Reading database ... 180130 files and directories currently installed.)  Preparing to unpack .../000-gyp_0.1+20180428git4d467626-1_all.deb ...  Unpacking gyp (0.1+20180428git4d467626-1) ...  Selecting previously unselected package javascript-common.  Preparing to unpack .../001-javascript-common_11_all.deb ...  Unpacking javascript-common (11) ...  Selecting previously unselected package libhttp-parser2.8:amd64.  Preparing to unpack .../002-libhttp-parser2.8_2.8.1-1_amd64.deb ...  Setting up node-fstream-ignore (0.0.6-2) ...  Setting up node-gyp (3.6.2-2) ...  Setting up node-yargs (10.0.3-2) ...  Setting up npm (5.8.0+ds-2) ...  Processing triggers for libc-bin (2.28-0ubuntu1) ... 

En el directorio de cliente angular y ejecute npm install.

[email protected]:~/mean/angular-client$ npm install  > [email protected] install /home/geekflare/mean/angular-client/node_modules/uws  > node-gyp rebuild > build_log.txt 2>&1 || exit 0  > [email protected] install /home/geekflare/mean/angular-client/node_modules/node-sass  > node scripts/install.js  Downloading binary from https://github.com/sass/node-sass/releases/download/v4.7.2/linux-x64-57_binding.node  Download complete  ] - :  Binary saved to /home/geekflare/mean/angular-client/node_modules/node-sass/vendor/linux-x64-57/binding.node  Caching binary to /home/geekflare/.npm/node-sass/4.7.2/linux-x64-57_binding.node  > [email protected] postinstall /home/geekflare/mean/angular-client/node_modules/webpack/node_modules/uglifyjs-webpack-plugin  > node lib/post_install.js  > [email protected] postinstall /home/geekflare/mean/angular-client/node_modules/node-sass  > node scripts/build.js  Binary found at /home/geekflare/mean/angular-client/node_modules/node-sass/vendor/linux-x64-57/binding.node  Testing binary  Binary is fine  added 1457 packages from 1250 contributors in 80.009s

Ahora vaya al directorio express y ejecute npm install.

[email protected]:~/mean/angular-client$ cd ..  [email protected]:~/mean$ cd express-server/  [email protected]:~/mean/express-server$ npm install

Ahora que todo está configurado, es hora de ejecutar el archivo docker-compose.yml que lanzará todos los contenedores de la ventana acoplable y ejecutará la aplicación MEAN stack.

[email protected]:~/mean/express-server$ cd ..  [email protected]:~/mean$ docker-compose up  Creating network "mean_default" with the default driver  Building angular  Step 1/8 : FROM node:8  8: Pulling from library/node  a4d8138d0f6b: Pull complete  dbdc36973392: Pull complete  f59d6d019dd5: Pull complete  aaef3e026258: Pull complete  6e454d3b6c28: Pull complete  c717a7c205aa: Pull complete  37add8e5ac11: Pull complete  0314ab675d31: Pull complete  012886364728: Pull complete  Digest: sha256:310db2abcff097ef44af205d81833282a6d5471002a1b59d7b7459a74152c856  Status: Downloaded newer image for node:8  ---> 8e45c884a32e  Step 2/8 : RUN mkdir -p /var/www/app  ---> Running in c70a0cab7994  Removing intermediate container c70a0cab7994  ---> 001c5e840b24  Step 3/8 : WORKDIR /var/www/app  ---> Running in 622ebdc41b2f  Removing intermediate container 622ebdc41b2f  ---> baa2e2347259  Step 4/8 : COPY package.json /var/www/app  ---> 5b97543befab  Step 5/8 : RUN npm install  ---> Running in 73e3d8b7a701  > [email protected] install /var/www/app/node_modules/uws  > node-gyp rebuild > build_log.txt 2>&1 || exit 0  > [email protected] install /var/www/app/node_modules/node-sass  > node scripts/install.js  Downloading binary from https://github.com/sass/node-sass/releases/download/v4.12.0/linux-x64-57_binding.node  Download complete  Binary saved to /var/www/app/node_modules/node-sass/vendor/linux-x64-57/binding.node  Caching binary to /root/.npm/node-sass/4.12.0/linux-x64-57_binding.node  > [email protected] postinstall /var/www/app/node_modules/core-js  > node scripts/postinstall || echo "ignore"  The project needs your help! Please consider supporting of core-js on Open Collective or Patreon:  > https://opencollective.com/core-js  > https://www.patreon.com/zloirock  > [email protected] postinstall /var/www/app/node_modules/webpack/node_modules/uglifyjs-webpack-plugin  > node lib/post_install.js  > [email protected] postinstall /var/www/app/node_modules/node-sass  > node scripts/build.js  Binary found at /var/www/app/node_modules/node-sass/vendor/linux-x64-57/binding.node  Testing binary  Binary is fine  added 1606 packages from 1329 contributors and audited 15092 packages in 112.427s  Removing intermediate container 73e3d8b7a701  ---> 55790d2fae93  Step 6/8 : COPY . /var/www/app  ---> 61537aa487f4  Step 7/8 : EXPOSE 4200  ---> Running in 632eedc35a45  Removing intermediate container 632eedc35a45  ---> 51e75b0e2ebe  Step 8/8 : CMD ["npm", "start"]  ---> Running in 36bbb12a0d38  Removing intermediate container 36bbb12a0d38  ---> 9f8d61db600c  Successfully built 9f8d61db600c  Successfully tagged mean_angular:latest  Pulling database (mongo:)...  latest: Pulling from library/mongo  35b42117c431: Pull complete  ad9c569a8d98: Pull complete  293b44f45162: Pull complete  0c175077525d: Pull complete  4e73525b52ba: Pull complete  a22695a3f5e9: Pull complete  c5175bcf2977: Pull complete  3e320da07793: Pull complete  01c6db6b2b5a: Pull complete  3bd6e9d03e78: Pull complete  e03dcf51513f: Pull complete  c1956a9e136a: Pull complete  4c35cf22b1d5: Pull complete  Building express  Step 1/9 : FROM node:8  ---> 8e45c884a32e  Step 2/9 : RUN mkdir -p /var/www/app  ---> Using cache  ---> 001c5e840b24  Step 3/9 : WORKDIR /var/www/app  ---> Using cache  ---> baa2e2347259  Step 4/9 : COPY package.json /var/www/app  ---> 0232ad53c679  Step 5/9 : RUN npm install  ---> Running in c309bf6f218e  added 128 packages from 151 contributors and audited 233 packages in 9.055s  Removing intermediate container c309bf6f218e  ---> 49e652884562  Step 6/9 : RUN npm install -g nodemon  ---> Running in 0ed5d7f3642b  /usr/local/bin/nodemon -> /usr/local/lib/node_modules/nodemon/bin/nodemon.js  > [email protected] postinstall /usr/local/lib/node_modules/nodemon  > node bin/postinstall || exit 0  Love nodemon? You can now support the project via the open collective:  > https://opencollective.com/nodemon/donate  + [email protected]  added 221 packages from 128 contributors in 18.856s  Removing intermediate container 0ed5d7f3642b  ---> 32c55606f35e  Step 7/9 : COPY . /var/www/app  ---> a618b38a2812  Step 8/9 : EXPOSE 3000  ---> Running in bea389ab3ef1  Removing intermediate container bea389ab3ef1  ---> 684bbfb31371  Step 9/9 : CMD ["npm", "start"]  ---> Running in 9aa1b72e4a4e  Removing intermediate container 9aa1b72e4a4e  ---> 35dcb3df9806  Successfully built 35dcb3df9806  Successfully tagged mean_express:latest  Creating mean_angular_1_de44b3f5b988  ... done  Creating mean_database_1_708f8f9c3c33 ... done  Creating mean_express_1_b57a483a72ee  ... done  Attaching to mean_angular_1_f257e2233ef1, mean_database_1_ccc5c677e00b, mean_express_1_574f07b045fc  angular_1_f257e2233ef1 |  angular_1_f257e2233ef1 | > [email protected] start /var/www/app  angular_1_f257e2233ef1 | > ng serve -H 0.0.0.0  angular_1_f257e2233ef1 |  database_1_ccc5c677e00b | 2019-07-20T22:33:25.933+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=f74b56905249  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] db version v4.0.10  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] git version: c389e7f69f637f7a1ac3cc9fae843b635f20b766  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] allocator: tcmalloc  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] modules: none  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] build environment:  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten]     distarch: x86_64  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten]     target_arch: x86_64  database_1_ccc5c677e00b | 2019-07-20T22:33:25.937+0000 I CONTROL  [initandlisten] options: { net: { bindIpAll: true } }  express_1_574f07b045fc |  express_1_574f07b045fc | > [email protected] start /var/www/app  express_1_574f07b045fc | > nodemon ./bin/www  express_1_574f07b045fc |  express_1_574f07b045fc | [nodemon] 1.19.1  express_1_574f07b045fc | [nodemon] to restart at any time, enter `rs`  express_1_574f07b045fc | [nodemon] watching: *.*  express_1_574f07b045fc | [nodemon] starting `node ./bin/www`  database_1_ccc5c677e00b | 2019-07-20T22:33:33.543+0000 I NETWORK  [listener] connection accepted from 172.19.0.4:38958 #1 (1 connection now open)  database_1_ccc5c677e00b | 2019-07-20T22:33:33.560+0000 I NETWORK  [conn1] received client metadata from 172.19.0.4:38958 conn1: { driver: { name: "nodejs", version: "3.0.1" }, os: { type: "Linux", name: "linux", architecture: "x64", version: "4.18.0-25-generic" }, platform: "Node.js v8.16.0, LE, mongodb-core: 3.0.1" }  express_1_574f07b045fc | mongodb: connected  angular_1_f257e2233ef1 | ** NG Live Development Server is listening on 0.0.0.0:4200, open your browser on http://localhost:4200/ **  angular_1_f257e2233ef1 | Date: 2019-07-21T11:21:03.868Z - Hash: 639d9a968476ed482b5c - Time: 336ms  angular_1_f257e2233ef1 | 4 unchanged chunks  angular_1_f257e2233ef1 | chunk {main} main.bundle.js (main) 19.8 kB [initial] [rendered]  angular_1_f257e2233ef1 |  angular_1_f257e2233ef1 | webpack: Compiled successfully.  angular_1_f257e2233ef1 | webpack: Compiling...  angular_1_f257e2233ef1 | Date: 2019-07-21T11:25:15.661Z - Hash: e5a2b1c1afe0deb396c3 - Time: 251ms  angular_1_f257e2233ef1 | 4 unchanged chunks  angular_1_f257e2233ef1 | chunk {main} main.bundle.js (main) 19.8 kB [initial] [rendered]  angular_1_f257e2233ef1 |  angular_1_f257e2233ef1 | webpack: Compiled successfully.

Vaya a su navegador y verifique https: // localhost: 4200, su aplicación estará lista y funcionando.

angular - docker compose

Utilice la herramienta https://localhost:3000 para comprobar si se está ejecutando un servidor express.

express - docker compose

Además, puede ejecutar el comando Docker Images para ver qué imágenes están presentes en Docker.

[email protected]:~/mean$ docker images  REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE  mean_express               latest              35dcb3df9806        14 hours ago        923MB  mean_angular               latest              9f8d61db600c        14 hours ago        1.29GB  node                       8                   8e45c884a32e        9 days ago          895MB  mongo                      latest              785c65f61380        2 weeks ago         412MB

Ejecute el siguiente comando para ver los contenedores que se ejecutan dentro de la ventana acoplable.

[email protected]:~/mean$ docker ps  CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES  681c9c34bee2        mean_express        "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:3000->3000/tcp     mean_express_1_574f07b045fc  f74b56905249        mongo               "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:27017->27017/tcp   mean_database_1_ccc5c677e00b  260ef1e52dab        mean_angular        "docker-entrypoint.s…"   14 hours ago        Up 14 hours         0.0.0.0:4200->4200/tcp     mean_angular_1_f257e2233ef1

Así que ahora, los tres contenedores de la ventana acoplable están en funcionamiento.

Docker-compose se encargó de ejecutar todos los contenedores con facilidad. Este fue un ejemplo simple para ejecutar tres contenedores; Puede imaginar lo útil que será si las aplicaciones tienen que iniciarse en cientos de contenedores. Adelante, pruébelo para ver cómo funciona.