NOTE
يفترض هذا الدليل أن لديك بالفعل [Docker Desktop](https://www.docker.com/products/docker-desktop/) مثبتًا.Docker هي منصة لتغليف وتشغيل التطبيق كـ حاوية خفيفة الوزن وقابلة للنقل تحتوي على جميع التبعيات اللازمة.
لـ حاوية تطبيقنا، نحدد Dockerfile. يحتوي هذا الملف على قائمة من التعليمات لتهيئة الحاوية ونسخ ملفات المشروع المحلية وتثبيت التبعيات وبدء التطبيق.
# استخدام صورة Bun الرسمية
# راجع جميع الإصدارات على https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 AS base
WORKDIR /usr/src/app
# تثبيت التبعيات في دليل مؤقت
# سيقوم هذا بتخزينها مؤقتًا وتسريع عمليات البناء المستقبلية
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile
# التثبيت مع --production (استبعاد devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production
# نسخ node_modules من الدليل المؤقت
# ثم نسخ جميع ملفات المشروع (غير المتجاهلة) إلى الصورة
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
# [اختياري] اختبارات وبناء
ENV NODE_ENV=production
RUN bun test
RUN bun run build
# نسخ تبعيات الإنتاج والكود المصدري إلى الصورة النهائية
FROM base AS release
COPY --from=install /temp/prod/node_modules node_modules
COPY --from=prerelease /usr/src/app/index.ts .
COPY --from=prerelease /usr/src/app/package.json .
# تشغيل التطبيق
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]الآن بعد أن أصبح لديك صورة docker، دعنا نلقي نظرة على .dockerignore التي لها نفس بناء جملة .gitignore. هنا تحتاج إلى تحديد الملفات/الأدلة التي يجب عدم تضمينها في أي مرحلة من بناء docker. مثال لملف التجاهل:
node_modules
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
Makefile
helm-charts
.env
.editorconfig
.idea
coverage*سنستخدم الآن docker build لتحويل Dockerfile هذا إلى صورة Docker، قالب مستقل يحتوي على جميع التبعيات والتكوين اللازم لتشغيل التطبيق.
العلم -t يسمح لنا بتحديد اسم للصورة، و --pull يخبر Docker بتنزيل أحدث إصدار من الصورة الأساسية (oven/bun) تلقائيًا. سيستغرق البناء الأولي وقتًا أطول، حيث سيقوم Docker بتنزيل جميع الصور الأساسية والتبعيات.
docker build --pull -t bun-hello-world .[+] Building 0.9s (21/21) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 35B 0.0s
=> [internal] load metadata for docker.io/oven/bun:1 0.8s
=> [auth] oven/bun:pull token for registry-1.docker.io 0.0s
=> [base 1/2] FROM docker.io/oven/bun:1@sha256:373265748d3cd3624cb3f3ee6004f45b1fc3edbd07a622aeeec17566d2756997 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 155B 0.0s
# ...lots of commands...
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:360663f7fdcd6f11e8e94761d5592e2e4dfc8d167f034f15cd5a863d5dc093c4 0.0s
=> => naming to docker.io/library/bun-hello-world 0.0sلقد بنينا صورة Docker جديدة. الآن دعنا نستخدم هذه الصورة لتشغيل حاوية فعلية.
سنستخدم docker run لبدء حاوية جديدة باستخدام صورة bun-hello-world. سيتم تشغيلها في وضع منفصل (-d) وسنقوم بتعيين منفذ الحاوية 3000 إلى منفذ جهازنا المحلي 3000 (-p 3000:3000).
يطبع أمر run سلسلة تمثل معرف الحاوية.
docker run -d -p 3000:3000 bun-hello-world7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dالحاوية الآن تعمل في الخلفية. قم بزيارة localhost:3000. يجب أن ترى رسالة Hello, World!.
لإيقاف الحاوية، سنستخدم docker stop <container-id>.
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dإذا لم تتمكن من العثور على معرف الحاوية، يمكنك استخدام docker ps لسرد جميع الحاويات قيد التشغيل.
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f03e212a15e bun-hello-world "bun run index.ts" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp flamboyant_cerfهذا كل شيء! راجع وثائق Docker للحصول على استخدام أكثر تقدمًا.