Небольшой справочник-шпаргалка по командам Docker

Краткий справочник по командам Docker для управления контейнерами и образами.

Приложение для примеров

Напишем небольшое приложение на Node.js, для примеров в следующих раздела. Оно будет состоять из файла сервера на express.js, файла package.json и Dockerfile. Все файлы находятся в папке api.

Код сервера:

import express from 'express';
import cors from 'cors';
const app = express();

app.use(cors());
app.use(express.json());

app.get('/', (req, res) => {
    res.json({response: 'ok'});
});

app.listen(3000, () => {
    console.log('listening for requests on port 3000!!!');
});

Код package.json

{
  "name": "docker-project",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "type": "module",
  "scripts": {
    "dev": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.19.2"
  }
}

Dockerfile

FROM node:22-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

Небольшой справочник-шпаргалка по командам Docker.

docker run busybox — запуск контейнера, если с флагом -it, то контейнер останется запущенным. Установится облегчённый образ Lunix — busybox. Если запустить с флагом -d, то контейнер запустится в фоновом режиме, и терминал останется доступным для команд, и внутрь контейнера мы не перейдём.

docker ps — список запущенных контейнеров. Если команду запускать с ключом -a, то она выведет все контейнеры.

docker images -список доступных образов

Команды внутри контейнера (в принципе мы внутри ОС Linux):

  • ls — список каталогов;
  • hostname — id контейнера;
  • hostname -i — IP-адрес контейнера;
  • exit — выход и остановка контейнера.

Загрузка родительского образа с репозитория:

docker pull node — загрузит и установит последнюю версию образа node из docker-hub.

Dockerfile

FROM node:22-alpine — родительский образ, на основе которого создаем.

WORKDIR /app — создать рабочую директорию и перейти в неё

COPY . . — скопировать все файлы из текущей директории в app

RUN npm install — установить зависимости из package.json

EXPOSE 3000 — открыть порт 3000

CMD ["npm", "run" dev"] — выполнить команду npm run dev

Управление образами

docker build -t server-app . — создать образ с тегом server-app из текущей директории.

docker image rm server-app — удалить образ server-app. У этой команды есть более короткий алиас: docker rmi server-app.

Удаление образа возможно, если только удалены все контейнеры, созданные на его основе

Управление контейнерами

docker run -d --name test -p 3001:3000 server-app — запуск контейнера из образа. Флаг -d — если нужен запуск в фоновом режиме. test — имя контейнера, пробрасываем порт 3001 локальной машины на 3000 контейнера. server-app — это имя образа, но основе которого собирается контейнер. Теперь к серверу можно достучаться по порту 3001 локальной машины.

docker stop test — остановка контейнера с именем test, также можно указать id контейнера.

docker kill test — жёсткая остановка контейнера. В случае с командой stop сначала завершаться все процессы в контейнере, и только потом он остановится. В случае же с kill контейнер останавливается сразу.

docker start test — запуск уже существующего контейнера с именем test.

docker rm test — удалить контейнер с именем test(также можно указать id). Удалить можно только остановленный контейнер, иначе будет ошибка. Если при удалении выкидывает ошибку, то можно добавить флаг -f, что вызовет жёсткое удаление.

Можно перечислить несколько контейнеров через пробел, тогда Docker удалит их все

docker system prune -a — сброс докера и полная очистка. Он удалит все контейнеры, все образы, очистит кэш.

Игнорирование файлов

Если ведётся разработка на локальной машине, то после установки зависимостей из package.json у нас появится папка node_modules. Копировать в контейнер её не нужно, так как там устанавливаются свои зависимости из командой RUN npm install в Dockerfile. Аналогично Git, в директории с Dockerfile создаем папку .dockerignore и прописываем каждую директорию (файл), которые копировать не нужно. В нашем примере пишем в .dockerignore строку node_modules.

Тома Docker

Тома позволяют нам прокидывать изменения локальных файлов в файлы контейнера во время разработки. Для того, чтобы сразу можно было увидеть результат изменений. Разберём тома на коде из примера выше. Но для этого нужно будет поменять код примеров.

В файле Dockerfile добавим установку nodemon в образ:

FROM node:22-alpine

RUN npm install -g nodemon

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

А в файле package.json запустим не просто процесс node, а процесс nodemon в режиме отслеживания изменения файлов (скрипт dev):

{
  "name": "docker-project",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "type": "module",
  "scripts": {
    "dev": "nodemon -L server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.19.2"
  }
}

Теперь при изменении файлов в контейнере, nodemon будет их автоматически отслеживать и пересобирать проект. Но этого не достаточно, нужно ещё прокинуть наши локальные папки к папкам в контейнере.

Соберём образ:

docker build -t server-app:v1.0 .

И вводим команду:

docker run --name test -p 3001:3000 --rm -v D:/Docker/api/:/app/ -v app/node_modules server-app:v1.0

В первом флаге -v мы указываем в какую локальную директорию мы сопоставляем с директорией контейнера, причем нужно указывать абсолютный путь. Сопоставление указывается через двоеточие.

Во втором флаге -v указываем директорию, которую нужно игнорировать. В данном случае, так как у нас на локальной машине нет папки node_modules, а в контейнере будет (мы запускаем RUN npm install), то нужно указать, что мы будем использовать модули контейнера.

Материал был полезен?

Web Developer Blog
Добавить комментарий

Нажимая на кнопку "Отправить", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности