从零开始:在阿里云上玩转Docker容器 – wiki基地

I apologize for the error. It seems I do not have the write_file tool available in this environment. I will provide the article content directly in this response.


从零开始:在阿里云上玩转Docker容器

引言

在当今的云计算时代,Docker 容器技术已经成为应用程序打包、分发和运行的标准。它提供了一个轻量级、可移植且自给自足的环境,确保应用程序在任何地方都能一致运行。而阿里云作为国内领先的云计算服务商,为 Docker 的部署和管理提供了坚实的基础设施支持。本文将带领您从零开始,在阿里云上搭建并使用 Docker 容器,让您的应用程序部署变得前所未有的简单和高效。

为什么选择 Docker?为什么选择阿里云?

Docker 的优势:
* 环境一致性: 解决了“在我的机器上可以运行”的问题,确保开发、测试和生产环境的一致性。
* 快速部署: 容器启动速度快,秒级部署,提高开发和运维效率。
* 资源隔离: 容器之间相互隔离,互不影响,提升系统稳定性。
* 轻量级: 与虚拟机相比,容器共享宿主机的操作系统内核,更加轻量级,启动更快,资源占用更少。
* 弹性伸缩: 结合编排工具(如 Docker Compose、Kubernetes),可轻松实现应用的弹性伸缩。

阿里云的优势:
* 稳定可靠: 提供高性能、高可用的云服务器 ECS 实例。
* 网络优化: 优化的网络环境,确保容器镜像的快速拉取和应用访问。
* 丰富服务: 除了 ECS,阿里云还提供容器镜像服务 ACR、容器服务 ACK(Kubernetes)等,形成完整的容器生态。
* 国内支持: 便捷的支付方式和本地化技术支持。

前提条件

在开始之前,您需要具备以下条件:
1. 一个已注册并完成实名认证的阿里云账号。
2. 基本的 Linux 命令行操作知识。

第一步:创建阿里云 ECS 实例

我们将以一个 Ubuntu 20.04 系统的 ECS 实例为例。

  1. 登录阿里云控制台:访问 阿里云官网 并登录您的账号。
  2. 进入 ECS 控制台:在控制台顶部搜索框输入“ECS”,选择“云服务器 ECS”。
  3. 创建实例:点击“创建实例”按钮。

    • 地域与可用区:根据您的业务需求和用户地理位置选择合适的地域和可用区。
    • 实例
      • 实例规格:对于初学者,选择一款入门级实例即可,如 ecs.t5-lc1m1.small (1核1G)。
      • 镜像:选择“公共镜像”,操作系统选择 Ubuntu 20.04 64位
    • 存储:保持默认配置或根据需求调整。
    • 网络和安全组
      • 专有网络 VPC:保持默认或选择已有 VPC。
      • 公网 IP:勾选“分配公网 IP”,方便后续从外部访问。
      • 安全组:创建一个新的安全组或选择现有安全组。确保开放以下端口:
        • 22 (SSH 远程连接)
        • 80 (HTTP 访问)
        • 443 (HTTPS 访问,如果需要)
        • 后续可能开放其他端口,例如 Docker 应用程序所使用的端口。
    • 系统配置
      • 登录凭证:选择“自定义密码”,设置一个复杂的密码。
      • 实例名称:例如 my-docker-ecs
    • 确认订单并创建
  4. 连接到 ECS 实例

    • 实例创建成功后,记录其“公网 IP 地址”。
    • 使用 SSH 客户端(如 PuTTY、Xshell 或 macOS/Linux 自带的终端)连接到您的 ECS 实例:
      bash
      ssh root@<您的公网IP地址>
    • 输入您之前设置的密码。

第二步:在 ECS 实例上安装 Docker Engine

连接成功后,我们开始安装 Docker。

  1. 更新系统软件包列表
    bash
    sudo apt update
    sudo apt upgrade -y

  2. 安装 Docker 依赖
    bash
    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

  3. 添加 Docker 官方 GPG 密钥
    bash
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

  4. 添加 Docker 仓库
    bash
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  5. 再次更新软件包列表并安装 Docker Engine
    bash
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io -y

  6. 验证 Docker 安装
    bash
    sudo docker run hello-world

    如果看到“Hello from Docker!”的输出,说明 Docker 已成功安装并运行。

  7. 配置 Docker 镜像加速器(可选,但强烈推荐)
    由于网络原因,从 Docker Hub 拉取镜像可能会很慢。阿里云提供免费的镜像加速服务。

    • 访问 阿里云容器镜像服务控制台
    • 复制加速器地址。
    • 在 ECS 实例上创建或编辑 Docker 配置文件 /etc/docker/daemon.json
      bash
      sudo vi /etc/docker/daemon.json

      将以下内容粘贴进去(替换 <您的加速器地址>):
      json
      {
      "registry-mirrors": ["<您的加速器地址>"]
      }
    • 保存并退出文件 (:wq 在 vi 中)。
    • 重启 Docker 服务以使配置生效:
      bash
      sudo systemctl daemon-reload
      sudo systemctl restart docker
  8. 将当前用户添加到 docker 用户组(可选,避免每次输入 sudo)
    bash
    sudo usermod -aG docker $USER
    # 退出当前 SSH 会话并重新连接,使权限生效
    exit

    重新连接后,您就可以直接使用 docker 命令而无需 sudo

第三步:基本的 Docker 命令操作

现在您已经拥有一个运行 Docker 的 ECS 实例,让我们来学习一些常用的 Docker 命令。

  • 拉取镜像:从 Docker Hub 下载镜像。
    bash
    docker pull nginx:latest
    docker pull ubuntu:20.04

  • 查看本地镜像
    bash
    docker images

  • 运行容器
    bash
    # 运行一个 Nginx 容器,并将容器的 80 端口映射到宿主机的 80 端口
    # -d 表示后台运行
    # -p 宿主机端口:容器端口
    # --name 给容器命名
    docker run -d -p 80:80 --name my-nginx nginx:latest

    现在,您可以在浏览器中访问您的 ECS 公网 IP 地址,应该能看到 Nginx 的欢迎页面。

  • 查看运行中的容器
    bash
    docker ps
    # 查看所有容器(包括已停止的)
    docker ps -a

  • 停止容器
    bash
    docker stop my-nginx

  • 启动容器
    bash
    docker start my-nginx

  • 重启容器
    bash
    docker restart my-nginx

  • 删除容器:容器停止后才能删除。
    bash
    docker rm my-nginx

  • 删除镜像:删除前确保没有容器正在使用该镜像。
    bash
    docker rmi nginx:latest

  • 查看容器日志
    bash
    docker logs my-nginx

  • 进入容器内部
    bash
    docker exec -it my-nginx /bin/bash
    # 在容器内部执行命令,例如查看文件
    ls /etc/nginx
    # 退出容器
    exit

第四步:部署一个简单的应用程序

我们将部署一个简单的 Flask Python Web 应用。

  1. 在 ECS 实例上创建项目目录
    bash
    mkdir my-flask-app
    cd my-flask-app

  2. 创建 app.py 文件
    bash
    vi app.py

    粘贴以下内容:
    “`python
    from flask import Flask
    app = Flask(name)

    @app.route(‘/’)
    def hello_world():
    return ‘Hello from Flask in Docker on Alibaba Cloud!’

    if name == ‘main‘:
    app.run(host=’0.0.0.0’, port=5000)
    “`

  3. 创建 requirements.txt 文件
    bash
    vi requirements.txt

    粘贴以下内容:
    flask

  4. 创建 Dockerfile:用于构建 Docker 镜像。
    bash
    vi Dockerfile

    粘贴以下内容:
    “`dockerfile
    # 使用官方 Python 3.8 瘦身版镜像作为基础镜像
    FROM python:3.8-slim-buster

    设置工作目录

    WORKDIR /app

    将当前目录下的所有文件拷贝到容器的 /app 目录

    COPY . /app

    安装 Python 依赖

    RUN pip install –no-cache-dir -r requirements.txt

    暴露容器的 5000 端口

    EXPOSE 5000

    定义容器启动时执行的命令

    CMD [“python”, “app.py”]
    “`

  5. 构建 Docker 镜像:在 my-flask-app 目录下执行。
    bash
    docker build -t my-flask-app:1.0 .

    -t 用于给镜像打标签,. 表示 Dockerfile 在当前目录。

  6. 运行容器
    bash
    # 将容器的 5000 端口映射到宿主机的 80 端口,方便通过 HTTP 访问
    docker run -d -p 80:5000 --name flask-web-app my-flask-app:1.0

  7. 验证应用程序
    在浏览器中访问您的 ECS 公网 IP 地址,您应该能看到“Hello from Flask in Docker on Alibaba Cloud!”。

第五步:使用 Docker Compose 管理多容器应用

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务。

我们将构建一个简单的 Web 应用,包含一个 Nginx 反向代理和我们刚刚创建的 Flask 应用。

  1. 安装 Docker Compose
    bash
    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    # 验证安装
    docker-compose --version

    (注意:此处安装的是 Docker Compose v1,如果您想安装 v2,步骤会有所不同,通常 v2 会作为 docker cli 的插件安装)

  2. 创建 docker-compose.yml 文件
    my-flask-app 目录的父目录中(或者您喜欢的任何一个新目录)创建一个新目录,例如 multi-app,然后进入该目录并创建 docker-compose.yml。将 my-flask-app 目录也移动到 multi-app 目录中。

    bash
    cd ..
    mkdir multi-app
    mv my-flask-app multi-app/
    cd multi-app

    然后创建 docker-compose.yml:
    bash
    vi docker-compose.yml

    粘贴以下内容:
    yaml
    version: '3.8'
    services:
    web:
    build: ./my-flask-app # 指向我们的 Flask 应用 Dockerfile 所在的目录
    ports:
    - "5000" # 容器内部端口,无需暴露到宿主机,因为 Nginx 会代理
    restart: always
    nginx:
    image: nginx:latest
    ports:
    - "80:80" # 将宿主机的 80 端口映射到 Nginx 容器的 80 端口
    volumes:
    - ./nginx.conf:/etc/nginx/conf.d/default.conf # 挂载 Nginx 配置文件
    depends_on:
    - web # 确保 web 服务在 Nginx 之前启动
    restart: always

  3. 创建 Nginx 配置文件 nginx.conf
    bash
    vi nginx.conf

    粘贴以下内容:
    “`nginx
    server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://web:5000; # 代理到 Flask 容器,容器名在 docker-compose.yml 中定义
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

    }
    “`

  4. 启动多容器应用
    multi-app 目录下执行:
    bash
    docker-compose up -d --build

    • -d:后台运行。
    • --build:如果 Dockerfile 或其依赖有变化,重新构建镜像。
  5. 查看服务状态
    bash
    docker-compose ps

  6. 验证应用程序
    再次访问您的 ECS 公网 IP 地址,您应该仍然能看到“Hello from Flask in Docker on Alibaba Cloud!”,但这次请求是通过 Nginx 反向代理转发到 Flask 容器的。

  7. 停止并删除应用
    bash
    docker-compose down

    这将停止并删除 docker-compose.yml 中定义的所有容器和网络。

第六步:阿里云容器服务简介 (进阶)

当您的应用规模变大、容器数量增多时,您会发现手动管理 Docker 容器变得困难。此时,阿里云的容器服务将大显身手。

  • 阿里云容器镜像服务 ACR (Alibaba Cloud Container Registry)
    • 提供安全、高性能的镜像存储和分发服务。您可以将自己构建的 Docker 镜像推送到 ACR,方便在不同环境和实例中统一管理和拉取。
  • 阿里云容器服务 ACK (Alibaba Cloud Container Service for Kubernetes)
    • 基于 Kubernetes 的托管式容器服务,能够自动化部署、扩展和管理容器化应用程序。它为您提供了强大的容器编排能力,实现高可用、弹性伸缩、灰度发布等复杂场景。

当您熟悉了 Docker 的基本操作后,强烈建议您进一步学习 ACR 和 ACK,将您的容器化之旅带入更高的层次。

总结

通过本文,您应该已经掌握了在阿里云 ECS 实例上从零开始搭建 Docker 环境、安装 Docker Engine、使用基本 Docker 命令、部署单个应用程序,以及利用 Docker Compose 管理多容器应用的能力。Docker 容器技术是现代云原生应用开发和部署的核心,结合阿里云强大的基础设施,将为您的业务带来前所未有的灵活性和效率。现在,您可以继续探索更多 Docker 的高级特性,并考虑将您的应用迁移到阿里云的容器服务 ACK 上,开启您的云原生之旅!

滚动至顶部