-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdocker-compose.yml
executable file
·162 lines (153 loc) · 8.69 KB
/
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3.9" так как это - самая свежая версия на момент написания
version: '3.9'
# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть система управления контентом, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'
services:
mariadb:
# данный элемент указывает имя контейнера
container_name: mariadb
# Ключевое слово "build" позволяет задать
# путь к файлу Dockerfile, который нужно использовать для создания образа,
# который позволит запустить сервис.
# Здесь './requirements/mariadb' соответствует пути к папке mariadb,
# которая содержит соответствующий Dockerfile
build: ./requirements/mariadb
# данный параметр определяет политику перезапуска контейнера
restart: always
# этот параметр указывает Compose, что мы хотим добавить переменные среды из файла с именем .env,
# расположенного в контексте сборки.
# В этом случае в качестве контекста сборки используется наша текущая директория
env_file: .env
# здесь мы монтируем именованный том с названием db в директорию /var/lib/mysql в контейнере.
# Это стандартная директория данных в большинстве дистрибутивов
volumes:
- db:/var/lib/mysql
# данный параметр указывает, что служба приложения будет подключаться к сети project,
# которую мы определим внизу файла
networks:
- project
wordpress:
container_name: wordpress
build: ./requirements/wordpress
env_file: .env
# мы монтируем том с именем wordpress на точку монтирования /var/www/html/wordpress,
# созданную образом WordPress.
# Использование тома с именем таким образом позволит разделить наш код приложения с другими контейнерами
volumes:
- wp:/var/www/html/wordpress
# мы добавляем контейнер wordpress в сеть project
networks:
- project
# этот параметр гарантирует, что наши контейнеры будут запускаться в порядке зависимости,
# и контейнер wordpress запускается после контейнера mariadb.
# Наше приложение WordPress зависит от наличия базы данных приложения и пользователя,
# поэтому установка такого порядка зависимостей позволит выполнять запуск приложения корректно
depends_on:
- mariadb
nginx:
container_name: nginx
build: ./requirements/nginx
hostname: localhost
volumes:
- wp:/var/www/html/wordpress
networks:
- project
depends_on:
- wordpress
# Вспомните о том, что в качестве порта в 'nginx' указан порт 443.
# Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
# мы должны организовать перенаправление этого порта на порт компьютера.
# Сделать это нам поможет ключевое слово 'ports'.
# При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
# В нашем случае нужно использовать порт компьютера 443 и организовать его связь с портом
# 443 контейнера (так как именно на этот порт сервер
# ожидает поступления запросов).
ports:
# - "8080:80" # http
- "443:443" # https
redis:
build: requirements/bonus/redis
container_name: redis
ports:
- "6379:6379"
networks:
- project
restart: always
ftp-server:
build: requirements/bonus/ftp-server
container_name: ftp-server
ports:
- "21:21"
- "21100-21110:21100-21110"
volumes:
- wp:/var/www/html/wordpress
networks:
- project
restart: always
environment:
FTP_USR: ${FTP_USR}
FTP_PWD: ${FTP_PWD}
portainer:
# image указывает образ, с которого будет запускаться контейнер
image: portainer/portainer-ce:latest
container_name: portainer
# UI over port 9443 and expose a TCP tunnel server over port 8000
ports:
- "8000:8000"
- "9443:9443"
volumes:
- "/etc/localtime:/etc/localtime:ro"
# это сокет Unix, который демон Docker прослушивает по умолчанию,
# и его можно использовать для связи с демоном из контейнера
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# Отключить процессы-контейнеры от получения новых привилегий
# Это означает, что команды, повышающие привилегии, такие как suили sudo, больше не будут работать
security_opt:
- no-new-privileges:true
restart: always
# adminer - bring up only as needed - bypasses nginx
adminer:
# default port 8080
image: adminer:4
container_name: adminer
# Аналогичен always, за исключением того, что когда контейнер останавливается (вручную или иным образом),
# он не перезапускается даже после перезапуска демона Docker
restart: unless-stopped
networks:
- project
depends_on:
- mariadb
ports:
- "9000:8080"
# Наш ключ верхнего уровня volumes определяет тома db и wp.
# Когда Docker создает тома, содержимое тома сохраняется в директории файловой системы хоста,
# /var/lib/docker/volumes/, а данным процессом управляет Docker.
# После этого содержимое каждого тома монтируется из этой директории в любой контейнер, использующий том.
# Таким образом мы можем делиться кодом и данными между контейнерами
volumes:
db:
name: db
driver: local
driver_opts:
type: none
o: bind
device: /home/${USER}/data/db
wp:
name: wp
driver: local
driver_opts:
type: none
o: bind
device: /home/${USER}/data/wp
# Создаваемая пользователем мостовая система project позволяет организовать коммуникацию между нашими контейнерами,
# поскольку они находятся на одном хосте демона Docker.
# Это позволяет организовать трафик и коммуникации внутри приложения,
# поскольку она открывает все порты между контейнерами в одной мостовой сети, скрывая все порты от внешнего мира.
# Таким образом, наши контейнеры mariadb, wordpress и nginx могут взаимодействовать друг с другом,
# и нам нужно будет только открыть порт 440 для внешнего доступа к приложению
networks:
project:
driver: bridge