docker-compose
- Работа с несколькими контейнерами
docker-compose up
- Запуск
Ключи
- -d - Запустить все контейнеры в фоновом режиме
$ docker-compose up -d Starting identidockv3compose_identidock_1 ... done
a
b
c
d
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
- Логи с контейнеров
Ключи
- -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" "-"
- -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" "-"
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
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