Docker部署(Linux)

441 阅读3分钟

1. 安装Docker

1.1 首先确保你的Linux系统上已经安装了Docker。如果还没有安装,可以使用以下命令来安装:

1.1.1对于Ubuntu系统:

# 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖工具
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=amd64 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
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker --version
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker


1.1.2对于CentOS系统:

# 卸载旧版本(如有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖工具
sudo yum install -y yum-utils
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 更新 yum 包索引
sudo yum makecache fast
# 安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io

如果安装Docker引擎失败可以更换使用阿里云或其他国内镜像源

# 首先备份现有的 repo 文件:
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 然后下载阿里云的 repo 文件:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 最后,清理缓存并重新生成 yum 缓存:
sudo yum clean all
sudo yum makecache
# 或者,为了加快这个过程,可以使用 fast 参数:
sudo yum makecache fast
# 尝试再次安装 Docker:
sudo yum install docker-ce docker-ce-cli containerd.io

如果依旧有部分包安装失败,可以考虑下载到本地按照顺序进行安装,你可以直接访问 Docker CE Stable - x86_64 页面找到你需要的 .rpm 文件。

实际操作建议:

  1. 优先安装基础依赖:首先确保安装了 containerd.io,因为它是 Docker 引擎的基础依赖之一。
  2. 安装 Docker CLI:接着安装 docker-ce-cli,这提供了 Docker 命令行工具。
  3. 安装 Docker 引擎:然后安装 docker-ce,即 Docker 引擎本身。
  4. 最后安装插件:最后安装任何插件,比如 docker-buildx-plugin

例如,你可以这样依次安装:

sudo yum install ./containerd.io-*.rpm
sudo yum install ./docker-ce-cli-*.rpm
sudo yum install ./docker-ce-*.rpm
sudo yum install ./docker-buildx-plugin-*.rpm

最后:

# 验证安装
sudo docker --version
# 启动Docker服务
sudo systemctl start docker
# 验证 Docker 服务状态
sudo systemctl status docker
# 设置开机自启
sudo systemctl enable docker

注意事项

  1. 内核版本

    • CentOS 7需要内核版本3.10或更高。
    • Ubuntu需要内核版本4.4或更高。
    • 使用uname -r检查内核版本。
  2. SELinux(CentOS)

    • 如果启用了SELinux,可能需要额外配置:

      sudo setenforce 0
      sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
      
  3. 防火墙(CentOS)

    • 如果启用了防火墙,需开放Docker相关端口:

      sudo firewall-cmd --permanent --add-port=2375/tcp
      sudo firewall-cmd --reload
      

1.2 在Linux系统中,可以通过多种方法来判断当前系统是Ubuntu还是CentOS。以下是两种常用的方法:

方法一:查看/etc/os-release文件

这个文件包含了操作系统的各种信息。

打开终端并输入以下命令:

cat /etc/os-release

你会看到类似如下的输出:

  • 对于Ubuntu系统,会显示类似于下面的信息:

    NAME="Ubuntu"
    VERSION="20.04.1 LTS (Focal Fossa)"
    ID=ubuntu
    ID_LIKE=debian
    ...
    
  • 对于CentOS系统,则会显示类似于下面的信息:

    NAME="CentOS Linux"
    VERSION="8 (Core)"
    ID="centos"
    ID_LIKE="rhel fedora"
    ...
    

方法二:使用lsb_release命令

该命令可以显示Linux标准基础(Linux Standard Base)和发行版的相关信息。

在终端输入以下命令:

lsb_release -a

这将输出关于您正在使用的Linux发行版的详细信息。例如,在Ubuntu上,你可能会看到如下输出:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal

而在CentOS上,输出可能看起来像这样:

LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 8.2.2004 (Core)
Release:    8.2.2004
Codename:   Core

这两种方法都可以帮助你快速识别当前使用的Linux发行版是Ubuntu还是CentOS。

2. 准备Dockerfile

每个API服务都需要一个Dockerfile来定义其构建过程。假设每个服务的目录结构如下:

/your-project/
├── ApiGateway/
│   ├── publish-files/  # 直接放在这里或直接放在ApiGateway目录下
│   └── Dockerfile
├── AuthCenter/
│   ├── publish-files/  # 或者直接放在AuthCenter目录下
│   └── Dockerfile
├── TransferPlatform.Api/
│   ├── publish-files/  # 或者直接放在TransferPlatform.Api目录下
│   └── Dockerfile
└── User.Api/
    ├── publish-files/  # 或者直接放在User.Api目录下
    └── Dockerfile
└── docker-compose.yml

如果不需要多服务统一管理,则不需要docker-compose.yml。

每个Dockerfile可能看起来像这样(示例):

# 使用官方.NET Core SDK镜像来构建应用
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build-env
WORKDIR /app

# 复制.csproj文件并恢复依赖项
COPY *.csproj ./
RUN dotnet restore

# 复制其余文件并发布应用
COPY . ./
RUN dotnet publish -c Release -o out

# 构建运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

# 暴露应用运行所需的端口(请根据实际情况替换80为你的应用端口)
EXPOSE 80

# 运行应用
ENTRYPOINT ["dotnet", "YourAppName.dll"]

如果API文件是发布后的文件,不需要在Docker中再进行编译步骤,可简化为:

# 使用官方 ASP.NET 运行时镜像作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:3.1

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到容器内的 /app 目录中
COPY . .

# 暴露应用监听的端口
EXPOSE 80

# 配置容器启动时执行的命令
ENTRYPOINT ["dotnet", "YourAppName.dll"]

请根据实际的服务名替换YourAppName.dll

3. 构建和运行容器(启动单个服务)

在每个服务的目录下执行以下命令来构建和运行容器:

# 构建Docker镜像
docker build -t yourimagename .

# 运行容器
docker run -d -p yourport:80 yourimagename

例如,对于ApiGateway服务:

cd ApiGateway
docker build -t apigateway .
docker run -d -p 5000:80 apigateway

4. 使用Docker Compose进行统一管理(启动多服务)

​ Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件 (docker-compose.yml),你可以配置应用程序的服务、网络和卷等,然后使用一条命令来启动所有服务。

​ 下面是如何使用 Docker Compose 来统一管理多个 API 服务(如 ApiGateway、AuthCenter、TransferPlatform.Api、User.Api)的步骤:

步骤 1: 安装 Docker Compose

​ 首先确保你的系统上已经安装了 Docker Compose。如果尚未安装,可以通过以下命令在 Linux 上安装 Docker Compose:

# 获取 Docker Compose 的最新版本号
LATEST_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')

# 下载 Docker Compose 的最新版本
sudo curl -L "https://github.com/docker/compose/releases/download/$LATEST_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装是否成功
docker-compose --version

​ 注意:如果出现 -bash: docker-compose: command not found 错误提示,表明系统无法找到 docker-compose 命令。这通常是因为 docker-compose 没有正确安装或其所在目录没有添加到系统的 PATH 环境变量中。

(1). 检查 Docker Compose 是否已正确安装

首先确认 /usr/local/bin/docker-compose 文件是否存在以及是否具有可执行权限:

ls -l /usr/local/bin/docker-compose

你应该能看到类似下面的输出(具体版本号可能不同):

-rwxr-xr-x 1 root root 65973280 Feb  6 15:48 /usr/local/bin/docker-compose

如果文件不存在,请按照正确的步骤重新下载并安装 Docker Compose。

(2). 重新执行安装命令

如果你发现文件不存在或者权限不对,可以按照上述方式重新执行安装命令:

(3). 确认环境变量配置

确保 /usr/local/bin 已经包含在你的 PATH 环境变量中。可以通过以下命令查看当前的 PATH 设置:

echo $PATH

你应该能在输出中看到 /usr/local/bin。如果没有,你需要将它添加到你的 PATH 中。可以在 ~/.bashrc~/.bash_profile(取决于你的 shell 配置文件)中添加如下行:

echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc

然后运行 source ~/.bashrcsource ~/.bash_profile 使更改生效。

(4). 再次验证 Docker Compose 安装

完成上述步骤后,再次尝试运行:

docker-compose --version

现在应该能够看到 Docker Compose 的版本信息,例如:

docker-compose version 2.20.2, build unknown

步骤 2: 创建 docker-compose.yml 文件

在你的项目根目录下创建一个名为 docker-compose.yml 的文件,并根据你的需求编写配置。这里有一个示例配置,适用于你提到的四个服务:

version: '3'
services:
  apigateway:
    image: apigateway
    build:
      context: ./ApiGateway
    ports:
      - "5000:80"
  authcenter:
    image: authcenter
    build:
      context: ./AuthCenter
    ports:
      - "5001:80"
  transferplatformapi:
    image: transferplatformapi
    build:
      context: ./TransferPlatform.Api
    ports:
      - "5002:80"
  userapi:
    image: userapi
    build:
      context: ./User.Api
    ports:
      - "5003:80"

在这个文件中:

  • image 指定了服务的镜像名称。
  • build.context 指定了 Dockerfile 所在的目录。
  • ports 列出了需要映射到主机的端口,格式为 "主机端口:容器端口"

步骤 3: 构建并运行服务

在包含 docker-compose.yml 文件的目录下执行以下命令来构建并启动所有服务:

docker-compose up -d

-d 参数表示以分离模式(后台运行)启动服务。

如果你想在启动之前先构建或重新构建镜像,可以使用:

docker-compose up --build -d

步骤 4: 管理服务

一旦服务启动后,你可以使用以下命令进行管理:

  • 查看正在运行的服务状态:

    docker-compose ps
    
  • 停止所有服务:

    docker-compose down
    
  • 停止并移除容器、网络、图像以及项目中的卷:

    docker-compose down --volumes
    
  • docker logs 命令查看日志:

    # 查看特定容器的所有日志
    docker logs <container_id_or_name>
    # 实时跟踪日志
    docker logs -f <container_id_or_name>
    # 显示时间戳
    docker logs --timestamps <container_id_or_name>
    # 查看最后几行日志
    docker logs -n 100 <container_id_or_name>
    
  • 使用 Docker Compose 查看日志:

    # 查看所有服务的日志
    docker-compose logs
    # 查看特定服务的日志
    docker-compose logs <service_name>
    # 同样地,你可以添加 -f 参数以实时跟踪日志:
    docker-compose logs -f <service_name>
    

也可以选择进入容器使用常规的 Linux 命令来查看日志文件,通过这些步骤,你可以方便地使用 Docker Compose 来管理和部署多个 Docker 容器应用,实现对多个API服务的统一管理。