---
title: 'Dockerfile: Полное руководство для начинающих и профессионалов | Zomro'
description: 'Понимание Dockerfile и умение его правильно использовать — это основа для эффективного использования Docker.'
image: 'https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/dalle-2024-07-08-210308-a-minimalist-rectangular-widescreen-infographic-in-pink-and-purple-colors-themed-around-dockerfile_-complete-guide-for-beginners-and-professionals_q50.jpg'
---

![opened image]()

  * [Zomro](https://zomro.com/rus/)
  * [FAQ](https://zomro.com/rus/blog/faq/)
  * Dockerfile: Полное руководство для начинающих и профессионалов 



# Dockerfile: Полное руководство для начинающих и профессионалов

08-07-2024

![Dockerfile: Полное руководство для начинающих и профессионалов - 1](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/dalle-2024-07-08-210308-a-minimalist-rectangular-widescreen-infographic-in-pink-and-purple-colors-themed-around-dockerfile_-complete-guide-for-beginners-and-professionals_q50.jpg)

**Docker** — это мощный инструмент для создания, развертывания и управления контейнерами, который стал стандартом де-факто в индустрии разработки программного обеспечения. Одним из ключевых элементов **Docker** является **Dockerfile** — текстовый файл, содержащий инструкции для создания образа **Docker**. Понимание Dockerfile и умение его правильно использовать — это основа для эффективного использования **Docker**.

**Что такое Dockerfile?**  


**Dockerfile** — это сценарий, который содержит набор команд и инструкций для создания **Docker-образа**. **Docker-образ** , в свою очередь, является неизменяемым шаблоном, который включает в себя все необходимое для запуска контейнера: операционную систему, библиотеки, зависимости и само приложение.

**Основные инструкции Dockerfile**  


Для начала рассмотрим основные инструкции, которые используются в **Dockerfile** :

**FROM:** Эта инструкция задает базовый образ, на основе которого будет создаваться новый образ. Например, **FROM ubuntu:20.04** указывает, что базовым образом будет **Ubuntu 20.04**.

**RUN:** Используется для выполнения команд в контейнере. Обычно используется для установки пакетов и выполнения других операций, необходимых для подготовки окружения.

**CMD:** Определяет команду, которая будет выполнена при запуске контейнера. В отличие от **RUN** , эта команда не выполняется при сборке образа, а только при запуске контейнера.

**ENTRYPOINT:** Позволяет задать команду, которая всегда будет выполняться при запуске контейнера. Может быть переопределена при запуске контейнера с помощью параметров командной строки.

**COPY и ADD** : Эти инструкции используются для копирования файлов и директорий из локальной файловой системы в файловую систему образа. **COPY** выполняет простое копирование, а **ADD** может дополнительно разархивировать файлы и скачивать их по **URL**.

**ENV:** Устанавливает переменные окружения внутри контейнера.

**EXPOSE:** Указывает, какие порты будут открыты в контейнере для внешнего доступа.

**VOLUME:** Создает точку монтирования для работы с постоянным хранилищем.

**WORKDIR:** Устанавливает рабочую директорию для всех последующих инструкций.

**Пример Dockerfile**

Рассмотрим простой пример **Dockerfile** для **Node.js** приложения:
    
    
    # Указываем базовый образ
    FROM node:14
    
    # Устанавливаем рабочую директорию
    WORKDIR /app
    
    # Копируем package.json и package-lock.json
    COPY package*.json ./
    
    # Устанавливаем зависимости
    RUN npm install
    
    # Копируем исходный код приложения
    COPY . .
    
    # Указываем порт
    EXPOSE 3000
    
    # Определяем команду для запуска приложения
    CMD ["npm", "start"]
    

![Dockerfile: Полное руководство для начинающих и профессионалов - 2](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/01_frpnJ5V_q50.jpg)

  
**Детальный разбор Dockerfile:**

**​​​​​​​**

**FROM node:14** — Указывает, что базовым образом будет официальное **Node.js** изображение версии **14**. Это означает, что в наш образ будут включены все необходимые для работы **Node.js** зависимости.

**WORKDIR /app** — Устанавливает рабочую директорию**/app,** куда будут копироваться файлы и выполняться команды.

**COPY package.json ./*** — Копирует файлы **package.json** и **package-lock.json** в рабочую директорию контейнера. Эти файлы содержат информацию о зависимостях приложения.

**RUN npm install** — Выполняет установку зависимостей, указанных в package.json.

**COPY . .** — Копирует все файлы и папки из текущей директории (где находится **Dockerfile**) в рабочую директорию контейнера.

**EXPOSE 3000** — Указывает, что контейнер будет прослушивать порт **3000**.

**CMD ["node", "app.js"]** — Определяет команду для запуска приложения. В данном случае это запуск файла **app.js** с помощью **Node.js**.

  


Создайте файл **app.js** с следующим содержимым, или используйте собственный:  
  
  

    
    
    // app.js
    
    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/', (req, res) => {
      res.send('Hello, World!');
    });
    
    app.listen(port, () => {
      console.log(`Server is running on http://localhost:${port}`);
    });

  
Создайте файл **package.json** с следующим содержимым:
    
    
    {
      "name": "my-node-app",
      "version": "1.0.0",
      "description": "A simple Node.js app with Express",
      "main": "app.js",
      "scripts": {
        "start": "node app.js"
      },
      "dependencies": {
        "express": "^4.17.1"
      }
    }

![Dockerfile: Полное руководство для начинающих и профессионалов - 3](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/011_q50.jpg)

**Использование Dockerfile**

Теперь, когда мы разобрали основные инструкции и рассмотрели пример **Dockerfile** , перейдем к практическому использованию. Для создания образа **Docker** и запуска контейнера необходимо выполнить несколько команд в терминале.

Убедитесь, что файлы **app.js** , **package.json** и **Dockerfile** находятся в одной директории. Затем создайте образ.

**Создание образа:**
    
    
    docker build -t my-node-app .

Здесь**-t my-node-app** задает имя образа, а**.** указывает, что **Dockerfile** находится в текущей директории.

![Dockerfile: Полное руководство для начинающих и профессионалов - 4](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/02_VwK1Dib_q50.jpg)

**Запуск контейнера:**
    
    
    docker run -p 3000:3000 my-node-app

Команда **docker run** запускает контейнер на основе созданного образа. Параметр **-p 3000:3000** указывает, что порт **3000** на хост-машине будет перенаправлен на порт **3000** в контейнере. Ваш сервер должен успешно запуститься, и вы сможете получить доступ к нему, открыв в браузере **http://localhost:3000**. Где увидите банальное приветствие**"Hello, World!"**.

![Dockerfile: Полное руководство для начинающих и профессионалов - 5](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/03_CRPsR7Y_q50.jpg)

![Dockerfile: Полное руководство для начинающих и профессионалов - 6](https://dx86q6oq7ry0e.cloudfront.net/uploads/blog/a48%40server-panel.net/2024/07/08/04_kxzdzml_q50.jpg)​​​​​​​

**Заключение**

**Dockerfile** — это мощный инструмент для автоматизации и стандартизации процесса создания **Docker-образов**. Понимание основных инструкций и принципов работы с **Dockerfile** позволяет разработчикам эффективно управлять окружениями и развертывать приложения в контейнерах. Важно помнить, что **Dockerfile** должен быть оптимизированным и содержать только необходимые команды для минимизации размера образа и повышения производительности контейнеров.

Похожие статьи

[Создание резервной копии из консоли через планировщик cron](https://zomro.com/rus/blog/faq/357-creating-a-backup-from-the-console-through-the-cron-scheduler) [Как посмотреть логи shutdown и restart в Windows Server](https://zomro.com/rus/blog/faq/258-kak-posmotret-logi-shutdown-i-restart-v-windows-server) [Как купить лицензию ISPmanager](https://zomro.com/rus/blog/faq/625-how-to-purchase-an-ispmanager-licence) [Как сбросить пароль root для MySQL или MariaDB в Rocky Linux 9: пошаговое руководство](https://zomro.com/rus/blog/faq/517-how-to-reset-mysql-or-mariadb-root-password-on-rocky-linux-9-step-by-step-guide) [Создание серверов Minecraft Java.](https://zomro.com/rus/blog/faq/325-creating-minecraft-java-servers)

[ Premium Cloud VPS от €7.95/мес ](/rus/premium-vps)
