Appearance
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;
}
}