【OS安装与使用】part7-ubuntu22.04LTS 的 docker 安装与使用(实例:MTransServer服务部署)

发布于:2025-06-01 ⋅ 阅读:(27) ⋅ 点赞:(0)


一、待解决问题

1.1 问题描述

近期使用一些github开源软件的功能时,需要用到docker,将安装过程与使用过程记录如下。

1.2 解决方法

(1)安装docker
(2)测试docker
(3)实例部署:MTranServer

二、方法详述

2.1 必要说明

2.1.1 docker的一些常见命令

更多常见命令看文末

# 查看docker服务运行状态
sudo systemctl status docker
# 重启docker服务
sudo systemctl restart docker
# 查看当前运行的容器
sudo docker ps
sudo docker ps -a
# 查看容器的资源占用情况
sudo docker stats
# 启动、关闭、重启特定容器
sudo docker start <your_container>
sudo docker stop <your_container>
sudo docker restart <your_container>

2.1.2 官方docker hub镜像库锁区解决

查看(7)配置国内docker镜像库(可选)

2.2 应用步骤

2.2.1 安装docker

首先在docker官网和csdn上找到相应的安装教程:
Install Docker Engine on Ubuntu
Ubuntu 22.04下Docker安装(最全指引)

结合两者,按照以下步骤开始安装:

(1)删除旧版本
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
(2)安装相关依赖
# Add Docker's GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
# 阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#更新源
sudo apt update
sudo apt-get update
(3)安装docker包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
(4)docker命令补全(可选)
sudo apt-get install bash-completion

sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh

source /etc/bash_completion.d/docker.sh

(5)如何删除docker(备用)
# Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
# Images, containers, volumes, or custom configuration files on your host aren't automatically removed. To delete all images, containers, and volumes:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# Remove source list and keyrings
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc
(6)安装docker desktop

用于可视化管理docker容器,和预装的docker engine不兼容,不好用

先去官方链接下载ubuntu amd64的deb安装包

在下载目录开始安装:

sudo dpkg -i docker-desktop-amd64.deb 

报错:

dpkg: 依赖关系问题使得 docker-desktop 的配置工作不能继续:
 docker-desktop 依赖于 qemu-system-x86 (>= 5.2.0);然而:
  未安装软件包 qemu-system-x86。
 docker-desktop 依赖于 pass;然而:
  未安装软件包 pass。
 docker-desktop 依赖于 uidmap;然而:
  未安装软件包 uidmap。

自动修复/下载没有的依赖包:

sudo apt --fix-broken install

再次docker-desktop安装,提示一堆,没有报错,不知道是否成功安装,先记录一下:

(正在读取数据库 ... 系统当前共安装有 233010 个文件和目录。)
准备解压 docker-desktop-amd64.deb  ...
正在解压 docker-desktop (4.41.2-191736) 并覆盖 (4.41.2-191736) ...
正在设置 docker-desktop (4.41.2-191736) ...
Enabling use of privileged ports by Docker Desktop
kubernetes.docker.internal already in /etc/hosts
Reloading systemd daemon for logged in users
Done reloading systemd daemon for logged in users
Skipping the installation of the AppArmor profile as this version of AppArmor does not seem to support the profile bundled with Docker Desktop.
正在处理用于 mailcap (3.70+nmu1ubuntu1) 的触发器 ...
正在处理用于 gnome-menus (3.36.0-1ubuntu3) 的触发器 ...
正在处理用于 desktop-file-utils (0.26-1ubuntu3) 的触发器 ...

ubuntu桌面左下角可以点击显示应用程序,并搜索docker desktop,将其添加到收藏栏。
在这里插入图片描述
打开后,没有界面如下:
在这里插入图片描述
无法查看到正在运行的docker容器,不好用,删除!!!

sudo dpkg -r docker-desktop
sudo dpkg -P docker-desktop
rm -rf ~/.docker
(7)配置国内docker镜像库(可选)

知乎链接:Docker/DockerHub 国内镜像源/加速列表
腾讯云链接:Docker/DockerHub 国内镜像源/加速列表(5月9日更新-长期维护)

此次采用的国内镜像:docker.xuanyuan.me

不想配置的话,还可以在这个页面上搜索相关的镜像直接下载。

[1] 配置Docker镜像加速

以下是具体配置命令,需在Linux终端中执行:

# 创建Docker配置目录
sudo mkdir -p /etc/docker

# 编辑Docker配置文件,添加镜像加速地址
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.xuanyuan.me"
    ]
}
EOF

# 修改文件权限
sudo chmod 777 /etc/docker/daemon.json

# 重启Docker服务以使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

[2] 配置效果验证

# 测试下载镜像速度
sudo docker pull redis
(8)可视化容器管理工具Portainer(可选)

这一步必须在(7)配置国内docker镜像库后方可进行

Portainer CE 是一款免费的开源产品,适合个人用户、小型团队和非商业用途。它提供了一个用户友好的 Web 界面,用于管理 Docker 容器、镜像、网络和卷,适合大多数 Docker 管理需求。它提供了一套全面的工具和功能,无需任何许可费用。

安装参考链接:https://cn.linux-console.net/?p=34561

sudo docker volume create portainer_data
sudo docker run -d -p 8000:8000 -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

安装结果:

Unable to find image 'portainer/portainer-ce:latest' locally
latest: Pulling from portainer/portainer-ce
c02951246260: Pull complete 
b7c5ecc05946: Pull complete 
04de093ad5ed: Pull complete 
a9ff7abff372: Pull complete 
e09df2601140: Pull complete 
54675ba571ac: Pull complete 
886c883b7538: Pull complete 
93b4ed907f92: Pull complete 
f126cb2940fd: Pull complete 
4f4fb700ef54: Pull complete 
Digest: sha256:ebead33595e425f88b1d02a74e4cc65a6d295e96c3643bb176dca7cb64bc36b0
Status: Downloaded newer image for portainer/portainer-ce:latest
0d5b8d39077ea427bf3a73292bd057533dca66575dc5cae01b15b04065cfd516

查看portainer启动情况:

sudo docker ps

结果,正在运行:

CONTAINER ID   IMAGE                           COMMAND        CREATED              STATUS              PORTS                                                                                                NAMES
0d5b8d39077e   portainer/portainer-ce:latest   "/portainer"   About a minute ago   Up About a minute   0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, [::]:9443->9443/tcp, 9000/tcp   portainer

通过浏览器网址https://localhost:9443进入,提示风险,接受并进入:
在这里插入图片描述
首次登录时,可能会遇到这样的原因:

当您第一次安装Portainer时,如果您没有在5分钟内登录并完成初始设置,容器中的Portainer服务将停止。这是一种安全措施,用于防止恶意用户接管新的Portainer安装并自行配置它。为了避免发生这种情况,我们建议在第一次启动Portainer容器后的5分钟内完成初始设置。

关闭portainer容器,并重新启动,在5min内登录https://localhost:9443

sudo docker stop portainer
sudo docker start portainer

设置用户名和密码(这个密码要设置12位就很不人性化),然后登录,看到如下界面,可以很方便地管理容器的运行:
在这里插入图片描述

2.2.2 测试docker

#查看Docker版本
sudo docker version

结果:

Client: Docker Engine - Community
 Version:           28.1.1
 API version:       1.49
 Go version:        go1.23.8
 Git commit:        4eba377
 Built:             Fri Apr 18 09:52:10 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.1.1
  API version:      1.49 (minimum version 1.24)
  Go version:       go1.23.8
  Git commit:       01f442b
  Built:            Fri Apr 18 09:52:10 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
#查看Docker运行状态
sudo systemctl status docker

结果:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-05-25 10:57:20 CST; 2min 22s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 12774 (dockerd)
      Tasks: 20
     Memory: 23.1M
        CPU: 358ms
     CGroup: /system.slice/docker.service
             └─12774 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

运行一个测试实例

sudo docker run hello-world

结果:
应该是因为docker锁区了,无法执行这一步,主要原因应该是无法从docker的官方镜像库(docker hub)拉取hello-world镜像到本地。若执行了(7)配置国内docker镜像库应该可行。

2.2.3 实例部署:MTranServer

如果已经下载部署了镜像,并下载了对应的翻译模型,直接在 mtranserver 目录内打开命令行,然后直接跳转到下文的 (5) 启动服务

github链接:MTransServer

(1)准备
mkdir mtranserver
cd mtranserver
touch compose.yml
mkdir models
(2)编辑yml文件

用编辑器打开 compose.yml 文件,写入以下内容

  • 修改下面的 your_token 为你自己设置的一个密码,使用英文大小写和数字。自己内网可以不设置,如果是云服务器强烈建议设置一个密码,保护服务以免被扫到、攻击、滥用

  • 如果需要更改端口,修改 ports 的值,比如修改为 9999:8989 表示将服务端口映射到本机 9999 端口。

services:
  mtranserver:
    image: xxnuo/mtranserver:latest
    container_name: mtranserver
    restart: unless-stopped
    ports:
      - "8989:8989"
    volumes:
      - ./models:/app/models
    environment:
      - CORE_API_TOKEN=your_token
      - CORE_NUM_WORKERS=1
(3)下载应用镜像

国内镜像下载,然后加载镜像

docker load -i mtranserver.image.tar
1287fbecdfcc: Loading layer  77.84MB/77.84MB
af44017e7a4f: Loading layer  1.536kB/1.536kB
12a56f4f9f05: Loading layer  46.59MB/46.59MB
5f70bf18a086: Loading layer  1.024kB/1.024kB
6df063de812a: Loading layer  2.048kB/2.048kB
Loaded image: xxnuo/mtranserver:latest
(4)下载翻译模型

中国大陆模型镜像下载地址
下载了中译英英译中模型。
下载模型后,解压每个语言的压缩包到 models 文件夹内。
保证文件结构是这样:

compose.yml
models/
├── enzh
│   ├── lex.50.50.enzh.s2t.bin
│   ├── model.enzh.intgemm.alphas.bin
│   └── vocab.enzh.spm
(5)启动服务
sudo docker compose up
[+] Running 2/2
 ✔ Network mtranserver_default  Created                                    0.1s 
 ✔ Container mtranserver        Created                                    0.0s 
Attaching to mtranserver
mtranserver  | (2025-05-25 13:30:32) [INFO    ] Starting Translation Service
mtranserver  | (2025-05-25 13:30:32) [INFO    ] Service port: 8989
mtranserver  | (2025-05-25 13:30:32) [INFO    ] Worker threads: 1
mtranserver  | Successfully loaded model for language pair: zhen
mtranserver  | Successfully loaded model for language pair: enzh
mtranserver  | (2025-05-25 13:30:33) [INFO    ] Models loaded.
mtranserver  | (2025-05-25 13:30:33) [INFO    ] Max parallel translations: 16

然后按 Ctrl+C 停止服务运行,然后正式启动服务器

sudo docker compose up -d
[+] Running 1/1
 ✔ Container mtranserver  Started  

curl在命令行中尝试调用MtransServer,其中your_tokencompose.yml文件中设置的密钥。

curl -X POST "http://localhost:8989/translate" \
-H "Content-Type: application/json" \
-H "Authorization: your_token" \
-d '{
  "from": "en",
  "to": "zh",
  "text": "Hello, world!"
}'

结果:

{"result":"你好,世界!"}

python中调用测试代码:

import requests

# 设置 API URL 和令牌
url = "http://localhost:8989/translate"
headers = {
    "Content-Type": "application/json",
    "Authorization": "your_token"  # 替换为你的令牌
}
data = {
    "from": "en",
    "to": "zh",
    "text": "hello,WOrld ! "
}

# 发送 POST 请求
response = requests.post(url, json=data, headers=headers)

# 检查响应
if response.status_code == 200:
    result = response.json()
    print("翻译结果:", result.get("result"))
else:
    print("翻译失败,状态码:", response.status_code)
    print("错误信息:", response.text)

三、疑问

  1. docker的一些常用命令?
    参考链接:https://www.runoob.com/docker/docker-container-usage.html
命令 功能 示例
docker run 启动一个新的容器并运行命令 docker run -d ubuntu
docker ps 列出当前正在运行的容器 docker ps
docker ps -a 列出所有容器(包括已停止的容器) docker ps -a
docker build 使用 Dockerfile 构建镜像 docker build -t my-image .
docker images 列出本地存储的所有镜像 docker images
docker pull 从 Docker 仓库拉取镜像 docker pull ubuntu
docker push 将镜像推送到 Docker 仓库 docker push my-image
docker exec 在运行的容器中执行命令 docker exec -it container_name bash
docker stop 停止一个或多个容器 docker stop container_name
docker start 启动已停止的容器 docker start container_name
docker restart 重启一个容器 docker restart container_name
docker rm 删除一个或多个容器 docker rm container_name
docker rmi 删除一个或多个镜像 docker rmi my-image
docker logs 查看容器的日志 docker logs container_name
docker inspect 获取容器或镜像的详细信息 docker inspect container_name
docker exec -it 进入容器的交互式终端 docker exec -it container_name /bin/bash
docker network ls 列出所有 Docker 网络 docker network ls
docker volume ls 列出所有 Docker 卷 docker volume ls
docker-compose up 启动多容器应用(从 docker-compose.yml 文件) docker-compose up
docker-compose down 停止并删除由 docker-compose 启动的容器、网络等 docker-compose down
docker info 显示 Docker 系统的详细信息 docker info
docker version 显示 Docker 客户端和守护进程的版本信息 docker version
docker stats 显示容器的实时资源使用情况 docker stats
docker login 登录 Docker 仓库 docker login
docker logout 登出 Docker 仓库 docker logout
  • -d:后台运行容器,例如 docker run -d ubuntu
  • -it:以交互式终端运行容器,例如 docker exec -it container_name bash
  • -t:为镜像指定标签,例如 docker build -t my-image .
  1. MTransServer应用的什么翻译模型?

四、总结

  • docker将应用封装成镜像,搭建好环境后使得不同机器能够快速部署对应服务。
  • MTransServer能够离线翻译挺好用的,翻译的效果也还过的去,可以采用python进行大批量地进行翻译工作。