Peta dunia

 

EN: Read in English

Dunia D4: Set Hidangan

Misi capstone 1: Bungkus

Anda akan belajar: bungkus Kedai Kancil supaya satu arahan hidupkannya di mana-mana mesin.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Docker Engine 29 pada 31 Okt 2026

Masalahnya

Misi 1: bungkus! Kedai Kancil dapat repo sendiri, kedai-kancil. Mula-mula, letak setiap fail dalam foldernya.

Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.

        Tengok

        <h1>Kedai Kancil</h1>
        FROM nginx:1.30-alpine
        COPY index.html /usr/share/nginx/html/
        Resepi web dibakar, jalan di tingkap 8080 dan hidangkan laman itu. Transkrip Docker: $ docker build -t web-check ./web [+] Building 0.1s (7/7) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 99B 0.0s => [internal] load metadata for docker.io/library/nginx:1.30-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/2] FROM docker.io/library/nginx:1.30-alpine@sha256:0e52bd054126cdc0 0.0s => => resolve docker.io/library/nginx:1.30-alpine@sha256:0e52bd054126cdc0 0.0s => [internal] load build context 0.0s => => transferring context: 114B 0.0s => [2/2] COPY index.html /usr/share/nginx/html/ 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:b3c874d08f54d4288d6e202ad09fed2c299a3a2d3 0.0s => => exporting config sha256:218b2f32af3a24770dbf4b630e3211e6ed645d1c2ed 0.0s => => exporting attestation manifest sha256:e863f2bf191f80c8a6d4c754d1893 0.0s => => exporting manifest list sha256:6a4cc4692137c3473c4d97518343d7e57258 0.0s => => naming to docker.io/library/web-check:latest 0.0s => => unpacking to docker.io/library/web-check:latest 0.0s $ docker run -d --name webcheck -p 8080:80 web-check cd9f5dce65a5cc9bc156b845b94be94cf80d7938c8932cbc5c0a7e0fbab85bff $ curl -s localhost:8080 <h1>Kedai Kancil</h1>

        Laptop anda~/kedai-kancil

        • Tiada tingkap terbuka

        Bekas (container)

        • Belum ada container

        Pek beku (image)

        • nginx:1.30-alpine8 layer · 93.5MB
        • node:24-alpine4 layer · 244MB
        • postgres:18-alpine9 layer · 433MB
        • redis:8-alpine7 layer · 162MB

        0 container (0 berjalan), 4 image, 0 loker.

        Atas: web/index.html. Bawah: web/Dockerfile. Dua baris: mula dari nginx, salin laman anda masuk.

        Tengok

        Kod API ada di bawah: api/server.js, kemudian api/package.json. Resepinya nanti tiada langkah npm ci. Kenapa tak apa?

        Pilih satu jawapan.

        const http = require('node:http');
        const port = process.env.PORT || 3000;
        http.createServer((req, res) => {
          res.setHeader('Content-Type', 'application/json');
          res.end(JSON.stringify({ ok: true, shop: 'Kedai Kancil' }));
        }).listen(port, () => console.log(`API listening on port ${port}`));
        {
          "name": "kedai-api",
          "version": "1.0.0",
          "private": true,
          "scripts": {
            "start": "node server.js",
            "test": "node --test"
          }
        }

        Tengok

        FROM node:24-alpine
        WORKDIR /app
        COPY package.json server.js ./
        USER node
        EXPOSE 3000
        CMD ["node", "server.js"]
        Resepi API dibakar, jalan di tingkap 3000 dan jawab dengan JSON. Transkrip Docker: $ docker build -t api-check ./api [+] Building 0.1s (8/8) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 149B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/3] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => [2/3] WORKDIR /app 0.0s => [internal] load build context 0.0s => => transferring context: 594B 0.0s => [3/3] COPY package.json server.js ./ 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:ecd8cebaf12324ae7edc5eebf8ea8b6f70dde0a63 0.0s => => exporting config sha256:0f4cd63b9dc293dd2a0b8d97cc8ff5be787071df20d 0.0s => => exporting attestation manifest sha256:ca7f87904d894124a997e273b44f6 0.0s => => exporting manifest list sha256:a2c9cac6336d5000d5d12a8390fcba85ef87 0.0s => => naming to docker.io/library/api-check:latest 0.0s => => unpacking to docker.io/library/api-check:latest 0.0s $ docker run -d --name apicheck -p 3000:3000 api-check dfc34f810c89519036a62b448ed4485431d26722c5bf416f378893000f0190f1 $ curl -s localhost:3000 {"ok":true,"shop":"Kedai Kancil"}

        Laptop anda~/kedai-kancil

        • Tiada tingkap terbuka

        Bekas (container)

        • Belum ada container

        Pek beku (image)

        • nginx:1.30-alpine8 layer · 93.5MB
        • node:24-alpine4 layer · 244MB
        • postgres:18-alpine9 layer · 433MB
        • redis:8-alpine7 layer · 162MB

        0 container (0 berjalan), 4 image, 0 loker.

        Ini api/Dockerfile. USER node jalankan API sebagai pengguna biasa, bukan root.

        Cuba

        Sekarang set hidangan. Tambah web, api dan db. Beri db loker db-data. Buat api tunggu sampai db sihat. Cache pilihan sahaja.

        Bina set makanan: tambah service, kemudian sambung talian telefon dan loker.

        Menu (tekan atau seret)

        Set makanan anda

        Kosong. Tekan hidangan pada menu, atau seret ke sini.

          compose.yaml 1 baris

          services: {}
          

          Cuba

          Sekarang buat betul-betul, langkah demi langkah. Tanda anda disimpan.

          Misi sebenar

          1. mkdir -p kedai-kancil/web kedai-kancil/api && cd kedai-kancil && git init
          2. docker compose config --quiet
          3. docker compose up -d --build
          4. docker compose ps
          5. curl localhost:8080
          6. git remote add origin https://github.com/YOUR-NAME/kedai-kancil.git
          7. git add . && git commit -m "Pack the shop" && git branch -M main && git push -u origin main
          8. docker compose down -v
          9. git clone https://github.com/YOUR-NAME/kedai-kancil.git fresh && cd fresh && docker compose up -d

          0 daripada 11 langkah siap · Tanda anda disimpan.

          Semak

          GitHub boleh sahkan sebahagiannya. Taip nama pengguna anda dan tekan Semak sekarang.

          Semak di GitHub

          Nama pengguna anda dihantar ke api.github.com sahaja.

          • Repo kedai-kancil anda awamBelum disemak
          • Ia ada compose.yamlBelum disemak
          • Ia ada web/DockerfileBelum disemak
          • Ia ada api/DockerfileBelum disemak

          Semak

          Selebihnya hanya anda boleh lihat. Tanda yang betul.

          Semak sendiri

          0 daripada 5 langkah siap · Tanda anda disimpan.

          Anda berjaya!

          Kini anda boleh bungkus seluruh aplikasi supaya satu arahan hidupkannya di mana-mana.

          Nak tahu lebih (pilihan)

          Di mana cerita ini tak tepat. Set hidangan sebenar datang atas satu dulang. Hidangan Compose ialah bekas berasingan. Mereka cuma kongsi talian telefon dan loker. Hidangan dimakan sekali; bekas boleh berhenti dan hidang semula. Compose juga masak di satu dapur sahaja. Banyak mesin perlukan medan selera: Bahagian 3.

          Misi 2 (Dunia C2) tambah talian hijau.