-
Notifications
You must be signed in to change notification settings - Fork 1
/
Docker.txt
283 lines (225 loc) · 18.2 KB
/
Docker.txt
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
Лучшие практики построения docker образа
1) Использовать multi stage билды
- уменьшает вес докер образова
- разделяет построение образа на фазы
- улучшает читаемость docker файла
2) Использовать преимущества кэша
- использовать правильный порядок выполнения действий(если изменить действие при формировании образа, то последующие после него нужно будет кэшировать заново)
- создавать небольшие слои
- создавать минимальное количество слоёв(например, использовать в команде RUN несколько команд, соединяя их &&)
3) Уменьшать build context
- не нужно включать лишние файлы с помощью команды COPY
- использование .dockerignore
4) Использовать подходящий базовый docker образ(например, легковесный linux дистрибутив alpine)
5) Создавать 1 docker образ для 1 приложения
--help - применим к любой команде, показывает документацию
docker version - версия
docker image ls - список всех образов
docker pull <image_name> - скачать образ из docker hub
docker images - список образов на компьютере
docker image rm <image_id> - удалить образ
docker rmi <image_id> <image_id> - удалить указанные образы
docker image prune - удалить все неиспользуемые образы
docker tag <old_image_name> <new_image_name> - создать копию образа с новым именем
docker stats --no-stream - посмотреть статистику по запущенным контейнерам
docker cp <имя_файла> <имя_контейнера>:<путь_внутри_контейнера> - скопировать файл с хост машины в контейнер
docker cp <имя_контейнера>:<путь_внутри_контейнера> <путь_на_хост_машине> - скопировать файл из контейнера в хост машину
docker commit <container_id> <new_image_name> - создать новый образ из контейнера(изменения, внесённые в контейнер сохранятся)
docker run <image_id or image_name> - запуск контейнера
docker run -it <image_id or image_name> - интерактивный запуск контейнера(оказываемся внутри запущенного контейнера)
docker run -it -p <local_port>:<port_in_container> <image_id or image_name> - запуск контейнера с указанием портов
docker run -it -d <image_id or image_name> - запуск контейнера без перехода в него(остаётся доступ к текущему терминалу)
docker run -it --name <container_name> <image_id or image_name> - задать имя контейнеру
docker run -it --rm <image_id or image_name> - после остановки контейнера, он будет удалён
docker run -it -e <var_name> -e <var_name> ... - задаём значение переменной(ых)
docker run -it --env-file <./config/.env> - указываем property file с переменными
docker run -it -v <volume_name>:<path> - создать локальную папку на машине, в которую контейнер будет сохранять данные
docker run -it -d --name <имя_контейнера> -p <порт_на_хосте>:<порт_в_контейнере> -v <папка_на_хосте>:<папка_в_контейнере> <имя_образа>
1 контейнер может быть подключен к нескольким однотипным сетям(насчёт разных типов сетей не уверен)
тип сети host не поддерживается на mac/windows т.к. находится внутри дополнительной виртуальной машины linux
docker network ls - список всех доступных сетей
docker network inspect bridge - проверить какие контейнеры подключены к сети bridge
docker network create --driver bridge <имя_сети> - создать собственную сеть с типом bridge
docker network connect bridge <имя_контейнера> - присоединить контейнер к сети bridge
docker network rm <имя_сети> - удалить сеть
docker run -it --rm --network host <image_name> - запустить контейнер, в котором сеть будет общей с хост машиной
docker run -it -m 300M --memory-swap -1 <имя образа> - лимит потребления памяти 300 Мб и использовать столько памяти сколько нужно
docker run -it -m 300M <имя образа> - лимит потребления памяти 300 Мб и swap тоже 300 Мб
docker run -it -m 300M --memory-swap 1G <имя образа> - лимит потребления памяти 300 Мб и 700 Мб swap
docker run -it -m 300M --memory-reservation 200M <имя образа> - лимит потребления памяти 300 Мб и зарезервировано 200Мб
docker run -it --memory-reservation 1G <имя образа> - может потреблять столько памяти сколько необходимо
docker run -it --cpu-period=50000 --cpu-quota=25000 <имя образа> - контейнер может использовать 50% процессорного времени каждые 50 мс
docker run -it --cpus=0.5 <имя образа> - контейнер может использовать 50% процессорного времени каждые 50 мс
docker volume create <unique_name> - создать volume(том), в отличии от bind хранится в докер демоне и с хост машины не редактируется
docker volume ls - показать список существующих томов
docker run -it --mount type=bind,src=<полный путь к папке на хост машине>,target=<путь внутри контейнера> <имя образа> - предоставить доступ контейнеру к файлу на хост машине(изменения видны в контейнер)
docker run --rm --mount type=bind,src=<полный путь к папке на хост машине>,target=<путь внутри контейнера>,readonly python python <путь внутри контейнера> - запустить файл с помощью python
docker run -it --mount type=volume,src=<имя_тома>,target=<путь внутри контейнера> <имя образа> - подключить том к контейнеру(после удаления контейнера том останется). Если тома не существует, то он будет создан автоматом
docker volume --rm <unique_name> - удалить том(можно удалить только том, который не подключён к контейнеру)
docker volume prune - удалить все неиспользуемые тома
.exit - выйти из интерактивно запущенного контейнера(контейнер будет остановлен)
ctrl+p затем ctrl+q - выход из контейнера(контейнер продолжит работу)
docker stop <container_id> - остановить контейнер
docker kill -sHUP <имя_контейнера> - перечитать конфигурационный файл
docker kill $(docker ps -q) - принудительно завершить работу всех контейнеров
docker start <container_id> - запустить контейнер
docker rm <container_id> <container_id> - удалить контейнер(ы)
docker rm -f <имя_контейнера> - остановить и удалить контейнер
docker rm $(docker ps -a -q) - удалить все контейнеры
docker container prune - удалить все незапущенные контейнеры
docker container prune -f - удалить все незапущенные контейнеры(не будет переспрашивать уверен ли в удалении)
docker container ls - список всех запущенных контейнеров
docker container ls -a - список всех контейнеров
docker ps -a - показать список всех контейнеров(короткая запись ls -a)
docker container rm <container_id or container_name> - удалить контейнер(только остановленный)
docker container attach <id_of_active_container> - перейти внутрь запущенного контейнера
docker container exec <имя_контейнера> <команда> - выполнить команду в контейнере
docker container exec -it <имя_контейнера> - открыть новый терминал для указанного контейнера
docker container inspect <имя_контейнера> - полезная инфо о контейнере в виде json
docker container logs <container_id> - посмотреть логи контейнера
docker container logs <container_id> -f - посмотреть логи контейнера в режиме реального времени
docker volume ls - посмотреть список баз данных контейнеров
docker volume inspect <volume_name> - посмотреть что храниться внутри базы данных
==============================================================================================================================================================================================
Строение Dockerfile
ARG version=latest локальная переменная, которую можно использовать в docker файле(можно передать через терминал docker build --build-arg version=1.0)
FROM <image_name>:${version} - если локально образа нет, то будет скачен
WORKDIR /app - рабочая директория(root директория), лучше использовать вместо команды "cd"
COPY . . - список файлов, которые будут скопированы в контейнер(первая . - корень текущего проекта где лежит docker файл, вторая . - корень в контейнере)
ADD <ссылка на файл> <папка> - загружает файл по указанной ссылке
ENV PORT 4200 - задаём системную переменную
RUN npm install - запуск приложения во время построения образа в контейнере
EXPOSE 3000($PORT - если переменная задана ранее) - выставление порта наружу
VOLUME ["/app/data"] - папка в которой можно хранить данные из контейнера на локальной машине(данные сохранятся после удаления контейнера)
ENTRYPOINT [<"путь к приложению">] - используется для запуска приложений
CMD [<"параметр запуска 1">, <"параметр запуска 2">] - используется вместе с ENTRYPOINT для передачи параметров запуска приложения
============================================================================Multi-stage builds==============================================================================================
# my first image
ARG alpine_version=latest
FROM alpine:${alpine_version} AS base
ARG buildno=1
WORKDIR /
WORKDIR app
WORKDIR build
# / + app + build = /app/build
RUN touch test2.txt && echo "Hello World" >> test2.txt
RUN cd .. \
&& wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.19/bin/apache-tomcat-10.1.19.tar.gz \
&& tar -xvzf apache-tomcat-10.1.19.tar.gz \
&& rm apache-tomcat-10.1.19.tar.gz
# /app/build/idea-new
COPY .idea idea-new
# *
COPY .idea/*.xml idea-new-xml/
COPY tomcat.tar.gz /app
ADD https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.19/bin/apache-tomcat-10.1.19.tar.gz tomcat-add.tar.gz
FROM alpine:latest
RUN apk add openjdk17
COPY --from=base /app/apache-tomcat-10.1.19 /app/apache-tomcat-10.1.19
EXPOSE 8080
# entrypoint - to run executable
ENTRYPOINT ["/app/apache-tomcat-10.1.19/bin/catalina.sh"]
# cmd - to add params for prev executable
CMD ["run"]
# /app/apache-tomcat-10.1.19/bin/catalina.sh run -p debug
==============================================================================================================================================================================================
docker build <file_name> . - создание образа из docker файла
docker build . - создание образа из docker файла, лежащего в текущей директории
docker build -t <tag>:<version> . - задать тэг и версию для создаваемого образа
docker build -t <имя_образа> <путь_до_папки_с_dockerfile>
docker push repository_name/<tag>:<version> - залить образ в docker hub
==============================================================================================================================================================================================
Файл должен называться compose.yaml
Строение Docker compose:
# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.
version: "3"
# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Раздел, в котором будут описаны сервисы, начинается с 'services'.
services:
# Сервис - контейнер, созданный из Dockerfile
# Назвать его можно так, как хочется.
# Понятное название сервиса помогает определить его роль.
# Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'python'.
python:
# Ключевое слово "build" позволяет задать
# путь к файлу Dockerfile, который нужно использовать для создания образа,
# который позволит запустить сервис.
# Здесь . соответствует текущему пути
build: .
# указываем название образа, который получится в процессе билда
image: python_counter_service
# имя контейнера, который будет стартовать от образа
container_name: python_counter_container
# Команда, которую нужно запустить после создания образа.
# Следующая команда означает запуск python-скрипта
command: python counter.py
version: "3"
services:
selenium:
image: selenium/standalone-chrome:3.141.59
container_name: selenium_server_works
ports:
- "4444:4444"
logging:
driver: local
test_runner:
build:
context: /Users/<USER_NAME>/LearnQA_Docker/Autotests
dockerfile: /Users/<USER_NAME>/LearnQA_Docker/compose_2/Dockerfile
image: tests_run
container_name: tests_works
network_mode: "host"
version: "2"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
db:
condition: service_healthy
db:
image: postgres:9.6
environment:
POSTGRES_PASSWORD: postgres
healthcheck:
test : ["CMD". "pg_isready", "-U", "postgres"]
interval: 1s
timeout: 1s
retries: 60
logging:
driver: none
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
volumes:
db_data: {}
==============================================================================================================================================================================================
docker-compose up - начать сборку образа
docker-compose up --build - пересобрать образ
docker-compose up -d - запустить проект
docker-compose up --abort-on-container-exit - все контейнеры завершат работу, если завершить работу хотя бы один из них
docker-compose rm - удалить контейнеры
docker-compose down - остановить проект
docker-compose down --rmi all - удалить все образы
docker-compose ps - показывает все контейнеры и команды с которыми они были запущены
docker-compose images - показывает образы на основе которых были созданы контейнеры
docker-compose logs -f <service_name> - лоши сервиса
docker-compose exec <service_name> <команда> - выполнить команду в контейнере