Skip to content

Docker 跨平台打包镜像

背景

想要在阿里云服务器上使用 docker 部署一个 memos,但服务器上的 docker 拉取不到镜像 neosmemo/memos:stable。于是想了个办法,在本地把镜像打包好,使用 scp 传到服务器上,使用这个打包的镜像来创建容器。

过程中遇到了点问题。我本地是 MacOS,服务器是 CentOS,两边的系统平台不同。根据报错信息,服务器是 linux/amd64/v4,本地是 linux/arm64。这样就需要在本地执行 docker build 的时候指定系统平台。

步骤

0. 清理相关的容器和镜像

每一次执行步骤之前,都要在服务器和本地清理一下相关的容器和镜像。

  • 列出容器
sh
$ docker container ls -a

CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
80a9f8001177   xt-memos:latest   "./entrypoint.sh ./m…"   16 minutes ago   Created                     0.0.0.0:7005->5230/tcp, :::7005->5230/tcp   memos
  • 删除容器

要先删除容器,因为镜像有正在运行的容器,镜像不让删。到时候还是得回头删容器。

sh
$ docker container rm 80a9f8001177

80a9f8001177
  • 列出镜像
sh
$ docker image ls

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
xt-memos     latest    663c2552fff5   40 minutes ago   63.7MB
  • 删除镜像
sh
$ docker image rm 663c2552fff5

Untagged: xt-memos:latest
Deleted: sha256:663c2552fff5fa80e151a61b5e143ae35c29922fc9afd72c6bceb48011558c74
Deleted: sha256:13f6c9410b18bbdb8665b802fb7acd7a4bf5529cc35ecd518f9c61783b23c02a
Deleted: sha256:97cb8832287a37ad1b4818281b027b1b01307541b27f216141553a2fff23f017
Deleted: sha256:18559ae1f46316329d83f1d368a4fec1fc20ba0001fd7060bd6dc244727c9bce
Deleted: sha256:ee9fb89000acda1ff24333402c448177640b12ebb8189239d79e334417a9e300
Deleted: sha256:c9c93934c8cfb728a819b42c5a7c633855bfdc283fdad7fcc362b090be157c78
Deleted: sha256:9c8c6ea33626e9d12ec7f1374e4f45dc31ddf8ed40b2a11c2566cd01d29ebc43
Deleted: sha256:89b59b1b7cb3f80a0c11656016099d1de77e8e2beed2a106ffda752615dfa3d8

本地在 MacOS 下有 GUI,所以直接使用 GUI 操作了。

1. 本地创建 Dockerfile

dockerfile
# 使用已有的基础镜像,指定平台为 linux/amd64
FROM --platform=linux/amd64 neosmemo/memos:stable

# 设置容器启动时的工作目录
WORKDIR /var/opt/memos

# 可选:你可以在这里定义任何额外的安装或配置命令
# 例如,如果需要安装其他依赖或调整配置文件

# 暴露端口
EXPOSE 5230

# 直接使用 memos 二进制文件作为启动命令
ENTRYPOINT ["/usr/local/memos/memos"]

2. 本地构建并打包镜像

2.1. 构建

sh
$ docker build  -t xt-memo .

[+] Building 3.2s (6/6) FINISHED                                                                                          docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                      0.0s
 => => transferring dockerfile: 451B                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                         0.0s
 => => transferring context: 2B                                                                                                           0.0s
 => [internal] load metadata for docker.io/neosmemo/memos:stable                                                                          3.1s
 => [1/2] FROM docker.io/neosmemo/memos:stable@sha256:f83b92889d4184710ee6ae8d9176c9f4c5d09a79e80c05c642b1b5adda29a385                    0.0s
 => => resolve docker.io/neosmemo/memos:stable@sha256:f83b92889d4184710ee6ae8d9176c9f4c5d09a79e80c05c642b1b5adda29a385                    0.0s
 => CACHED [2/2] WORKDIR /var/opt/memos                                                                                                   0.0s
 => exporting to image                                                                                                                    0.0s
 => => exporting layers                                                                                                                   0.0s
 => => writing image sha256:90f14766cb91e23831da273032d106d2250c4cb3433c165495970a4565ff2f4e                                              0.0s
 => => naming to docker.io/library/xt-memo                                                                                                0.0s

What's Next?
  View summary of image vulnerabilities and recommendations → docker scout quickview

2.1.2. 打包

sh
$ docker save -o xtmemos.tar xt-memo

3. 传到服务器上

sh
$ scp xtmemos.tar user@server_ip:/data/www/memos

xtmemos.tar     100%   61MB   4.7MB/s   00:1 ~15s

4. 服务器加载镜像

sh
$ docker load -i xtmemos.tar

docker load -i xtmemos.tar
89b59b1b7cb3: Loading layer [==================================================>]  8.461MB/8.461MB
5ed315c44b8f: Loading layer [==================================================>]   2.56kB/2.56kB
515e481f2dd5: Loading layer [==================================================>]  919.6kB/919.6kB
3aceb4e535ce: Loading layer [==================================================>]  54.99MB/54.99MB
f80458a3738c: Loading layer [==================================================>]  3.584kB/3.584kB
6f4629db2adc: Loading layer [==================================================>]   2.56kB/2.56kB
5f70bf18a086: Loading layer [==================================================>]  1.024kB/1.024kB
Loaded image: xt-memos:latest

可以看到已经成功加载镜像。

sh
$ docker image ls

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
xt-memo     latest    663c2552fff5   54 minutes ago   63.7MB

5. 服务器创建 docker-compose.yml

yml
services:
  memos:
    image: xt-memo
    container_name: memos
    volumes:
      - ./memos/:/var/opt/memos
    ports:
      - 7005:5230
sh
$ docker compose up

[+] Running 2/2
 Network memos_default  Created                                                                                                         0.1s
 Container memo         Created                                                                                                         0.0s
Attaching to memo
memo  | ---
memo  | Server profile
memo  | version: 0.23.1
memo  | data: /var/opt/memos
memo  | dsn: /var/opt/memos/memos_prod.db
memo  | addr:
memo  | port: 5230
memo  | mode: prod
memo  | driver: sqlite
memo  | ---
memo  | Version 0.23.1 has been started on port 5230
memo  | ---
memo  | See more in:
memo  | 👉Website: https://usememos.com
memo  | 👉GitHub: https://github.com/usememos/memos
memo  | ---
memo  |
memo  | ███╗   ███╗███████╗███╗   ███╗ ██████╗ ███████╗
memo  | ████╗ ████║██╔════╝████╗ ████║██╔═══██╗██╔════╝
memo  | ██╔████╔██║█████╗  ██╔████╔██║██║   ██║███████╗
memo  | ██║╚██╔╝██║██╔══╝  ██║╚██╔╝██║██║   ██║╚════██║
memo  | ██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║╚██████╔╝███████║
memo  | ╚═╝     ╚═╝╚══════╝╚═╝     ╚═╝ ╚═════╝ ╚══════╝

6. 修改 nginx 配置

txt
server {
  listen 80;
  server_name moment.thebestxt.cc;
  rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
    listen 443  ssl;
    
    ssl_certificate path/to/moment.thebestxt.cc.pem;
    ssl_certificate_key path/to/moment.thebestxt.cc.key;
    
    server_name moment.thebestxt.cc;

    location / {
        proxy_pass http://localhost:7005;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

最后更新于: