Краткий справочник по командам 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), то нужно указать, что мы будем использовать модули контейнера.




