# E020 安装命令与 Compose 示例

## 检查冲突包

干净系统可能报告旧包均未安装。若用 snap list 确认装了 Docker Snap，先运行 sudo snap remove docker。

```bash
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
```

## 添加 Docker 官方 apt 源

整段复制软件源定义，保留最后一行 EOF。这次 Docker 官方源可达。Ubuntu 基础源与这里添加的 Docker 源分别配置。

```bash
# 下载 Docker 的签名密钥
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 写入软件源（整段复制）
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
```

## 安装和验证

查看服务状态后按 q 回到命令行，再运行 hello-world。看到 Client 和 Server、active (running) 及 Hello from Docker! 后，可分别确认服务连接、运行状态和镜像执行。

```bash
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker version
docker compose version
sudo systemctl status docker
sudo docker run hello-world
```

## 将当前账号加入 docker 组

Docker 组具有相当于 root 的权限。只把可信账号加进去。运行后退出并重新登录，然后用 docker ps 验证。

```bash
sudo usermod -aG docker $USER
```

## 用 Compose 运行 Nginx

在虚拟机中运行 mkdir ~/hello-compose && cd ~/hello-compose，然后用 nano compose.yaml 保存下面的内容。运行后查看 docker compose ps 是否为 Up，HTTP 响应是否为 200 OK。发布的容器端口可能绕过 UFW 规则。

```yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
```

```bash
docker compose up -d
docker compose ps
curl -I http://localhost:8080
docker compose down
```
