Оглавление
2. Как упаковать и запустить приложение?
3. Как модифицировать приложение в докере?
4. Как поделиться созданным образом?
5. Как использовать имя тома для хранения данных в контейнере? // монтирование данных
6. Другой метод монтажа: монтирование каталога
7. Реализовать взаимную связь между контейнерами
1. Основная концепция докера
Что такое контейнер?
Официальное объяснение состоит в том, что док-контейнер — это изолированный процесс на машине, изолированный от всех других процессов на хосте. Таким образом, контейнер — это просто изолированный процесс в операционной системе, а так называемая контейнеризация — это на самом деле просто синтаксический сахар, чтобы обмануть операционную систему.
Что такое образ контейнера?
Зависимый файл работающего контейнера — это образ, и с помощью образа можно создать несколько контейнеров.
2. Как упаковать и запустить приложение?
(1) Получите исходный файл программы
Подготовка: вам необходимо установить git и использовать git для загрузки удаленного кода в локальный файл . Следующая программа является официальным примером докера:
git clone https://github.com/docker/getting-started.git
(2) Создайте образ контейнера
Для создания образа контейнера требуется Dockerfile . Dockerfile — это просто текстовый файл без расширения. Файл Dockerfile содержит сценарии инструкций, которые Docker использует для создания образов контейнеров.
Создать файл Docker: создайте пустой файл Dockerfile в загруженном проекте для начала работы (обратите внимание, что файл не имеет формата).
Заполните содержимое файла Dockerfile следующим образом (будет специальное введение в подготовку файла Dockerfile, здесь вам нужно только знать, что вам нужно использовать файл Dockerfile для создания образа контейнера):
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
В текущем каталоге файла Dockerfile (в каталоге приложения) создайте образ контейнера с помощью команды сборки docker:
docker build -t getting-started .
- -t представляет теги изображения, где начинается имя тега.
- , Указывает, что команда сборки docker ищет файл Dockerfile в текущей папке.
(3) Запустите и запустите контейнер
После успешного создания образа используйте команду docker images для просмотра созданного образа в системе. После просмотра образа используйте команду docker run для запуска созданного файла образа:
docker run -dp 3000:3000 getting-started
-d означает запуск контейнера в фоновом режиме, -p означает создание сопоставления портов между контейнером и машиной, сопоставление портов необходимо, иначе программа в контейнере не будет доступна. // Некоторые люди также говорят, что контейнер — это виртуальная машина, что, кажется, лучше объясняет сопоставление портов
Посетите http://localhost:3000/ , и появится следующий интерфейс, указывающий, что контейнер успешно запущен:
3. Как модифицировать приложение в докере?
Если мы изменим приложение, нам нужно заново создать файл изображения (повторите процесс, описанный во втором разделе статьи), чтобы изменения вступили в силу . Следует отметить, что во избежание конфликтов портов работающий контейнер должен быть остановлен в первую очередь. Вот несколько команд для управления контейнерами:
docker ps 可以获取到容器的id
docker stop <the-container-id> 通过id停止一个容器
docker rm <the-container-id> 容器停止后,删除一个容器
docker rm -f <the-container-id> -f 即force,表示强制删除
4. Как поделиться созданным образом?
(1) Создайте удаленный склад
Если у вас нет Docker ID, вы можете зарегистрировать пользователя в Docker Hub, а затем использовать Docker Hub для создания удаленного репозитория. Шаги по созданию удалённого хранилища подробно описаны в официальном документе (адрес ссылки на документ в конце статьи), что примерно похоже на процесс создания git удалённого хранилища с последующим пушем кода.
(2) Отправьте образ на удаленный склад
После отправки образа на удаленный склад другие пользователи могут загрузить ваш образ.Часто используемые команды:
docker push YOUR-USER-NAME/getting-started:tagname // 推送镜像
docker tag getting-started YOUR-USER-NAME/getting-started //给镜像打标签
docker push YOUR-USER-NAME/getting-started // 拉取镜像
5. Как использовать имя тома для хранения данных в контейнере? // монтирование данных
При каждом запуске контейнера данные, обновленные предыдущим контейнером, будут очищаться. Это связано с тем, что у каждого контейнера есть свое «отдельное пространство» для создания/обновления/удаления файлов. Ни одно из этих изменений не будет видно в другом контейнере, даже если они используют тот же образ. // контейнеры изолированы друг от друга
Идея решить вышеуказанные проблемы: использовать тома для хранения данных.
Конкретный путь к файловой системе в контейнере можно подключить к хосту через тома . Если каталог в контейнере смонтирован, изменения в этом каталоге также будут видны на хосте. Если мы смонтируем тот же каталог при перезапуске контейнера, мы увидим те же файлы. // docker предоставляет два метода монтирования: монтирование данных и монтирование каталога
(1) Используйте команду docker volume create для создания тома , а todo-db — это имя тома.
docker volume create todo-db
(2) Используйте имя тома для монтирования , все изменения по пути /etc/todos будут синхронизированы с томом, и другие контейнеры, использующие тот же том, также могут видеть ту же информацию.
// По умолчанию приложение todo хранит свои данные в файле /etc/todos/todo.db в базе данных SQLite,
docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
Итак, когда мы создаем контейнерный том ( volume ), где файлы в контейнере хранятся на физической машине? Используйте команду docker volume inspect для просмотра подробной информации о контейнерных томах :
$ docker volume inspect todo-db
[
{
"CreatedAt": "2023-02-07T01:34:40Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
Точка монтирования — это точный путь ( сгенерированный автоматически ), где файл хранится на диске , однако на большинстве компьютеров этот путь требует root-доступа для доступа к этому каталогу с хоста. // Система Windows также является этим путем, этот путь не может быть напрямую доступен в системе win, поэтому это будет более проблематично
6. Другой метод монтажа: монтирование каталога
Крепление к каталогу: позволяет совместно использовать каталог из файловой системы хоста в контейнере. Ниже приведены различия между монтированием каталога и монтированием тома контейнера.
именованный том ( том ) | Bind mounts (монтирование каталогов) | |
место хранения хоста | Докер выберите | настроить |
пример привязки | тип = объем, src=my-volume,target=/usr/local/data |
тип = привязка, src=/path/to/data,target=/usr/local/data |
Заполните новый том содержимым контейнера | да | нет |
Драйвер тома поддержки | да | нет |
Пример: введите следующую команду (win) в каталог Getting-started/app. Обратите внимание, что вы используете PowerShell вместо черного окна, активируемого командой cmd . Если вы по-прежнему получаете сообщение об ошибке, вы можете использовать инструмент редактирования для редактирования следующую команду в одну строку
docker run -dp 3000:3000 `
-w /app --mount type=bind,src="$(pwd)",target=/app `
node:18-alpine `
sh -c "yarn install && yarn run dev"
- -dp 3000:3000 сопоставление портов
- -w /app устанавливает рабочий каталог или текущий каталог, в котором запускается команда
- --mount type=bind,src="$(pwd)",target=/app привязать текущий каталог хоста к каталогу /app в контейнере
- Программа Node:18-alpine должна полагаться на базовый образ для запуска (также написанный в вышеупомянутом DockerFile)
- sh -c "yarn install && yarn run dev" использует sh для запуска оболочки, использует yarn install для установки зависимых пакетов и использует yarn run dev для запуска службы (скрипт dev определяется в файлеget-started\app\package .json, который запустит nodemon)
nodemon — это инструмент, программа nodemon используется для автоматического перезапуска контейнера при изменении программы. Конечно, мы также можем использовать шаги, упомянутые во втором разделе, чтобы упаковать программу и перезапустить ее.
После запуска контейнера используйте следующую команду для просмотра журнала работы докера:
docker logs -f <container-id>
7. Реализовать взаимную связь между контейнерами
По умолчанию докеры независимы друг от друга и изолированы друг от друга, так как же заставить два изолированных контейнера общаться? // Например, докер, который развертывает приложение, взаимодействует с докером, который развертывает базу данных
Ответ таков: установить коммуникационную сеть между докерами, и разные контейнеры в одной коммуникационной сети смогут общаться друг с другом . Как правило, есть два способа поместить контейнер в сеть: 1. Назначить его при запуске контейнера, 2. Подключиться к сети существующего контейнера. Эти два метода будут использоваться отдельно ниже. // Случай каждой секции должен закрыть ранее запущенный контейнер, чтобы избежать конфликтов портов
(1) Создайте коммуникационную сеть
docker network create todo-app
(2) Запустите контейнер mysql и подключитесь к сети todo-app (версия Win PowerShell)
docker run -d `
--network todo-app --network-alias mysql `
-v todo-mysql-data:/var/lib/mysql `
-e MYSQL_ROOT_PASSWORD=secret `
-e MYSQL_DATABASE=todos `
mysql:8.0
- --network-alias указывает алиас запущенного контейнера, используйте алиас для замены конкретного ip, так удобнее искать контейнер в сети
- -v todo-mysql-data:/var/lib/mysql Эта команда автоматически создаст том-контейнер todo-mysql-data, а затем сохранит данные базы данных в mysql (/var/lib/mysql — это путь, по которому хранится база данных). данные)
Для того, чтобы проверить, запущен ли контейнер БД, можно попробовать войти в контейнер для проверки: // Пароль секретный, который указан в скрипте
docker ps // 查看正在运行中的容器
docker exec -it <mysql-container-id> mysql -u root -p
Если вы можете войти в систему, введя пароль, это означает, что база данных была запущена.Попробуйте следующую команду, чтобы убедиться, что mysql работает нормально
mysql> SHOW DATABASES;
mysql> exit;
Итак, когда запускается mysql, как найти этот контейнер? Ответ: используйте сетевой инструмент nicolaka/netshoot . Сначала мы устанавливаем этот инструмент через докер
docker run -it --network todo-app nicolaka/netshoot
После установки вы можете использовать этот инструмент DNS. //Mysql ниже — это псевдоним, указанный при запуске контейнера
dig mysql/容器id
Затем вы можете увидеть соответствующую сетевую информацию контейнера mysql:
Мы видим, что ip контейнера mysql — 172.19.0.2 ( адрес в сети todo-app ), вообще говоря, найти этот адрес мы можем только через алиас mysql, не указывая его явно.
(3) Запустите контейнер приложения и подключитесь к контейнеру mysql.
Приложение todo поддерживает настройку некоторых переменных среды для указания параметров подключения к MySQL.
- MYSQL_HOST — имя хоста сервера MySQL.
- MYSQL_USER - пользователь подключения к базе данных
- MYSQL_PASSWORD - пароль для подключения к базе данных
- MYSQL_DB - конкретная база данных mysql для подключения
Выполните следующую команду в каталоге Getting-started\app (версия PowerShell для Windows).
docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST=mysql `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB=todos `
node:18-alpine `
sh -c "yarn install && yarn run dev"
После успешного запуска вы можете просмотреть журнал запуска докера.
На этом этапе мы открываем программу http://localhost:3000/ для добавления элементов в проект, а затем входим в контейнер базы данных для просмотра только что добавленных данных.
docker exec -it <mysql-container-id> mysql -p todos //进入数据库容器
select * from todo_items; // 查看表中数据
До сих пор мы реализовали взаимную связь между двумя контейнерами.
8. Используйте Docker Compose, чтобы упростить операции совместного использования между несколькими контейнерами.
Docker Compose используется для определения и совместного использования приложений в нескольких контейнерах. С помощью Compose мы можем создать файл YAML для определения служб, и с помощью одной команды мы можем запускать или останавливать все службы.
(1) Установите Docker Compose
Если Docker Desktop установлен в среде win, Docker Compose уже установлен по умолчанию . Если он находится в среде Linux, его необходимо установить отдельно. Нажмите здесь, чтобы просмотреть руководство по установке . После установки вы можете проверить версию инструмента:
docker compose version
(2) Запись файла Compose
Создайте файл docker-compose.yml в каталоге Getting-started\app.
Затем заполните следующий контент в файле docker-compose.yml: // Для конкретной подготовки документа обратитесь к документу в конце статьи, здесь представлены только общие шаги
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
(3) Запускать контейнеры партиями
Выполните следующую команду в каталоге Getting-started\app, где -d означает запуск в фоновом режиме.
docker compose up -d
Затем вы увидите следующую выходную информацию:
Сообщение показывает, что и том контейнера, и коммуникационная сеть созданы, и по умолчанию Docker Compose автоматически создает сеть для стека приложений (поэтому нам не нужно определять сеть в файле Compose).
На данный момент все контейнеры успешно запущены.Если вы установили Docker Desktop, вы увидите следующий интерфейс:
(4) Закрывайте и удаляйте контейнеры партиями
Используйте следующие команды для пакетного закрытия и удаления контейнеров.
docker compose down
Следует отметить, что приведенная выше команда не удалит созданный том-контейнер, и вам нужно использовать отдельную команду для удаления тома-контейнера.
Справочная документация: Обзор | Документация по Docker