Вводное руководство по быстрому началу работы с Docker

Оглавление

1. Основная концепция докера

2. Как упаковать и запустить приложение?

3. Как модифицировать приложение в докере?

4. Как поделиться созданным образом?

5. Как использовать имя тома для хранения данных в контейнере? // монтирование данных

6. Другой метод монтажа: монтирование каталога

7. Реализовать взаимную связь между контейнерами

8. Используйте Docker Compose, чтобы упростить операции совместного использования между несколькими контейнерами.


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

Supongo que te gusta

Origin blog.csdn.net/swadian2008/article/details/125242638
Recomendado
Clasificación