Tạo Linux Containers trong 500 dòng mã

tsudev· 06/10/2026

Giới thiệu về Linux Containers

Linux Containers là một công nghệ giúp tạo ra các môi trường ảo hóa trên hệ thống Linux. Công nghệ này cho phép tạo ra các container độc lập, mỗi container có thể chạy một hệ điều hành riêng biệt và các ứng dụng riêng biệt. Điều này giúp tăng cường bảo mật, hiệu suất và tính linh hoạt cho hệ thống.

Tạo Linux Containers

Để tạo ra một Linux Container, chúng ta cần sử dụng các công cụ như runc hoặc docker. Trong ví dụ này, chúng ta sẽ sử dụng runc để tạo ra một container đơn giản. Trước tiên, chúng ta cần tạo ra một tệp tin cấu hình cho container, bao gồm các thông tin như tên container, đường dẫn đến hệ điều hành và các tùy chọn khác.
bash
# Tạo tệp tin cấu hình cho container
cat > config.json <<EOF
{
  "ociVersion": "1.0.1",
  "process": {
    "terminal": true,
    "user": {
      "uid": 0,
      "gid": 0
    },
    "args": [
      "/bin/sh"
    ],
    "env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "cwd": "/",
    "capabilities": {
      "bounding": [
        "CAP_CHOWN",
        "CAP_DAC_OVERRIDE",
        "CAP_FOWNER",
        "CAP_FSETID",
        "CAP_KILL",
        "CAP_NET_BIND_SERVICE",
        "CAP_NET_RAW",
        "CAP_SETGID",
        "CAP_SETUID",
        "CAP_SETPCAP",
        "CAP_NET_ADMIN",
        "CAP_SYS_ADMIN"
      ],
      "effective": [
        "CAP_CHOWN",
        "CAP_DAC_OVERRIDE",
        "CAP_FOWNER",
        "CAP_FSETID",
        "CAP_KILL",
        "CAP_NET_BIND_SERVICE",
        "CAP_NET_RAW",
        "CAP_SETGID",
        "CAP_SETUID",
        "CAP_SETPCAP",
        "CAP_NET_ADMIN",
        "CAP_SYS_ADMIN"
      ],
      "inheritable": [
        "CAP_CHOWN",
        "CAP_DAC_OVERRIDE",
        "CAP_FOWNER",
        "CAP_FSETID",
        "CAP_KILL",
        "CAP_NET_BIND_SERVICE",
        "CAP_NET_RAW",
        "CAP_SETGID",
        "CAP_SETUID",
        "CAP_SETPCAP",
        "CAP_NET_ADMIN",
        "CAP_SYS_ADMIN"
      ],
      "permitted": [
        "CAP_CHOWN",
        "CAP_DAC_OVERRIDE",
        "CAP_FOWNER",
        "CAP_FSETID",
        "CAP_KILL",
        "CAP_NET_BIND_SERVICE",
        "CAP_NET_RAW",
        "CAP_SETGID",
        "CAP_SETUID",
        "CAP_SETPCAP",
        "CAP_NET_ADMIN",
        "CAP_SYS_ADMIN"
      ]
    },
    "rlimits": [
      {
        "type": "RLIMIT_CORE",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_CPU",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_DATA",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_FSIZE",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_MEMLOCK",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_NOFILE",
        "hard": 1024,
        "soft": 1024
      },
      {
        "type": "RLIMIT_NPROC",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_RTPRIO",
        "hard": 0,
        "soft": 0
      },
      {
        "type": "RLIMIT_STACK",
        "hard": 0,
        "soft": 0
      }
    ],
    "noNewPrivs": true
  },
  "root": {
    "path": "/",
    "readonly": true
  },
  "mounts": [
    {
      "destination": "/proc",
      "type": "proc",
      "source": "proc"
    },
    {
      "destination": "/sys",
      "type": "sysfs",
      "source": "sys"
    },
    {
      "destination": "/dev",
      "type": "tmpfs",
      "source": "tmpfs",
      "options": [
        "nosuid",
        "strictatime",
        "mode=755",
        "size=65536k"
      ]
    },
    {
      "destination": "/dev/pts",
      "type": "devpts",
      "source": "devpts",
      "options": [
        "nosuid",
        "noexec",
        "newinstance",
        "ptmxmode=0666",
        "mode=0620"
      ]
    },
    {
      "destination": "/dev/shm",
      "type": "tmpfs",
      "source": "tmpfs",
      "options": [
        "nosuid",
        "noexec",
        "nodev",
        "mode=1777",
        "size=65536k"
      ]
    },
    {
      "destination": "/dev/mqueue",
      "type": "mqueue",
      "source": "mqueue",
      "options": [
        "nosuid",
        "noexec",
        "nodev"
      ]
    },
    {
      "destination": "/sys/fs/cgroup",
      "type": "cgroup",
      "source": "cgroup",
      "options": [
        "nosuid",
        "noexec",
        "nodev",
        "relatime"
      ]
    }
  ],
  "hostname": "mycontainer",
  "network": {
    "namespaces": [
      "ipc",
      "mnt",
      "net",
      "pid",
      "user",
      "uts"
    ]
  }
}
EOF

Sau khi tạo tệp tin cấu hình, chúng ta có thể sử dụng runc để tạo ra container.

bash
# Tạo container
runc run mycontainer

Kết luận

Tạo Linux Containers trong 500 dòng mã là một công việc khá đơn giản. Với các công cụ như runc hoặc docker, chúng ta có thể tạo ra các môi trường ảo hóa trên hệ thống Linux một cách dễ dàng. Để tìm hiểu thêm về Linux Containers, bạn có thể tham khảo các nguồn tài liệu sau:
  • https://blog.lizzie.io/linux-containers-in-500-loc.html