dockerdocker-compose

Difference between service and container in docker compose


I was going through volumes_from option in docker compose. Apparently you can import a volumes from either a container or a service. From the docker compose documentation it is:

volumes_from

Mount all of the volumes from another service or container, optionally specifying read-only access(ro) or read-write(rw).

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw

Note: The container:... formats are only supported in the version 2 file format. In version 1, you can use container names without marking them as such:

- service_name
- service_name:ro
- container_name
- container_name:rw

I am confused here what is the difference between containers and services here?


Solution

  • Services and container are related but both are different things.

    A service can be run by one or multiple containers. With docker you can handle containers and with docker-compose you can handle services.

    For example:

    Let's say that we have this docker-compose.yml file:

    web:
      image: example/my_web_app:latest
      expose:
        - 80
      links:
        - db 
    
    db:
      image: postgres:latest
    

    This compose file defines two services, web and db.

    When you run docker-compose up, Assuming that the project directory is test1 then compose will start 2 containers named test1_db_1 and test1_web_1.

    $ docker ps -a
    CONTAINER ID   IMAGE        COMMAND          ...      NAMES
    1c1683e871dc   test1_web    "nginx -g"       ...      test1_web_1
    a41360558f96   test1_db     "postgres -d"    ...      test1_db_1
    

    So, in this point you have 2 services and 1 container for each.

    But you could scale the service named web to use 5 containers.

    $ docker-compose scale web=5
    Creating and starting 2 ... done
    Creating and starting 3 ... done
    Creating and starting 4 ... done
    Creating and starting 5 ... done
    

    In this point you have 2 services and 6 containers

    $ docker ps -a  
    CONTAINER ID   IMAGE        COMMAND         ...      NAMES
    1bf4c939263f   test1_web    "nginx -g"      ...      test1_web_3
    d3033964a44b   test1_web    "nginx -g"      ...      test1_web_4
    649bbda4d0b0   test1_web    "nginx -g"      ...      test1_web_5
    a265ea406727   test1_web    "nginx -g"      ...      test1_web_2
    1c1683e871dc   test1_web    "nginx -g"      ...      test1_web_1
    a41360558f96   test1_db     "postgres -d'   ...      test1_db_1
    

    Additionally, with docker-compose you can run subcommand against one or more services.

    $docker-compose stop web