Docker - docker-compose


docker-compose - Работа с несколькими контейнерами

docker-compose up - Запуск

Ключи
    a
    b
    c
    d
  • -d - Запустить все контейнеры в фоновом режиме
    
        $ docker-compose up -d
        Starting identidockv3compose_identidock_1 ... done    
            

  • e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    o
    p
    q
    r
    s
    t
    u
    v
    w
    x
    y
    z

docker-compose stop - Остановка

docker-compose build - Пересборка

docker-compose ps - Список контейнеров

docker-compose run Запуск одного из контейнеров

Поддерживает все те же команды что и docker run


$ docker-compose run -d identidock
identidock_identidock_run_3

docker-compose logs - Логи с контейнеров

Ключи
    a
    b
    c
    d
  • -f, --follow - Непрерывный вывод
    
    $ cat docker-compose.yml 
    web:
      image: nginx
      ports:
        - "8000:80"
          
    
    $ docker-compose up -d
    Recreating portandexpose_web_1 ... done
          
    
     curl localhost:8000
    !DOCTYPE html
          
    
    $ docker-compose logs -f
    Attaching to portandexpose_web_1
    web_1  | 172.17.0.1 - - [05/Jan/2020:13:46:08 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
          

  • e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    o
    p
    q
    r
    s
    t
  • -t, --timestamps - Выводить на каждой строке время
    
    $ docker-compose logs -t
    Attaching to portandexpose_web_1
    web_1  | 2020-01-05T13:46:08.712585403Z 172.17.0.1 - - [05/Jan/2020:13:46:08 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
          

  • u
    v
    w
    x
    y
    z

docker-compose rm - Удаление остановленных контейнеров


$ docker-compose rm

docker-compose.yml

build/image - Указывает откуда брать образ

build - собрать из Dockerfile


$ cat Dockerfile 
FROM ubuntu:bionic
CMD "whoami"

$ cat docker-compose.yml 
test-build:
  build: .

или


$ cat dir/Dockerfile.txt 

FROM ubuntu:bionic

CMD "whoami"

$ cat docker-compose.yml 
version: '3'
services:
  web:
    build:
      context: ./dir
      dockerfile: Dockerfile.txt

с image все просто


$ cat docker-compose.yml 
version: '3'
services:
  web:
    image: ubuntu:bionic
    command: echo 1

$ docker-compose up
Starting buildorimage_web_1 ... done
Attaching to buildorimage_web_1
web_1  | 1
buildorimage_web_1 exited with code 0

environment - задает переменные окружения

Причем в docker-compose.yml имеет выше приоритет


$ cat Dockerfile 
FROM ubuntu:bionic

ENV MYENV=test

CMD echo $MYENV

$ docker run --rm docker_env2
test

$ cat docker-compose.yml 

test-env:
  build: .
  environment:
    MYENV: test2

$ docker-compose up
Starting env_test-env_1 ... done
Attaching to env_test-env_1
test-env_1  | test2
env_test-env_1 exited with code 0

ports - Проброс портов

При простом указании порта, который слушает приложение внутри, происходит тоже самое что и при указании -P в docker run

Т.е. открывается порт внутри контейнера и мапиться со случайным портом на хост машине.


$ cat docker-compose.yml 
web:
  image: nginx
  ports:
    - 80

Чтобы узнать открытый порт нужно сделать docker port


$ docker port portandexpose_web_1 
80/tcp -> 0.0.0.0:32782
avis@avisPC[20:17:38]:~$ curl localhost:32782
!DOCTYPE html

Мапинг портов


$ cat docker-compose.yml 
web:
  image: nginx
  ports:
    - "8000:80"

$ docker-compose up
Starting portandexpose_web_1 ... done
Attaching to portandexpose_web_1
web_1  | 172.17.0.1 - - [03/Jan/2020:17:15:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"

$ curl localhost:8000
!DOCTYPE html

expose -

volumes - Подключение томов

1. Если просто указать путь до тома - внутри контейнера и на хосте будет создана дира и сделан маунт

Или нет... кароче как-то странно


$ cat docker-compose.yml 
---
test-app:
  image: ubuntu:bionic
  command: 'bash -c "echo 1 > /tmp/test-app/hello && ls -l /tmp/test-app && /bin/sleep 100"'
  volumes:
    - /tmp/test-app

$ docker-compose up
Recreating volumes_test-app_1 ... done
Attaching to volumes_test-app_1
test-app_1  | total 4
test-app_1  | -rw-r--r-- 1 root root 2 Jan  5 13:38 hello
volumes_test-app_1 exited with code 0

пусто… Возможно тома не тут лежат


$ sudo find /var/lib/docker/containers
/var/lib/docker/containers
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/mounts
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/mounts/shm
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/hosts
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/config.v2.json
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/hostname
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95-json.log
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/hostconfig.json
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/resolv.conf
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/checkpoints
/var/lib/docker/containers/35a9a0576b100bc6a698d75682bb5835bec9d1bb9b78a206e6bca82a40d67b95/resolv.conf.hash
avis@avisPC[16:38:28]:~$ ^C

2. Если указать откуда-куда маунтить то будет маунт + можно указать флаги доступа


$ cat docker-compose-2-volumes.yml 
---
test-app:
  image: ubuntu:bionic
  command: 'bash -c "ls -l /tmp/ && echo 1 > /tmp/test-app/aaa && ls -l /tmp/test-app/"'
  volumes:
    - ./dir_in_host:/tmp/test-app:ro

где

  • ./dir_in_host - дира на хосте
  • /tmp/test-app - дира которая будет в контейнере
  • ro - уровень доступа (r)

$ docker-compose -f docker-compose-2-volumes.yml up
Starting volumes_test-app_1 ... done
Attaching to volumes_test-app_1
test-app_1  | total 4
test-app_1  | drwxrwxr-x 2 1000 1000 4096 Jan  5 13:56 test-app
test-app_1  | bash: /tmp/test-app/aaa: Read-only file system
volumes_test-app_1 exited with code 1