Docker image، یک کپی از Docker containers است که شامل برنامه Docker و همه پیش نیازها برای اجرای برنامه است. Container، یک نمونه لحظه‌ای از اجرا یک image است.

در این آموزش، شرح جزئیات Dockerfile، چگونگی ایجاد آن و نحوه ایجاد و اجرای یک Docker image با استفاده از Dockerfile بیان شده است.

 

 

Dockerfile چیست

Dockerfile، یک فایل متنی است که شامل تمام فرایندهایی است که یک کاربر می‌تواند بر روی خط فرمان اجرا کند؛ تا یک image ایجاد نماید. به عبارت دیگر، این فایل شامل تمام دستورالعمل‌های مورد نیاز Docker برای ساخت image است.

Docker imageها از مجموعه‌ای از لایه‌های سیستم فایل تشکیل شده‌اند و نشان دهنده دستورالعمل‌های Dockerfile هستند که به نرم افزار قابلیت اجرایی می‌بخشند.

فایل Docker به فرم زیر است:

# Comment
INSTRUCTION arguments

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه نمایش containerها درDocker

 

اگرچه دستورالعمل‌ها در Dockerfile، نسبت به حروف کوچک و بزرگ حساس نیستند؛ اما، مطابق استاندارد باید با حروف بزرگ استفاده شوند.

در زیر، لیستی از پرکاربردترین دستورالعمل‌های Dockerfile آمده است:

ARG: این دستورالعمل به شما امکان می‌دهد، متغیرهایی را تعریف کنید که می‌توانند در زمان ساخت منتقل شوند. شما همچنین می‌توانید، یک مقدار پیش فرض برای آن‌ها تنظیم نمایید.

FROM: نشان‌دهنده image پایه برای ایجاد یک image جدید است. این دستورالعمل، باید اولین دستورالعمل کامنت نشده در Dockerfile باشد. تنها استثناء از این قانون زمانی است که می‌خواهید از یک متغیر در آرگومان FROM استفاده کنید. در این حالت، FROM می‌تواند توسط یک یا چند دستورالعمل ARG استفاده شود.

LABEL: برای افزودن داده سراسری به یک image، مانند توضیحات، نسخه، نویسنده و غیره استفاده می‌شود. شما می‌توانید بیش از یک LABEL مشخص کنید که هر دستورالعمل LABEL دارای یک جفت مقدار یکتا و کلیدی است.

RUN: دستورات مشخص شده در این دستورالعمل، در طی مراحل ساخت اجرا می‌شوند. هر دستورالعمل RUN، یک لایه جدید در بالای image فعلی ایجاد می‌نماید.

ADD: برای کپی کردن فایل‌ها و دایرکتوری‌ها از منبع مشخص شده تا مقصد مشخص شده در docker image استفاده می‌شود. منبع می‌تواند فایل‌ها یا دایرکتوری‌های محلی یا یک URL باشد. اگر منبع یک فایل فشرده محلی باشد، به طور خودکار در docker image باز می‌شود.

COPY: مشابه ADD است؛ اما منبع می‌تواند تنها یک فایل یا دایرکتوری محلی باشد.

ENV: این دستورالعمل به شما امکان می‌دهد، یک متغیر محیطی تعریف کنید.

CMD: برای مشخص کردن دستوری استفاده می‌شود که هنگام اجرای یک container باید اجرا شود. شما می‌توانید تنها یک دستورالعمل CMD در Dockerfile خود استفاده نمایید.

ENTRYPOINT: مشابه CMD عمل می‌کند؛ بدین معنی که این دستورالعمل مشخص می‌کند که هنگام اجرای یک container چه دستوراتی اجرا خواهند شد.

WORKDIR: این دستورالعمل، دایرکتوری فعلی را برای دستورالعمل‌های RUN ،CMD ،ENTRYPOINT ،COPY و ADD تعیین می‌نماید.

USER: نام کاربری یا UID را برای استفاده هنگام اجرای دستورالعمل‌های RUN ،CMD ،ENTRYPOINT ،COPY و ADD تنظیم می‌کند.

VOLUME: به شما کمک می‌کند تا بتوانید یک دایرکتوری ماشین میزبان در container اضافه نمایید.

EXPOSE: برای مشخص کردن پورتی استفاده می‌شود که container در زمان اجرا شنود می‌کند.

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه اتصال به Docker Container

 

برای اضافه کردن فایل‌ها و دایرکتوری‌ها به image، یک فایل dockerignore. در دایرکتوری اصلی ایجاد نمایید. ساختار dockerignore. مشابه یکی از فایل‌های gitignore. در Git است.

به منظور یادگیری کامل دستورالعمل‌های Dockerfile، به صفحه مرجع رسمی Dockerfile مراجعه نمایید.

 

ایجاد یک Dockerfile

متداول‌ترین سناریو هنگام ایجاد Docker imageها این است که یک image موجود از یک رجیستری (معمولاً از Docker Hub) را بیرون آورده و تغییرات مورد نظر برای image پایه را تعیین نمایید. متداول‌ترین image پایه استفاده شده در زمان ایجاد Docker imageها Alpine است؛ زیرا برای اجرا در RAM، کوچک و بهینه شده است.

Docker Hub، سرویس رجیستری مبتنی بر ابر است که یکی از کاربردهای آن، نگهداری Docker imageها در یک مخزن عمومی یا خصوصی است.
در اینجا، یک Docker image برای سرور Redis ایجاد و از Ubuntu 18.04 به‌عنوان image پایه استفاده شده است.

در ادامه مراحل انجام این کار شرح داده شده است:

در ابتدای کار، یک دایرکتوری ایجاد کنید که شامل Dockerfile و تمام فایل‌های لازم باشد:

$ mkdir ~/redis_docker

 

سپس به آن دایرکتوری رفته و Dockerfile را به صورت زیر ایجاد نمایید:

$ cd ~/redis_docker
$ nano Dockerfile
                                      Dockerfile

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y redis-server && \
    apt-get clean

EXPOSE 6379

CMD ["redis-server", "--protected-mode no"]

 

تعریف هر یک از سطرهای Dockerfile به شرح زیر است:

در خط اول، image پایه تعریف شده است.

دستورالعمل RUN که از خط سوم شروع می‌شود، فهرست apt را به‌روز می‌کند، بسته "redis-server" را نصب می‌نماید و حافظه نهان apt را پاک می‌کند. دستورات استفاده شده در این بخش، همان دستوراتی هستند که برای نصب redis روی سرور اوبونتو استفاده می‌نمایید.

دستورالعمل EXPOSE، پورتي را تعریف می‌کند كه سرور redi شنود می‌نماید.

در آخرین خط، از دستورالعمل CMD برای تنظیم دستور پیش فرضی که باید در زمان اجرای container اجرا شود، استفاده شده است.

 

فایل را ذخیره کرده و ویرایشگر را ببندید.

 

بیلد کردن image

مرحله بعدی، بیلد کردن image است. بدین منظور، باید دستور زیر را در دایرکتوری که Dockerfile در آن قرار دارد اجرا نمایید:

docker build -t linuxize/redis .

گزینه t-، نام image و بصورت اختیاری یک نام کاربری و برچسب را در قالب ‘username/imagename:tag’ مشخص می‌کند.

پس از اجرا، خروجی فرایند بیلد چیزی شبیه به این خواهد بود:

output:
Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM ubuntu:18.04
 ---> 7698f282e524
Step 2/4 : RUN apt-get update &&     apt-get install -y gosu redis-server &&     apt-get clean
 ---> Running in e80d4dd69263
...
Removing intermediate container e80d4dd69263
 ---> e19fb7653fca
Step 3/4 : EXPOSE 6379
 ---> Running in 8b2a45f457cc
Removing intermediate container 8b2a45f457cc
 ---> 13b92565c201
Step 4/4 : CMD ["redis-server", "--protected-mode no"]
 ---> Running in a67ec50c7048
Removing intermediate container a67ec50c7048
 ---> d8acc14d9b6b
Successfully built d8acc14d9b6b
Successfully tagged linuxize/redis:latest

 

این مطلب نیز ممکن است برای شما مفید باشد: رفع خطای "Permission Denied" پس از نصب Docker در اوبونتو

 

پس از اتمام فرآیند بیلد، image جدید در لیست imageها قرار می‌گیرد:

docker image ls
output:
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
linuxize/redis      latest              d8acc14d9b6b        4 minutes ago       100MB
ubuntu              18.04               7698f282e524        5 days ago          69.9MB

 

اجرای یک container

اکنون که image ایجاد شده است، شما می‌توانید با اجرای دستور زیر، یک container از آن اجرا نمایید:

docker run -d -p 6379:6379 --name redis linuxize/redis

در دستور بالا، گزینه d- به Docker می‌گوید که container را در حالت جداگانه اجرا کند؛ گزینه p 6379: 6379-، پورت 6379 را برای دستگاه میزبان تعیین می‌نماید؛ گزینه name redis-- نام container را مشخص می‌کند و گزینه linuxize/redis نیز نام image است که برای اجرای container استفاده می‌شود.

 

زمانی که container راه‌اندازی شد، از دستور زیر برای لیست تمام containerهای در حال اجرا استفاده نمایید:

docker container ls
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b7d424cd915        linuxize/redis:v0.0.1   "redis-server '--pro…"   5 minutes ago       Up 5 minutes        0.0.0.0:6379->6379/tcp   redis

به منظور تأیید درستی اجرای این مراحل، از دستور redis-cli برای اتصال به docker container استفاده نمایید:

redis-cli ping

پس از اجرای دستور بالا، باید پاسخ PONG دریافت شود.

 

 

 

منبع:

linuxize