About

Docker 是一种开源平台,用于开发、交付和运行应用程序。它使用容器技术,允许将应用程序及其依赖项打包成一个可移植的容器,然后在任何支持 Docker 的环境中运行。Docker 容器是轻量级的、可移植的、自包含的运行时环境,它包含应用程序和其依赖的所有内容,从而确保应用程序在不同的环境中能够一致地运行。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个简单的 docker-compose.yml 文件,您可以定义应用程序的服务、网络和卷等配置,然后使用 docker-compose 命令启动整个应用程序。
Docker Compose 简化了多容器应用的管理,允许用户通过一组声明性配置来定义整个应用程序的架构,并通过单个命令进行启动、停止和管理。

安装 Docker

1、安装前提软件包:

apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common

2、添加 GPG 密钥和存储库

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

3、安装

apt update
apt install -y docker-ce docker-ce-cli containerd.io

4、检查服务

systemctl list-unit-files --type=service --state=enabled
systemctl enable docker

systemctl status docker
systemctl start docker
docker --version

安装 Docker Compose

curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

部署容器化应用

1、编辑 docker-compose.yml 配置文件(示例)

version: '3'
services:
  web:
    image: nginx:latest
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: examplepassword
  app:
    image: mycustomapp:latest
    ports:
      - "8080:80"
    depends_on:
      - db

2、启动容器

docker-compose -f /path/to/your/docker-compose.yml up -d

3、检查容器运行状态

docker-compose ps

进阶

nftables

容器网络与 Host 网络是隔离的,因此容器与外部通信需要端口映射与转发支持,默认会自动配置 iptables ,但 Debian 11 默认防火墙换成了 nftables 。

sysctl net.ipv4.ip_forward

nano /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p
systemctl start docker
systemctl stop docker containerd
iptables-save > iptables-docker.conf
iptables-restore-translate -f iptable-docker.conf > docker.nft
nft flush ruleset
nft -f docker.nft
nft -s list ruleset > /etc/nftables-docker.conf
systemctl stop docker containerd

nano /etc/docker/daemon.json
{
    "iptables": false
}

nft flush ruleset

仅供参考:
nano /etc/nftables.conf

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                ct state invalid drop
                ct state { established, related } accept
                iif "lo" accept
                iif != "lo" ip daddr 127.0.0.0/8 drop
                iif != "lo" ip6 daddr ::1 drop
                ip protocol icmp accept
                ip6 nexthdr ipv6-icmp accept
                tcp dport { 80, 443 } accept
                tcp dport 22 accept
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
                jump DOCKER-USER
                jump DOCKER-ISOLATION-STAGE-1
                oifname "docker0" ct state established,related accept
                oifname "docker0" jump DOCKER
                iifname "docker0" oifname != "docker0" accept
                iifname "docker0" oifname "docker0" accept
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }

        chain DOCKER {
        }

        chain DOCKER-ISOLATION-STAGE-1 {
                iifname "docker0" oifname != "docker0" jump DOCKER-ISOLATION-STAGE-2
                return
        }

        chain DOCKER-ISOLATION-STAGE-2 {
                oifname "docker0" drop
                return
        }

        chain DOCKER-USER {
                return
        }
}

table ip nat {
        chain PREROUTING {
                type nat hook prerouting priority dstnat; policy accept;
                fib daddr type local jump DOCKER
        }

        chain INPUT {
                type nat hook input priority 100; policy accept;
        }

        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                oifname != "docker0" ip saddr 172.17.0.0/16 masquerade
        }

        chain OUTPUT {
                type nat hook output priority -100; policy accept;
                ip daddr != 127.0.0.0/8 fib daddr type local jump DOCKER
        }

        chain DOCKER {
                iifname "docker0" return
        }
}
nft -f /etc/nftables.conf
systemctl start docker