1487 lines
60 KiB
Markdown
1487 lines
60 KiB
Markdown
|
###### top
|
|||
|
## Docker - справка
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
[Базовые понятия Docker](#part1)
|
|||
|
- [Управление контейнерами](#chapter1)
|
|||
|
- [Логи и статистика работы](#chapter2)
|
|||
|
- [Команды в контейнере](#chapter3)
|
|||
|
|
|||
|
[Docker image](#part2)
|
|||
|
- [Общие данные](#chapter4)
|
|||
|
- [Dockerfile](#chapter5)
|
|||
|
- [Создание образа](#chapter6)
|
|||
|
|
|||
|
[Сеть в Docker](#part3)
|
|||
|
- [Устройство сети](#chapter7)
|
|||
|
- [Драйвер bridge](#chapter8)
|
|||
|
- [Проброс портов](#chapter9)
|
|||
|
- [Драйвера host и null](#chapter10)
|
|||
|
- [DNS](#chapter11)
|
|||
|
|
|||
|
[Docker volumes](#part4)
|
|||
|
- [Устройство и типы volumes](#chapter12)
|
|||
|
- [Использование volumes](#chapter13)
|
|||
|
- [Volume в Dockerfile](#chapter14)
|
|||
|
- [bind mounts](#chapter15)
|
|||
|
- [tmpfs](#chapter16)
|
|||
|
- [Копирование данных](#chapter17)
|
|||
|
|
|||
|
[Docker compose](#part5)
|
|||
|
- [YAML](#chapter18)
|
|||
|
- [Простой конфиг](#chapter19)
|
|||
|
- [Профили](#chapter20)
|
|||
|
- [Запуск отдельных сервисов](#chapter21)
|
|||
|
- [Переменные окружения](#chapter22)
|
|||
|
- [Объединение конфигураций](#chapter23)
|
|||
|
- [](#chapter24)
|
|||
|
- [](#chapter25)
|
|||
|
- [](#chapter26)
|
|||
|
- [](#chapter27)
|
|||
|
- [](#chapter28)
|
|||
|
- [](#chapter29)
|
|||
|
- [](#chapter30)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
`docker --help`
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### part1
|
|||
|
## Базовые понятия Docker
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
###### Chapter1
|
|||
|
### Управление контейнерами
|
|||
|
|
|||
|
`docker run nginx` - создать и запустить контейнер из образа nginx, если образа нет локально, образ будет скачан из репозитория.
|
|||
|
`docker run --name my-nginx -d nginx` - создать и запустить контейнер с указанным именем `--name my-nginx`; в фоновом процессе `-d` - detach; из образа nginx
|
|||
|
*кроме этого есть команды:*
|
|||
|
`create` - создать контейнер, не запуская
|
|||
|
`start`, `stop`, `pause`
|
|||
|
|
|||
|
`docker ps` - показать все запущенные контейнеры
|
|||
|
`docker ps -a` - показать все контейнеры, в том числе остановленные
|
|||
|
|
|||
|
`docker rm nginx` - удалить остановленный контейнер с именем nginx
|
|||
|
`docker rm -f nginx` - удалить контейнер с именем nginx принудительно, даже если он запущен
|
|||
|
`docker container prune` - удалить все остановленные контейнеры
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter2
|
|||
|
### Логи и статистика работы
|
|||
|
|
|||
|
`docker stats` - статистика по используемым ресурсам запущенных контейнеров
|
|||
|
```bash
|
|||
|
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
|
|||
|
6ed9807997de my-web 0.00% 3.348MiB / 1.941GiB 0.17% 1.22kB / 0B 0B / 16.4kB 3
|
|||
|
08d3dc4c1595 mongo 0.22% 147.2MiB / 1.941GiB 7.41% 1.51kB / 0B 3.1MB / 43.9MB 33
|
|||
|
^C
|
|||
|
```
|
|||
|
|
|||
|
`docker inspect` - информация о контейнере или локальном образе
|
|||
|
*можно получить выдержку из состояния, использовав ключ `-f` - format*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker inspect my-web -f '{{.State.Status}}'
|
|||
|
running
|
|||
|
```
|
|||
|
|
|||
|
***форматирование и фильтрация вывода доступна во многих командах, например***
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker inspect --help
|
|||
|
|
|||
|
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
|
|||
|
|
|||
|
Return low-level information on Docker objects
|
|||
|
|
|||
|
Options:
|
|||
|
-f, --format string Format the output using the given Go template
|
|||
|
-s, --size Display total file sizes if the type is container
|
|||
|
--type string Return JSON for specified type
|
|||
|
```
|
|||
|
*или*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps --help
|
|||
|
|
|||
|
Usage: docker ps [OPTIONS]
|
|||
|
|
|||
|
List containers
|
|||
|
|
|||
|
Options:
|
|||
|
-a, --all Show all containers (default shows just running)
|
|||
|
-f, --filter filter Filter output based on conditions provided
|
|||
|
--format string Pretty-print containers using a Go template
|
|||
|
-n, --last int Show n last created containers (includes all states) (default -1)
|
|||
|
-l, --latest Show the latest created container (includes all states)
|
|||
|
--no-trunc Don't truncate output
|
|||
|
-q, --quiet Only display container IDs
|
|||
|
-s, --size Display total file sizes
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps
|
|||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|||
|
6ed9807997de nginx "/docker-entrypoint.…" 5 seconds ago Up 3 seconds 80/tcp my-web
|
|||
|
08d3dc4c1595 mongo "docker-entrypoint.s…" About an hour ago Up About an hour 27017/tcp mongo
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps --filter
|
|||
|
ancestor= exited= health= is-task= name= publish= status=
|
|||
|
before= expose= id= label= network= since= volume=
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps --filter name=my-web
|
|||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|||
|
6ed9807997de nginx "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp my-web
|
|||
|
```
|
|||
|
|
|||
|
**Логи**
|
|||
|
`docker logs my-web` - показать логи контейнера
|
|||
|
`docker logs my-web | grep 'default.conf'` - вывести логи и отфильтровать по сочетанию `default.conf`
|
|||
|
`docker logs my-web | grep 'default.conf' -A 2` - строка соответствующая сочетанию `default.conf` + 2 строки после
|
|||
|
`docker logs my-web | grep 'default.conf' -B 2` - строка соответствующая сочетанию `default.conf` + 2 строки перед
|
|||
|
`docker logs my-web -f` - отображать логи в реальном времени
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter3
|
|||
|
### Команды в контейнере
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec --help
|
|||
|
|
|||
|
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
|
|||
|
|
|||
|
Run a command in a running container
|
|||
|
|
|||
|
Options:
|
|||
|
-d, --detach Detached mode: run command in the background
|
|||
|
--detach-keys string Override the key sequence for detaching a container
|
|||
|
-e, --env list Set environment variables
|
|||
|
--env-file list Read in a file of environment variables
|
|||
|
-i, --interactive Keep STDIN open even if not attached
|
|||
|
--privileged Give extended privileges to the command
|
|||
|
-t, --tty Allocate a pseudo-TTY
|
|||
|
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
|
|||
|
-w, --workdir string Working directory inside the container
|
|||
|
```
|
|||
|
|
|||
|
*В контейнере `mongo` перейти в директорию `/root` и выполнить команду `pwd`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -w /root mongo pwd
|
|||
|
/root
|
|||
|
```
|
|||
|
|
|||
|
*Задать переменную в контейнере и вывести список всех переменных окружения, доступных в контейнере*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -e MYVAR=1 mongo printenv
|
|||
|
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|||
|
HOSTNAME=08d3dc4c1595
|
|||
|
GOSU_VERSION=1.12
|
|||
|
JSYAML_VERSION=3.13.1
|
|||
|
MONGO_PACKAGE=mongodb-org
|
|||
|
MONGO_REPO=repo.mongodb.org
|
|||
|
MONGO_MAJOR=5.0
|
|||
|
MONGO_VERSION=5.0.3
|
|||
|
MYVAR=1
|
|||
|
HOME=/root
|
|||
|
```
|
|||
|
|
|||
|
*Покдлючиться к оболочке контейнера в интерактивном режиме*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it mongo bash
|
|||
|
root@08d3dc4c1595:/#
|
|||
|
```
|
|||
|
|
|||
|
*Выполнить в контейнере команду `mongo --version`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec mongo mongo --version
|
|||
|
MongoDB shell version v5.0.3
|
|||
|
Build Info: {
|
|||
|
"version": "5.0.3",
|
|||
|
"gitVersion": "657fea5a61a74d7a79df7aff8e4bcf0bc742b748",
|
|||
|
"openSSLVersion": "OpenSSL 1.1.1f 31 Mar 2020",
|
|||
|
"modules": [],
|
|||
|
"allocator": "tcmalloc",
|
|||
|
"environment": {
|
|||
|
"distmod": "ubuntu2004",
|
|||
|
"distarch": "x86_64",
|
|||
|
"target_arch": "x86_64"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
`docker exec mongo mongo --version > ver.txt` - перенаправить вывод в файл на хосте
|
|||
|
`docker exec mongo bash -c 'mongo --version > ver.txt'` - перенаправить вывод в файл в контейнере
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### part2
|
|||
|
## Docker image
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
###### Chapter4
|
|||
|
### Общие данные
|
|||
|
|
|||
|
`docker image --help`
|
|||
|
`docker images` - показать скачанные образы
|
|||
|
`docker save --output nginx.tar nginx` - сохранить образ в текущую директорию
|
|||
|
`docker image import --help` - импорт ранее сохранённого образа
|
|||
|
`docker history nginx` - информация о создании образа
|
|||
|
`docker inspect nginx` - информация об образе
|
|||
|
|
|||
|
`docker pull nginx` - скачать образ nginx не запуская контейнер
|
|||
|
`docker push --help` - опубликовать созданный образ во внешнем реестре образов
|
|||
|
|
|||
|
*`ls` - аналог `docker images`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker image ls
|
|||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
|||
|
mongo latest fefd78e9381a 12 days ago 699MB
|
|||
|
nginx latest 87a94228f133 2 weeks ago 133MB
|
|||
|
```
|
|||
|
|
|||
|
*вывести определённую колонку, название колонки с **большой** буквы*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker image ls --format {{.Tag}}
|
|||
|
latest
|
|||
|
latest
|
|||
|
```
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker image ls --format {{.Repository}}
|
|||
|
mongo
|
|||
|
nginx
|
|||
|
```
|
|||
|
|
|||
|
*если образов много, вывод можно отфильтровать*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker image ls --filter
|
|||
|
before= dangling= label= reference= since=
|
|||
|
```
|
|||
|
|
|||
|
`docker image rm hello-world` - удалить образ
|
|||
|
`docker rmi hello-world` - удалить образ
|
|||
|
`docker image rm hello-world -f` - удалить образ даже если его использует какой-то контейнер, контейнер удалён НЕ будет
|
|||
|
`docker image prune` - удалить все образы без тега
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter5
|
|||
|
### Dockerfile
|
|||
|
|
|||
|
`FROM ubuntu:20.04` - установит базовый образ, на основе которого будет создаваться текущий образ. Если тег `20.04` не указан, будет использован образ `latest`
|
|||
|
`LABEL ENV=”DEVELOPMENT”` - пара ключ-значение, используемая для указания метаданных информации образа
|
|||
|
`RUN apt-get update`
|
|||
|
`RUN apt-get install tomcat` - используется для выполнения команды на базовом образе и создает новый слой
|
|||
|
`CMD [“java”, “-jar”, “app.jar”]` - используется для задания команды, которая будет выполняться первой при запуске контейнера
|
|||
|
`EXPOSE 8080` - откроет порт для доступа к контейнеру. Контейнер будет прослушивать этот сетевой порт
|
|||
|
`MAINTAINER devops@admin.in` - предоставит подробную информацию об авторе, который создал этот образ
|
|||
|
`ENV DB_NAME=”MySQL”`
|
|||
|
`ENV DB_VERSION=”8.0”` - используется для установки переменных среды в паре ключ-значение. Эти переменные устанавливаются во время сборки образа и доступны после создания контейнера
|
|||
|
`COPY /target/devops.jar devops.jar` - используется для копирования локальных файлов в контейнер
|
|||
|
`ADD devops.tar.xz / .`
|
|||
|
`ADD http://example.com/abc.git /usr/local/devops/` - работает так же, как COPY, но имеет некоторые дополнительные функции, такие например, что мы можем извлечь локальный tar и добавить удаленный URL
|
|||
|
`ENTRYPOINT [“java”, “-jar”, “app.jar”]` - используется для установки основной команды для образа. Он работает так же, как инструкция CMD. Разница между CMD и ENTRYPOINT в том, что инструкции не перезаписываются в ENTRYPOINT
|
|||
|
`VOLUME /app/devops` - создает точку монтирования с указанным именем
|
|||
|
`USER <user>[:<group>]`
|
|||
|
`USER <UID>[:<GID>]` - устанавливает имя пользователя и группу пользователей при запуске образа
|
|||
|
`WORKDIR /var/lib/` - установит рабочий каталог. Он создаст каталог, если его нет
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter6
|
|||
|
### Создание образа
|
|||
|
|
|||
|
`docker build --help`
|
|||
|
|
|||
|
*Пример сборки образа*
|
|||
|
```bash
|
|||
|
docker build -f ./apps/api/Dockerfile -t test:latest .
|
|||
|
```
|
|||
|
`-f` - указать путь к Dockerfile, если он не в текущей директории
|
|||
|
`-t` - указать имя образа с тегом, если тег не будет указан, по-умолчанию присвоится `:latest`
|
|||
|
`.` - брать контекст для образа из текущей директории
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### part3
|
|||
|
## Сеть в Docker
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
- `bridge` мост — это сетевой драйвер по умолчанию. Бридж сеть используется, когда приложения запускаются в автономных контейнерах, которые должны взаимодействовать между собой (Наглядный пример Nginx + MySQL);
|
|||
|
|
|||
|
- `host` хост — это сетевой драйвер для автономных контейнеров (удаленная сетевая изоляция между контейнером и Docker хостом). Данный драйвер доступен только для docker-swarm;
|
|||
|
|
|||
|
- `overlay/overlay2` оверлей (наложенная сеть), — это сетевой драйвер для соединения нескольких демонов Docker между собой и которые позволяют docker-swarm службам взаимодействовать друг с другом. Также можно использовать оверлейные сети для облегчения связи между docker-swarm и автономным контейнером или между двумя отдельными контейнерами на разных Docker демонах. Эта стратегия устраняет необходимость выполнения маршрутизации на уровне ОС между этими контейнерами;
|
|||
|
|
|||
|
- `macvlan` маквлан — это сетевой драйвер, который позволяют назначать MAC-адрес контейнеру, делая его отображаемым как физическое устройство в сети. Docker демон направляет трафик на контейнеры по их MAC-адресам. Использование macvlan драйвера иногда является лучшим выбором при работе с устаревшими приложениями, которые ожидают, что они будут напрямую подключены к физической сети;
|
|||
|
|
|||
|
- `none` — это сетевой драйвер, который умеет отключать всю сеть для контейнеров. Обычно используется в сочетании с пользовательским сетевым драйвером;
|
|||
|
|
|||
|
- `Network plugins` — кроме этого, можно установить и использовать сторонние сетевые плагины с Docker контейнерами. Эти плагины доступны в Docker Store или у сторонних поставщиков услуг.
|
|||
|
|
|||
|
###### Chapter7
|
|||
|
### Устройство сети
|
|||
|
|
|||
|
```bash
|
|||
|
Usage: docker network COMMAND
|
|||
|
|
|||
|
Manage networks
|
|||
|
|
|||
|
Commands:
|
|||
|
connect Connect a container to a network
|
|||
|
create Create a network
|
|||
|
disconnect Disconnect a container from a network
|
|||
|
inspect Display detailed information on one or more networks
|
|||
|
ls List networks
|
|||
|
prune Remove all unused networks
|
|||
|
rm Remove one or more networks
|
|||
|
```
|
|||
|
|
|||
|
*Отобразить имеющиеся сети*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network ls
|
|||
|
NETWORK ID NAME DRIVER SCOPE
|
|||
|
222826f8b512 bridge bridge local
|
|||
|
5f64c40ea352 host host local
|
|||
|
79350884305f none null local
|
|||
|
```
|
|||
|
|
|||
|
*Создать сеть типа `bridge` с именем `br2`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network create br2
|
|||
|
40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705
|
|||
|
```
|
|||
|
или
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network create --driver=bridge br2
|
|||
|
```
|
|||
|
|
|||
|
По-умолчанию, всегда создаётся мост
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network ls
|
|||
|
NETWORK ID NAME DRIVER SCOPE
|
|||
|
40ff1259ca7e br2 bridge local
|
|||
|
222826f8b512 bridge bridge local
|
|||
|
5f64c40ea352 host host local
|
|||
|
79350884305f none null local
|
|||
|
```
|
|||
|
|
|||
|
*пример создания оверлей-сети*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network create --driver overlay overlay-net
|
|||
|
```
|
|||
|
для создания оверлей-сети необходимо активировать docker-swarm
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter8
|
|||
|
### Драйвер bridge
|
|||
|
|
|||
|
Сеть с драйвером bridge создаётся по-умолчанию.
|
|||
|
Контейнеры, использующие одну сеть могут видеть друг друга по выделенному им IP адресу.
|
|||
|
Посмотреть детальную информацию о сети можно с помощью команды `inspect`
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network inspect bridge
|
|||
|
[
|
|||
|
{
|
|||
|
"Name": "bridge",
|
|||
|
"Id": "222826f8b512e0803fc5d6fa26c443af23908be03f46b15f41d1a932557a9df5",
|
|||
|
"Created": "2021-10-29T15:30:59.140332733+03:00",
|
|||
|
"Scope": "local",
|
|||
|
"Driver": "bridge",
|
|||
|
"EnableIPv6": false,
|
|||
|
"IPAM": {
|
|||
|
"Driver": "default",
|
|||
|
"Options": null,
|
|||
|
"Config": [
|
|||
|
{
|
|||
|
"Subnet": "172.17.0.0/16",
|
|||
|
"Gateway": "172.17.0.1"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"Internal": false,
|
|||
|
"Attachable": false,
|
|||
|
"Ingress": false,
|
|||
|
"ConfigFrom": {
|
|||
|
"Network": ""
|
|||
|
},
|
|||
|
"ConfigOnly": false,
|
|||
|
"Containers": {
|
|||
|
"08d3dc4c15953ed7a25e629b983ecba977ed64f73bf3d138943bb12e644c463b": {
|
|||
|
"Name": "mongo",
|
|||
|
"EndpointID": "f24d0dfbe08458bc7c7c5ca31cec04832c00e3ba062f18757277033754d4e4bb",
|
|||
|
"MacAddress": "02:42:ac:11:00:03",
|
|||
|
"IPv4Address": "172.17.0.3/16",
|
|||
|
"IPv6Address": ""
|
|||
|
},
|
|||
|
"56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061": {
|
|||
|
"Name": "node-1",
|
|||
|
"EndpointID": "788fcfc6ce612363128d7b3d8c16fd259ea0bd84c0114702fefb64ec739161d6",
|
|||
|
"MacAddress": "02:42:ac:11:00:04",
|
|||
|
"IPv4Address": "172.17.0.4/16",
|
|||
|
"IPv6Address": ""
|
|||
|
},
|
|||
|
"6ed9807997de2bed3d6f2aeafc2fca5f2d843a55e10b1611e7f5e474f2be473d": {
|
|||
|
"Name": "my-web",
|
|||
|
"EndpointID": "a7d5032f4ea38edb0cf7f6f3ecbed7eada2e0cf9184dfb5c393b67cfb6f72c57",
|
|||
|
"MacAddress": "02:42:ac:11:00:02",
|
|||
|
"IPv4Address": "172.17.0.2/16",
|
|||
|
"IPv6Address": ""
|
|||
|
},
|
|||
|
"f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941": {
|
|||
|
"Name": "node-2",
|
|||
|
"EndpointID": "82baf3a4d8fcddd3538b86cf3237e710b53d9975a78ec98a07e3055fb7ee80a8",
|
|||
|
"MacAddress": "02:42:ac:11:00:05",
|
|||
|
"IPv4Address": "172.17.0.5/16",
|
|||
|
"IPv6Address": ""
|
|||
|
}
|
|||
|
},
|
|||
|
"Options": {
|
|||
|
"com.docker.network.bridge.default_bridge": "true",
|
|||
|
"com.docker.network.bridge.enable_icc": "true",
|
|||
|
"com.docker.network.bridge.enable_ip_masquerade": "true",
|
|||
|
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
|
|||
|
"com.docker.network.bridge.name": "docker0",
|
|||
|
"com.docker.network.driver.mtu": "1500"
|
|||
|
},
|
|||
|
"Labels": {}
|
|||
|
}
|
|||
|
]
|
|||
|
```
|
|||
|
*в длинном выводе указана вся информация о сети, её адресации и контейнерах, которые используют эту сеть.*
|
|||
|
***Чтобы контейнеры могли обращаться друг к другу по имени, необходимо создать новую сеть и добавить в неё эти контейнеры***
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker network create br2
|
|||
|
40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705
|
|||
|
da2001@us:~/docker-demo-3$ docker run -d --name node-1 demo3
|
|||
|
56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061
|
|||
|
da2001@us:~/docker-demo-3$ docker run -d --name node-2 demo3
|
|||
|
f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941
|
|||
|
da2001@us:~/docker-demo-3$ docker network connect br2 node-1
|
|||
|
da2001@us:~/docker-demo-3$ docker network connect br2 node-2
|
|||
|
da2001@us:~/docker-demo-3$ docker network inspect br2
|
|||
|
[
|
|||
|
{
|
|||
|
"Name": "br2",
|
|||
|
"Id": "40ff1259ca7e103736c74da0309d6fde5d8439d6844d6f5997b216912d05a705",
|
|||
|
"Created": "2021-10-31T11:20:50.595291142+03:00",
|
|||
|
"Scope": "local",
|
|||
|
"Driver": "bridge",
|
|||
|
"EnableIPv6": false,
|
|||
|
"IPAM": {
|
|||
|
"Driver": "default",
|
|||
|
"Options": {},
|
|||
|
"Config": [
|
|||
|
{
|
|||
|
"Subnet": "172.18.0.0/16",
|
|||
|
"Gateway": "172.18.0.1"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"Internal": false,
|
|||
|
"Attachable": false,
|
|||
|
"Ingress": false,
|
|||
|
"ConfigFrom": {
|
|||
|
"Network": ""
|
|||
|
},
|
|||
|
"ConfigOnly": false,
|
|||
|
"Containers": {
|
|||
|
"56e21d5c7bbdf562e75a5ee614e43648273e9960bc72678285a02863c46b2061": {
|
|||
|
"Name": "node-1",
|
|||
|
"EndpointID": "9ac4317d24147360565c69e021e4c6bc7a407103c2e6a907475f707f4deed32a",
|
|||
|
"MacAddress": "02:42:ac:12:00:02",
|
|||
|
"IPv4Address": "172.18.0.2/16",
|
|||
|
"IPv6Address": ""
|
|||
|
},
|
|||
|
"f4331c7520ba749fbdf33d98c1fcb5284a2df63e510f841e7dcd655878c43941": {
|
|||
|
"Name": "node-2",
|
|||
|
"EndpointID": "3e41fd9618f71446878a7c585d9289bc4a099c7c15f8cf835084c0015c87ed54",
|
|||
|
"MacAddress": "02:42:ac:12:00:03",
|
|||
|
"IPv4Address": "172.18.0.3/16",
|
|||
|
"IPv6Address": ""
|
|||
|
}
|
|||
|
},
|
|||
|
"Options": {},
|
|||
|
"Labels": {}
|
|||
|
}
|
|||
|
]
|
|||
|
```
|
|||
|
*из вывода видно, что к сети br2 подключено 2 контейнера: node-1(172.18.0.2) и node-2(172.18.0.3)*
|
|||
|
*подключимся к node-1 и попробуем пинговать node-2*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it node-1 sh
|
|||
|
/opt/app # ip a
|
|||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
|
|||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|||
|
inet 127.0.0.1/8 scope host lo
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
|
|||
|
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
|
|||
|
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
/opt/app # ping 172.17.0.5
|
|||
|
PING 172.17.0.5 (172.17.0.5): 56 data bytes
|
|||
|
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.099 ms
|
|||
|
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.065 ms
|
|||
|
64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.058 ms
|
|||
|
64 bytes from 172.17.0.5: seq=3 ttl=64 time=0.058 ms
|
|||
|
^C64 bytes from 172.17.0.5: seq=4 ttl=64 time=0.060 ms
|
|||
|
64 bytes from 172.17.0.5: seq=5 ttl=64 time=0.057 ms
|
|||
|
^C
|
|||
|
--- 172.17.0.5 ping statistics ---
|
|||
|
6 packets transmitted, 6 packets received, 0% packet loss
|
|||
|
round-trip min/avg/max = 0.057/0.066/0.099 ms
|
|||
|
/opt/app # ping node-2
|
|||
|
PING node-2 (172.18.0.3): 56 data bytes
|
|||
|
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.060 ms
|
|||
|
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.061 ms
|
|||
|
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.061 ms
|
|||
|
64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.067 ms
|
|||
|
64 bytes from 172.18.0.3: seq=4 ttl=64 time=0.062 ms
|
|||
|
^C
|
|||
|
--- node-2 ping statistics ---
|
|||
|
5 packets transmitted, 5 packets received, 0% packet loss
|
|||
|
round-trip min/avg/max = 0.060/0.062/0.067 ms
|
|||
|
/opt/app #
|
|||
|
```
|
|||
|
|
|||
|
*контейнер можно создавать сразу с подключением к необходимоу сети*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name node-3 --network br2 demo3
|
|||
|
daa1712392be54aa26b8f14365d3a9cdfa13cf19ad0524afe1db352d9c3e4e77
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter9
|
|||
|
### Проброс портов
|
|||
|
|
|||
|
Для взаимодействия с приложениями внутри контейнеров из хост системы необходимо выполнить проброс портов в контейнер
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name node-4 --network br2 -p 2000:3000 demo3
|
|||
|
25dfcaa0e29e7e99f2e93b45dbdbd3268b9781998215343323afceaeefff8c72
|
|||
|
```
|
|||
|
порт 2000 хоста пробросили на порт 3000 контейнера
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps
|
|||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|||
|
25dfcaa0e29e demo3 "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:2000->3000/tcp, :::2000->3000/tcp node-4
|
|||
|
```
|
|||
|
*теперь с хоста к контейнеру можно обратиться на порт 2000*
|
|||
|
```bash
|
|||
|
da2001@us:~$ curl localhost:2000
|
|||
|
{"eth0":["172.18.0.5"]}
|
|||
|
```
|
|||
|
*при этом, порт 3000 дотсупен не будет*
|
|||
|
```bash
|
|||
|
da2001@us:~$ curl localhost:3000
|
|||
|
curl: (7) Failed to connect to localhost port 3000: Connection refused
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter10
|
|||
|
### Драйвера host и null
|
|||
|
|
|||
|
Если дополнительный слой абстракции в виде сети внутри контейнера не нужен, можно создать контейнер с сетью `host`, тогда у контейнера будет IP адрес сети docker0 хоста
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name node-5 --network host demo3
|
|||
|
e7ea1e790aca5e122883e994e836fae835e8b9f4bd0c02acbc0a691ed7a5a2bc
|
|||
|
```
|
|||
|
*посмотрим IP адрес хоста*
|
|||
|
```bash
|
|||
|
da2001@us:~$ ip a
|
|||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
|
|||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|||
|
inet 127.0.0.1/8 scope host lo
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
inet6 ::1/128 scope host
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
|
|||
|
link/ether 8e:eb:ab:c6:9b:ff brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 192.168.13.254/24 brd 192.168.13.255 scope global dynamic ens18
|
|||
|
valid_lft 328sec preferred_lft 328sec
|
|||
|
inet6 fe80::8ceb:abff:fec6:9bff/64 scope link
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
|
|||
|
link/ether 02:42:50:59:0e:e1 brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
inet6 fe80::42:50ff:fe59:ee1/64 scope link
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
```
|
|||
|
*подключимся к контейнеру и проверим его IP*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it node-5 sh
|
|||
|
/opt/app # ip a
|
|||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
|
|||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|||
|
inet 127.0.0.1/8 scope host lo
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
inet6 ::1/128 scope host
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
|
|||
|
link/ether 8e:eb:ab:c6:9b:ff brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 192.168.13.254/24 brd 192.168.13.255 scope global dynamic ens18
|
|||
|
valid_lft 328sec preferred_lft 328sec
|
|||
|
inet6 fe80::8ceb:abff:fec6:9bff/64 scope link
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
|
|||
|
link/ether 02:42:50:59:0e:e1 brd ff:ff:ff:ff:ff:ff
|
|||
|
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
inet6 fe80::42:50ff:fe59:ee1/64 scope link
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
```
|
|||
|
***IP адреса на хосте и в контейнере идентичны***
|
|||
|
|
|||
|
Обратная ситуация, когда для работы контейнера сеть не нужна совсем.
|
|||
|
*в этом случае необходимо создать контейнер с сетью `none`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name node-6 --network none demo3
|
|||
|
9fc34160933654ac7b2ec8ec57c8de9a488de080262d836d3fd97c7ff43d26ac
|
|||
|
```
|
|||
|
*подключимся к контейнеру и проверим его сетевые интерфейсы*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it node-6 sh
|
|||
|
/opt/app # ip a
|
|||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
|
|||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|||
|
inet 127.0.0.1/8 scope host lo
|
|||
|
valid_lft forever preferred_lft forever
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter11
|
|||
|
### DNS
|
|||
|
|
|||
|
Если необходимо в контейнере указать определённый DNS сервер, его можно передать в качестве параметра при создании контейнера
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name node-7 --dns 8.8.8.8 demo3
|
|||
|
8c0e984de40f504f1a747a5c85fed2c8b7b6e8f5e8379a9bbc0da352ad77612d
|
|||
|
da2001@us:~$ docker exec -it node-7 sh
|
|||
|
/opt/app # cat /etc/resolv.conf
|
|||
|
search da2001.ru
|
|||
|
nameserver 8.8.8.8
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### part4
|
|||
|
## Docker volumes
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
###### Chapter12
|
|||
|
### Устройство и типы volumes
|
|||
|
|
|||
|
- `tmpfs` - данные хранятся внутри контейнера, доступны только в нём и цикл жизни этих данных совпадается с циклом жизни контейнера. Т.е. при остановке/удалении контейнера, данные недоступны;
|
|||
|
|
|||
|
- `volumes` - ***тома хранения данных, рекомендуемый разработчиками Docker способ хранения данных***. В Linux тома находятся по умолчанию в `/var/lib/docker/volumes/`. Другие программы не должны получать к ним доступ напрямую, только через контейнер.
|
|||
|
* Тома создаются и управляются средствами Docker: командой docker volume create, через указание тома при создании контейнера в Dockerfile или docker-compose.yml.
|
|||
|
* В контейнере том видно как обычный каталог, который мы определяем в Dockerfile. Тома могут быть с именами или без — безымянным томам Docker сам присвоит имя.
|
|||
|
* Один том может быть примонтирован одновременно в несколько контейнеров. Когда никто не использует том, он не удаляется, а продолжает существовать. Команда для удаления томов: `docker volume prune`.
|
|||
|
* Можно выбрать специальный драйвер для тома и хранить данные не на хосте, а на удалённом сервере или в облаке.
|
|||
|
*<u>Для чего стоит использовать тома в Docker:</u>*
|
|||
|
+ шаринг данных между несколькими запущенными контейнерами;
|
|||
|
+ решение проблемы привязки к ОС хоста;
|
|||
|
+ удалённое хранение данных;
|
|||
|
+ бэкап или миграция данных на другой хост с Docker (для этого надо остановить все контейнеры и скопировать содержимое из каталога тома в нужное место).
|
|||
|
|
|||
|
- `bind mounts` - монтирование каталога хоста. Более простая концепция: файл или каталог с хоста просто монтируется в контейнер.
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter13
|
|||
|
### Использование volumes
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker volume --help
|
|||
|
|
|||
|
Usage: docker volume COMMAND
|
|||
|
|
|||
|
Manage volumes
|
|||
|
|
|||
|
Commands:
|
|||
|
create Create a volume
|
|||
|
inspect Display detailed information on one or more volumes
|
|||
|
ls List volumes
|
|||
|
prune Remove all unused local volumes
|
|||
|
rm Remove one or more volumes
|
|||
|
|
|||
|
Run 'docker volume COMMAND --help' for more information on a command.
|
|||
|
```
|
|||
|
|
|||
|
*Создадим volume с именем demo*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker volume create demo
|
|||
|
demo
|
|||
|
da2001@us:~$ docker volume ls
|
|||
|
DRIVER VOLUME NAME
|
|||
|
local demo
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker volume inspect demo
|
|||
|
[
|
|||
|
{
|
|||
|
"CreatedAt": "2021-10-31T13:41:28+03:00",
|
|||
|
"Driver": "local",
|
|||
|
"Labels": {},
|
|||
|
"Mountpoint": "/var/lib/docker/volumes/demo/_data",
|
|||
|
"Name": "demo",
|
|||
|
"Options": {},
|
|||
|
"Scope": "local"
|
|||
|
}
|
|||
|
]
|
|||
|
```
|
|||
|
|
|||
|
`/var/lib/docker/volumes/demo` - путь к папке с созданным томом на хосте. Данные контейнера будут храниться в папке `_data`
|
|||
|
|
|||
|
*сейчас эта папка пуста*
|
|||
|
```bash
|
|||
|
da2001@us:~$ sudo ls /var/lib/docker/volumes/demo/_data
|
|||
|
[sudo] password for da2001:
|
|||
|
da2001@us:~$ sudo du -hs /var/lib/docker/volumes/demo/_data
|
|||
|
4,0K /var/lib/docker/volumes/demo/_data
|
|||
|
```
|
|||
|
|
|||
|
*Создадим 2 контейнера и в качестве аргумента укажем использовать созданный том*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name web-1 -v demo:/data nginx:alpine
|
|||
|
1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b
|
|||
|
da2001@us:~$ docker run -d --name web-2 -v demo:/data nginx:alpine
|
|||
|
eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4
|
|||
|
da2001@us:~$ docker ps
|
|||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|||
|
eb5d5a92157e nginx:alpine "/docker-entrypoint.…" 56 seconds ago Up 54 seconds 80/tcp web-2
|
|||
|
1d0eeceefa56 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp web-1
|
|||
|
```
|
|||
|
|
|||
|
*подключимся к контейнеру `web-1` и создадим файл в папке `/data`*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it web-1 sh
|
|||
|
/ # echo TEST > /data/file
|
|||
|
/ # cat /data/file
|
|||
|
TEST
|
|||
|
```
|
|||
|
|
|||
|
*проверим наличие файла на хосте*
|
|||
|
```bash
|
|||
|
da2001@us:~$ sudo cat /var/lib/docker/volumes/demo/_data/file
|
|||
|
TEST
|
|||
|
```
|
|||
|
|
|||
|
*проверим доступность этого файла в контейнере `web-2` и добавим в этот файл еще одну строку*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it web-2 sh
|
|||
|
/ # cat /data/file
|
|||
|
TEST
|
|||
|
/ # echo TEST from web-2 >> /data/file
|
|||
|
```
|
|||
|
|
|||
|
*убедимся, что в контейнере `web-1` в файле также появилась новая строка*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker exec -it web-1 sh
|
|||
|
/ # cat /data/file
|
|||
|
TEST
|
|||
|
TEST from web-2
|
|||
|
```
|
|||
|
|
|||
|
*При попытке удалить том, который используется контейнерами, получим ошибку*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker volume rm demo
|
|||
|
Error response from daemon: remove demo: volume is in use - [1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b, eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4]
|
|||
|
```
|
|||
|
|
|||
|
*после остановки и удаления контейнеров, том удаляется без ошибок*
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker stop web-1 web-2
|
|||
|
web-1
|
|||
|
web-2
|
|||
|
da2001@us:~$ docker container prune
|
|||
|
WARNING! This will remove all stopped containers.
|
|||
|
Are you sure you want to continue? [y/N] y
|
|||
|
Deleted Containers:
|
|||
|
eb5d5a92157e4bce9c61c8e9735b53217268fa4777354a493dca3765950a93b4
|
|||
|
1d0eeceefa56d2a60d4deb3c7dadfcf90b75df42e497c6dbd91546510b33ce6b
|
|||
|
|
|||
|
Total reclaimed space: 2.308kB
|
|||
|
da2001@us:~$ docker volume rm demo
|
|||
|
demo
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter14
|
|||
|
### Volume в Dockerfile
|
|||
|
|
|||
|
Создадим свой образ на основе официального образа nginx, но добавим в Dockerfile данные о необходимом томе. Создадим том, положим в него тестовую html страницу и примонтируем том к контейнеру.
|
|||
|
|
|||
|
1. Создадим Dockerfile
|
|||
|
```dockerfile
|
|||
|
FROM nginx
|
|||
|
WORKDIR /usr/share/nginx/html
|
|||
|
VOLUME ["/usr/share/nginx/html"]
|
|||
|
EXPOSE 80
|
|||
|
```
|
|||
|
2. Создадим том
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker volume create web
|
|||
|
web
|
|||
|
```
|
|||
|
3. Добавим в созданные том тестовую html страницу
|
|||
|
```bash
|
|||
|
da2001@us:~$ sudo bash -c 'echo "Welcome to static site from volume" > /var/lib/docker/volumes/web/_data/index.html'
|
|||
|
```
|
|||
|
4. Создадим образ на основе Dockerfile
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker build -t my-nginx .
|
|||
|
Sending build context to Docker daemon 145.3MB
|
|||
|
Step 1/4 : FROM nginx
|
|||
|
latest: Pulling from library/nginx
|
|||
|
b380bbd43752: Pull complete
|
|||
|
fca7e12d1754: Pull complete
|
|||
|
745ab57616cb: Pull complete
|
|||
|
a4723e260b6f: Pull complete
|
|||
|
1c84ebdff681: Pull complete
|
|||
|
858292fd2e56: Pull complete
|
|||
|
Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
|
|||
|
Status: Downloaded newer image for nginx:latest
|
|||
|
---> 87a94228f133
|
|||
|
Step 2/4 : WORKDIR /usr/share/nginx/html
|
|||
|
---> Running in 3a87fe17392b
|
|||
|
Removing intermediate container 3a87fe17392b
|
|||
|
---> 9637854f3611
|
|||
|
Step 3/4 : VOLUME ["/usr/share/nginx/html"]
|
|||
|
---> Running in f332cde38eef
|
|||
|
Removing intermediate container f332cde38eef
|
|||
|
---> 75291905e821
|
|||
|
Step 4/4 : EXPOSE 80
|
|||
|
---> Running in d5faf760b570
|
|||
|
Removing intermediate container d5faf760b570
|
|||
|
---> f194075a481b
|
|||
|
Successfully built f194075a481b
|
|||
|
Successfully tagged my-nginx:latest
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker images
|
|||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
|||
|
my-nginx latest f194075a481b 7 seconds ago 133MB
|
|||
|
nginx latest 87a94228f133 3 weeks ago 133MB
|
|||
|
```
|
|||
|
5. Создадим контейнер на основе нового образа
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name web-demo -v web:/usr/share/nginx/html -p 8080:80 my-nginx
|
|||
|
97c4b627bd7a7248ffdb33e90a2ec65678a432bb68db9fa16ad27061ae625f59
|
|||
|
```
|
|||
|
6. Теперь убедимся, что том подключился к контейнеру и тестовая html страница доступна из контейнера
|
|||
|
```bash
|
|||
|
da2001@us:~$ curl localhost:8080
|
|||
|
Welcome to static site from volume
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter15
|
|||
|
### bind mounts
|
|||
|
`bind mounts` - позволяет примонтировать папку/файл из хостовой системы в контейнер
|
|||
|
|
|||
|
Пример: создадим в текущей директории хоста папку `html` и положим в неё файл `index.html`
|
|||
|
```bash
|
|||
|
da2001@us:~$ mkdir html
|
|||
|
da2001@us:~$ echo 'Start page from bind mounts' > html/index.html
|
|||
|
```
|
|||
|
|
|||
|
Теперь запустим контейнер и примонтируем в него созданную папку
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name web-2 -v /home/da2001/html:/usr/share/nginx/html -p 8080:80 nginx
|
|||
|
ddeefdec9653793acb01b2c25ee412fb60a7b5cdb42330d211113c3e299d6c1d
|
|||
|
```
|
|||
|
|
|||
|
Проверим работу nginx запущенного контейнера - должна открыться созданная ранее html страница
|
|||
|
```bash
|
|||
|
da2001@us:~$ curl localhost:8080
|
|||
|
Start page from bind mounts
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter16
|
|||
|
### tmpfs
|
|||
|
`tmpfs` - указанные данные этого типа существуют только пока контейнер работает, после остановки контейнера данные удаляются
|
|||
|
|
|||
|
Для монтирования можно использовать 2 вида записи
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name demo --tmpfs /vardir -p 8080:80 nginx
|
|||
|
````
|
|||
|
или
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker run -d --name demo --mount type=tmpfs,dectination=/vardir -p 8080:80 nginx
|
|||
|
```
|
|||
|
*второй тип записи применим и для других типов монтирования*
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter17
|
|||
|
### Копирование данных
|
|||
|
|
|||
|
Если возникает необходимость скопировать какие-то данные в контейнер или из него, можно воспользоваться командой `docker cp`
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~$ docker ps
|
|||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|||
|
ddeefdec9653 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp web-2
|
|||
|
```
|
|||
|
|
|||
|
*скопировать папку html хоста в папку html в контейнере*
|
|||
|
```bash
|
|||
|
da2001@us:~/html$ docker cp /home/da2001/html web-2:/usr/share/nginx/html
|
|||
|
```
|
|||
|
*скопировать содержимое папки html хоста в папку html в контейнере*
|
|||
|
```bash
|
|||
|
da2001@us:~/html$ docker cp /home/da2001/html/. web-2:/usr/share/nginx/html
|
|||
|
```
|
|||
|
|
|||
|
*обратная задача - скопировать данные из контейнера на хост*
|
|||
|
```
|
|||
|
da2001@us:~/html$ docker cp web-2:/usr/share/nginx/html /home/da2001/html
|
|||
|
```
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### part5
|
|||
|
## Docker compose
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
###### Chapter18
|
|||
|
### YAML
|
|||
|
|
|||
|
`yaml` - считается наиболее удобным для восприятия человеком среди подобных форматов: yaml, xml, json.
|
|||
|
В основе лежит принцип ключ: значение и отступы для создания структуры подчинённости.
|
|||
|
Стандартный размер отступа - 2 пробела.
|
|||
|
|
|||
|
```yaml
|
|||
|
# comment
|
|||
|
|
|||
|
# text
|
|||
|
name: test
|
|||
|
name2: "test \n"
|
|||
|
name3: 'test 234'
|
|||
|
|
|||
|
|
|||
|
# digit
|
|||
|
age: 35
|
|||
|
version: 2.3
|
|||
|
```
|
|||
|
|
|||
|
Логические значения могут быть заданы тремя равнозначными способами
|
|||
|
```yaml
|
|||
|
# boolean
|
|||
|
isDev: True
|
|||
|
isDev2: False
|
|||
|
|
|||
|
isDev3: on
|
|||
|
isDev4: off
|
|||
|
|
|||
|
isDev5: yes
|
|||
|
isDev6: no
|
|||
|
```
|
|||
|
|
|||
|
Описание объектов
|
|||
|
```yaml
|
|||
|
user:
|
|||
|
name: Василий
|
|||
|
age: 25
|
|||
|
position: engineer
|
|||
|
```
|
|||
|
|
|||
|
Списки
|
|||
|
```yaml
|
|||
|
users:
|
|||
|
- name: Дмитрий
|
|||
|
age: 34
|
|||
|
position: administrator
|
|||
|
- name: Анна
|
|||
|
age: 24
|
|||
|
position: accountant
|
|||
|
```
|
|||
|
*альтернативная запись списков без отступов*
|
|||
|
```yaml
|
|||
|
users:
|
|||
|
- name: Дмитрий
|
|||
|
age: 34
|
|||
|
position: administrator
|
|||
|
- name: Анна
|
|||
|
age: 24
|
|||
|
position: accountant
|
|||
|
```
|
|||
|
*списки без ключей*
|
|||
|
```yaml
|
|||
|
users:
|
|||
|
- Николай
|
|||
|
- Андрей
|
|||
|
```
|
|||
|
*описание списков в виде json*
|
|||
|
```yaml
|
|||
|
versions: [1.7, 2.3, 'latest']
|
|||
|
```
|
|||
|
|
|||
|
Описание строк
|
|||
|
*многострочная строка*
|
|||
|
```yaml
|
|||
|
multiline: |
|
|||
|
Эта строка сохранит своё
|
|||
|
форматирование и будет
|
|||
|
отображаться в несколько строк
|
|||
|
```
|
|||
|
*длинная строка без переноса*
|
|||
|
```yaml
|
|||
|
singleline: >
|
|||
|
Это очень длинная строка,
|
|||
|
но она будет отображена без
|
|||
|
использования переносов
|
|||
|
```
|
|||
|
|
|||
|
Если в рамках одного yaml файла необходимо описать несколько независимых сущностей, их можно отделить друг от друга с помощью `---`
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter19
|
|||
|
### Пример файла docker-compose.yml
|
|||
|
|
|||
|
```yaml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
environment:
|
|||
|
WORDPRESS_DB_NAME: wp_db
|
|||
|
WORDPRESS_DB_HOST: db
|
|||
|
WORDPRESS_DB_USER: db_user
|
|||
|
WORDPRESS_DB_PASSWORD: wp_db_pass
|
|||
|
|
|||
|
volumes:
|
|||
|
["./:/var/www/html"]
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
restart: always
|
|||
|
environment:
|
|||
|
MYSQL_DATABASE: wp_db
|
|||
|
MYSQL_USER: db_user
|
|||
|
MYSQL_PASSWORD: wp_db_pass
|
|||
|
MYSQL_ROOT_PASSWORD: db_root_pass
|
|||
|
volumes:
|
|||
|
- db:/var/lib/mysql
|
|||
|
|
|||
|
volumes:
|
|||
|
db:
|
|||
|
```
|
|||
|
|
|||
|
Эта конфигурация запустит 2 контенера: mysql и wordpress
|
|||
|
|
|||
|
**Разбор параметров**
|
|||
|
|
|||
|
`version: '3.1'` - в зависимости от используемой версии, compose может принимать или нет некоторые директивы, также зависит от установленной версии docker
|
|||
|
|
|||
|
*Зависимость версии compose от версии docker указана в таблице на сайте с документацией. Также объясняются возможные директивы, которые могут быть описаны в файле docker-compose.yml*
|
|||
|
|
|||
|
[*>> документация по compose <<*](https://docs.docker.com/compose/compose-file/compose-file-v3/)
|
|||
|
|
|||
|
*Каждая директива может быть описана в краткой и полной форме. Формы записи равнозначны, полная запись может быть проще для восприятия, но длиннее в записи. В данном примере будет рассмотрена краткая форма описания.*
|
|||
|
|
|||
|
`services:` - из названия понятно, что в этой секции описаны используемые сервисы. Указаны образы, на основе которых будут запущены контейнеры и параметры запуска: хранилища, сеть, переменные и пр.
|
|||
|
|
|||
|
`wordpress:` - произвольное название сервиса, который собираемся запустить
|
|||
|
|
|||
|
`image:` - указан образ, на основе которого будет запущен контейнер. Может быть указан с конкретной версией `mysql:5.7`, `wordpress:latest`, так и без указания версии `wordpress`, в этом случае будет подставлен тег `latest`
|
|||
|
|
|||
|
`restart:` - опция перезапуска контейнера. Может принимать значения: `"no"`, `always`, `on-failure`, `unless-stopped`. Игнорируется при запуске в swarm.
|
|||
|
|
|||
|
`ports:` - проброс портов. В данном примере - на порт 8080 хоста будет проброшен порт 80 контейнера.
|
|||
|
|
|||
|
`depends_on:` - зависимость при запуске. Если параметр указан, контейнер этой секции будет запущен после того, который указан в параметре. В данном примере - `wordpress` будет запущен только после успешного запуска `db`.
|
|||
|
|
|||
|
`environment:` - переменные, которые необходимо передать в контейнер в формате `ключ: значение`. Необходимые переменные для успешного запуска, обычно указаны на странице описания образа в docker hub.
|
|||
|
|
|||
|
`volumes:` - в секции services описывает тома, которые будут использованы в контейнере. В контейнер можно подключить созданный в docker том или выполнить монтирование директории или отдельного файла из хоста. Используется, когда необходимо сохранить данные после остановки/удаления контейнера, например базу данных, конфигурационные файлы, контент сайта и т.д.
|
|||
|
|
|||
|
`volumes:` - в отдельной секции описывает название томов, которые необходимо создать посредством docker для использования в контейнерах.
|
|||
|
|
|||
|
В данном примере не описано, но часто применяется на практике:
|
|||
|
|
|||
|
`networks:` - в секции services описывает сеть, к которой должен подключиться контейнер, если секция указана, её необходимо обязательно создать.
|
|||
|
Кроме ситуации, в которой контейнеру запрещается использовать сеть:
|
|||
|
```yaml
|
|||
|
app:
|
|||
|
build: ./app
|
|||
|
networks:
|
|||
|
- none
|
|||
|
```
|
|||
|
или когда используется сеть хоста
|
|||
|
```yaml
|
|||
|
app:
|
|||
|
build: ./app
|
|||
|
networks:
|
|||
|
- host
|
|||
|
```
|
|||
|
|
|||
|
`networks:` - в отдельной секции описывает сети, которые необходимо создать для использования в контейнерах. Для режимов сети без дополнительных плагинов, используются три драйвера: `bridge` - контейнерам выделяются IP адреса из одной подсети, `host` - контейнеры используют сеть хоста, `none` - контейнеры не используют сеть.
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter20
|
|||
|
### Профили
|
|||
|
|
|||
|
Иногда возникают ситуации, когда при запуске compose нет необходимости стартовать все сервисы, например, в целях тестирования или отладки. В таких ситуациях можно создать профили и добавить необходимые сервисы в эти профили. В этом случае, compose можно запускать явно указав какие профили необходимо запустить.
|
|||
|
```yaml
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
profile:
|
|||
|
- wordpress_1
|
|||
|
```
|
|||
|
Теперь, чтобы запустить контейнер с указанным профилем, его необходимо явно указать при запуске
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ docker-compose --profile wordpress_1 up -d
|
|||
|
```
|
|||
|
*этой командой будут запущены контейнеры у которых указан профиль `wordpress_1` и не указан профиль вообще.*
|
|||
|
|
|||
|
Если необходимо запустить контейнеры с несколькими профилями, каждый необходимо отдельно указать
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ docker-compose --profile wordpress_1 --profile database up -d
|
|||
|
```
|
|||
|
|
|||
|
Кроме этого, может встречаться и другая запись, когда перед стартом через запятую передаются все необходимые профили в виде переменных окружения
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ COMPOSE_PROFILES=wordpress_1 docker-compose up -d
|
|||
|
```
|
|||
|
|
|||
|
Стоит иметь ввиду, если один сервис зависит от другого - указана директива `depends_on`, нужно внимательно использовать профили. Например, если взять предыдущий пример compose и добавить в секцию сервиса `db` профиль, а в секции сервиса `wordpress` профиль указан не будет:
|
|||
|
```yaml
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
restart: always
|
|||
|
profile:
|
|||
|
- database
|
|||
|
```
|
|||
|
команда `docker-compose up -d` завершится ошибкой, т.к. при таком запуске будут стартовать только контейнеры без указанного профиля, а в этом примере - контейнер без профиля зависит от успешного запуска контейнера с указанным профилем.
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter21
|
|||
|
### Запуск отдельных сервисов
|
|||
|
|
|||
|
При использовании compose можно запустить отдельные сервисы явно указав это в команде запуска
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ docker-compose run wordpress -d
|
|||
|
```
|
|||
|
*НО, в нашем примере будут запущены оба контейнера, т.к. запуск wordpress зависит от успешного запуска db*
|
|||
|
|
|||
|
Кроме этого стоит брать во внимание особенности запуска при использовании профилей.
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter22
|
|||
|
### Переменные окружения
|
|||
|
|
|||
|
Переменные окружения удобно использовать для передачи значений в запускаемые контейнеры, например для указания имён контейнеров или передачи значений имени, пароля, названия базы данных и пр.
|
|||
|
По-умолчанию, compose считывает значения из файла `.env`, находящегося в той же директории что и `docker-compose.yml`.
|
|||
|
Например:
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ cat .env
|
|||
|
wp_container_name=wp
|
|||
|
db_container_name=db
|
|||
|
|
|||
|
db_name=wp_db
|
|||
|
db_root_pass=db_root_pass
|
|||
|
db_user=db_user
|
|||
|
db_pass=wp_db_pass
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ cat docker-compose.yml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
container_name: "${wp_container_name}"
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
environment:
|
|||
|
WORDPRESS_DB_NAME: "${db_name}"
|
|||
|
WORDPRESS_DB_HOST: db
|
|||
|
WORDPRESS_DB_USER: "${db_user}"
|
|||
|
WORDPRESS_DB_PASSWORD: "${db_pass}"
|
|||
|
volumes:
|
|||
|
- wp:/var/www/html
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
container_name: "${db_container_name}"
|
|||
|
restart: always
|
|||
|
environment:
|
|||
|
MYSQL_DATABASE: "${db_name}"
|
|||
|
MYSQL_USER: "${db_user}"
|
|||
|
MYSQL_PASSWORD: "${db_pass}"
|
|||
|
MYSQL_ROOT_PASSWORD: "${db_root_pass}"
|
|||
|
volumes:
|
|||
|
- db:/var/lib/mysql
|
|||
|
|
|||
|
volumes:
|
|||
|
db:
|
|||
|
wp:
|
|||
|
```
|
|||
|
|
|||
|
Если файл с описанием переменных называется не `.env`, тогда при запуске compose нужно это явно указать
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ docker-compose --env-file .env-web up -d
|
|||
|
```
|
|||
|
|
|||
|
Также можно указать для каждого сервиса свой файл с переменными окружения и указать в нём необходимые имена и значения переменных
|
|||
|
```bash
|
|||
|
da2001@us:~/wp$ cat docker-compose.yml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
container_name: "${wp_container_name}"
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
env_file:
|
|||
|
- .env-wp
|
|||
|
volumes:
|
|||
|
- wp:/var/www/html
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
container_name: "${db_container_name}"
|
|||
|
restart: always
|
|||
|
env_file:
|
|||
|
- .env-db
|
|||
|
volumes:
|
|||
|
- db:/var/lib/mysql
|
|||
|
|
|||
|
volumes:
|
|||
|
db:
|
|||
|
wp:
|
|||
|
```
|
|||
|
|
|||
|
Перед запуском compose будет полезным посмотреть верно ли подставились переменные, для этого используется следующая команда:
|
|||
|
```bash
|
|||
|
docker-compose config
|
|||
|
```
|
|||
|
или если указано своё имя для файла с переменными
|
|||
|
```bash
|
|||
|
docker-compose --env-file .env-web config
|
|||
|
```
|
|||
|
в результате на экране будет показан compose с уже подставленными значениями переданных переменных
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
###### Chapter23
|
|||
|
### Объединение конфигураций
|
|||
|
|
|||
|
Описание конфигурации можно разделить на несколько файлов, например для возможности запуска с разными параметрами
|
|||
|
`docker-compose.yml`
|
|||
|
```yaml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
restart: always
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
|
|||
|
volumes:
|
|||
|
["./:/var/www/html"]
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
restart: always
|
|||
|
environment:
|
|||
|
MYSQL_DATABASE: wp_db
|
|||
|
MYSQL_USER: db_user
|
|||
|
MYSQL_PASSWORD: wp_db_pass
|
|||
|
MYSQL_ROOT_PASSWORD: db_root_pass
|
|||
|
volumes:
|
|||
|
- db:/var/lib/mysql
|
|||
|
|
|||
|
volumes:
|
|||
|
db:
|
|||
|
```
|
|||
|
|
|||
|
`docker-compose.wp.yml`
|
|||
|
```yaml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
environment:
|
|||
|
WORDPRESS_DB_NAME: wp_db
|
|||
|
WORDPRESS_DB_HOST: db
|
|||
|
WORDPRESS_DB_USER: db_user
|
|||
|
WORDPRESS_DB_PASSWORD: wp_db_pass
|
|||
|
```
|
|||
|
|
|||
|
Описание проброса портов и переменные перенесли в отдельный файл. Теперь запускать эти контейнеры можем используя как и раньше, но без проброса портов и передачи переменных в контейнер `docker-compose up -d`.
|
|||
|
|
|||
|
Так и объединив оба конфигурационных файла для полного запуска
|
|||
|
```bash
|
|||
|
docker-compose -f docker-compose.yml -f docker-compose.wp.yml up -d
|
|||
|
```
|
|||
|
|
|||
|
Также можно добавить ссылку на другой конфиг в самом описании
|
|||
|
`docker-compose.yml`
|
|||
|
```yaml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
extends:
|
|||
|
file: docker-compose.wp.yml
|
|||
|
service: wordpress
|
|||
|
depends_on:
|
|||
|
- db
|
|||
|
|
|||
|
db:
|
|||
|
image: mysql:5.7
|
|||
|
restart: always
|
|||
|
environment:
|
|||
|
MYSQL_DATABASE: wp_db
|
|||
|
MYSQL_USER: db_user
|
|||
|
MYSQL_PASSWORD: wp_db_pass
|
|||
|
MYSQL_ROOT_PASSWORD: db_root_pass
|
|||
|
volumes:
|
|||
|
- db:/var/lib/mysql
|
|||
|
|
|||
|
volumes:
|
|||
|
db:
|
|||
|
```
|
|||
|
|
|||
|
`docker-compose.wp.yml`
|
|||
|
```yaml
|
|||
|
version: '3.1'
|
|||
|
|
|||
|
services:
|
|||
|
|
|||
|
wordpress:
|
|||
|
image: wordpress
|
|||
|
restart: always
|
|||
|
ports:
|
|||
|
- 8080:80
|
|||
|
environment:
|
|||
|
WORDPRESS_DB_NAME: wp_db
|
|||
|
WORDPRESS_DB_HOST: db
|
|||
|
WORDPRESS_DB_USER: db_user
|
|||
|
WORDPRESS_DB_PASSWORD: wp_db_pass
|
|||
|
|
|||
|
volumes:
|
|||
|
["./:/var/www/html"]
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
В этом случае перечислять конфигурационные файлы при запуске не нужно.
|
|||
|
|
|||
|
[вверх](#top)
|
|||
|
|
|||
|
***
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
git add . && git commit -m 'mod docker' && git push
|
|||
|
```
|
|||
|
|