docker compose离线部署mailcow邮件系统

前言

本文主要讲述因为网络环境限制(比如内网、开发环境等),无法直接下载docker镜像的情况下,如何部署mailcow。

正常环境下部署mailcow,请参考文章:mailcow基于容器化的开源邮件系统详细安装过程

准备工作

部署过程

镜像文件导出

在已经安装好mailcow环境查看mailcow项目涉及的镜像列表及版本信息:

[root@mail ~]# docker images
REPOSITORY          TAG               IMAGE ID       CREATED        SIZE
memcached           alpine            936dbfa3fd1a   11 days ago    15.7MB
mailcow/phpfpm      1.88              f9d025710983   12 days ago    301MB
mailcow/dovecot     1.30              2aca708281e0   12 days ago    251MB
mailcow/solr        1.8.3             a77fb6cd923e   12 days ago    454MB
mailcow/postfix     1.75              d13755c00185   13 days ago    335MB
mailcow/dockerapi   2.08              adc1446be9a4   2 weeks ago    166MB
mailcow/olefy       1.13              6572de3dccbb   2 weeks ago    112MB
mailcow/watchdog    2.03              c801c70f93a6   2 weeks ago    117MB
mailcow/acme        1.88              a97424882d9c   2 weeks ago    146MB
mailcow/netfilter   1.59              59b514e53b6d   2 weeks ago    110MB
mailcow/rspamd      1.96              f3ddc7d4a34a   2 weeks ago    184MB
nginx               mainline-alpine   099a2d701db1   2 weeks ago    43.2MB
mariadb             10.5              8d27db214bfa   4 weeks ago    394MB
mailcow/clamd       1.66              5b6dfc3668d8   4 weeks ago    78.8MB
mailcow/unbound     1.22              8ccf6655d8aa   4 weeks ago    27.7MB
mcuadros/ofelia     latest            05600fa3b007   6 weeks ago    23MB
redis               7-alpine          38a44d796822   6 weeks ago    40.7MB
mailcow/sogo        1.123             f41cfca2cd8b   4 months ago   336MB
robbertkl/ipv6nat   latest            b789d3355d66   2 years ago    18MB

导出镜像列表信息,保存到images.txt文件:

[root@mail ~]# docker images >images.txt

制作导出镜像文件的脚本docker-save.sh:

[root@mail ~]# cat images.txt|awk 'BEGIN{print "#!/bin/bash"} $1 != "REPOSITORY" {print "docker save "$3">"$3".tar"}' >docker-save.sh

docker-save.sh内容如下:

[root@localhost backup]# cat docker-save.sh 
#!/bin/bash
docker save 936dbfa3fd1a>936dbfa3fd1a.tar
docker save f9d025710983>f9d025710983.tar
docker save 2aca708281e0>2aca708281e0.tar
docker save a77fb6cd923e>a77fb6cd923e.tar
docker save d13755c00185>d13755c00185.tar
docker save adc1446be9a4>adc1446be9a4.tar
docker save 6572de3dccbb>6572de3dccbb.tar
docker save c801c70f93a6>c801c70f93a6.tar
docker save a97424882d9c>a97424882d9c.tar
docker save 59b514e53b6d>59b514e53b6d.tar
docker save f3ddc7d4a34a>f3ddc7d4a34a.tar
docker save 099a2d701db1>099a2d701db1.tar
docker save 8d27db214bfa>8d27db214bfa.tar
docker save 5b6dfc3668d8>5b6dfc3668d8.tar
docker save 8ccf6655d8aa>8ccf6655d8aa.tar
docker save 05600fa3b007>05600fa3b007.tar
docker save 38a44d796822>38a44d796822.tar
docker save f41cfca2cd8b>f41cfca2cd8b.tar
docker save b789d3355d66>b789d3355d66.tar

执行脚本,导出镜像文件保存到backup目录:

[root@mail backup]# sh docker-save.sh

导出的镜像列表如下:

[root@mail backup]# ll *.tar
-rw-r--r-- 1 root root  23987200  7月 10 14:23 05600fa3b007.tar
-rw-r--r-- 1 root root  45078528  7月 10 14:23 099a2d701db1.tar
-rw-r--r-- 1 root root 256755712  7月 10 14:22 2aca708281e0.tar
-rw-r--r-- 1 root root  41546752  7月 10 14:23 38a44d796822.tar
-rw-r--r-- 1 root root 115342336  7月 10 14:23 59b514e53b6d.tar
-rw-r--r-- 1 root root  79546880  7月 10 14:23 5b6dfc3668d8.tar
-rw-r--r-- 1 root root 115288064  7月 10 14:22 6572de3dccbb.tar
-rw-r--r-- 1 root root  28832768  7月 10 14:23 8ccf6655d8aa.tar
-rw-r--r-- 1 root root 400542720  7月 10 14:23 8d27db214bfa.tar
-rw-r--r-- 1 root root  16091648  7月 10 14:22 936dbfa3fd1a.tar
-rw-r--r-- 1 root root 460867584  7月 10 14:22 a77fb6cd923e.tar
-rw-r--r-- 1 root root 149100032  7月 10 14:23 a97424882d9c.tar
-rw-r--r-- 1 root root 171997184  7月 10 14:22 adc1446be9a4.tar
-rw-r--r-- 1 root root  18381824  7月 10 14:23 b789d3355d66.tar
-rw-r--r-- 1 root root 120186368  7月 10 14:23 c801c70f93a6.tar
-rw-r--r-- 1 root root 342357504  7月 10 14:22 d13755c00185.tar
-rw-r--r-- 1 root root 189327360  7月 10 14:23 f3ddc7d4a34a.tar
-rw-r--r-- 1 root root 345827328  7月 10 14:23 f41cfca2cd8b.tar
-rw-r--r-- 1 root root 306612224  7月 10 14:22 f9d025710983.tar

镜像和配置迁移

将导出的镜像文件、images.txt、mailcow-dockerized目录(该目录包含docker-compose.yml)拷贝到新服务器。

镜像导入并修改标签版本

根据导出的images.txt文件制作镜像导入和修改标签脚本docker-load.sh,命令如下:

[root@mail backup]# cat images.txt|awk 'BEGIN{print "#!/bin/bash"} $1 != "REPOSITORY" {print "docker load < "$3".tar"; print "docker tag "$3" "$1":"$2}' >docker-load.sh

docker-load.sh脚本内容如下:

#!/bin/bash
docker load < 936dbfa3fd1a.tar
docker tag 936dbfa3fd1a memcached:alpine
docker load < f9d025710983.tar
docker tag f9d025710983 mailcow/phpfpm:1.88
docker load < 2aca708281e0.tar
docker tag 2aca708281e0 mailcow/dovecot:1.30
docker load < a77fb6cd923e.tar
docker tag a77fb6cd923e mailcow/solr:1.8.3
docker load < d13755c00185.tar
docker tag d13755c00185 mailcow/postfix:1.75
docker load < adc1446be9a4.tar
docker tag adc1446be9a4 mailcow/dockerapi:2.08
docker load < 6572de3dccbb.tar
docker tag 6572de3dccbb mailcow/olefy:1.13
docker load < c801c70f93a6.tar
docker tag c801c70f93a6 mailcow/watchdog:2.03
docker load < a97424882d9c.tar
docker tag a97424882d9c mailcow/acme:1.88
docker load < 59b514e53b6d.tar
docker tag 59b514e53b6d mailcow/netfilter:1.59
docker load < f3ddc7d4a34a.tar
docker tag f3ddc7d4a34a mailcow/rspamd:1.96
docker load < 099a2d701db1.tar
docker tag 099a2d701db1 nginx:mainline-alpine
docker load < 8d27db214bfa.tar
docker tag 8d27db214bfa mariadb:10.5
docker load < 5b6dfc3668d8.tar
docker tag 5b6dfc3668d8 mailcow/clamd:1.66
docker load < 8ccf6655d8aa.tar
docker tag 8ccf6655d8aa mailcow/unbound:1.22
docker load < 05600fa3b007.tar
docker tag 05600fa3b007 mcuadros/ofelia:latest
docker load < 38a44d796822.tar
docker tag 38a44d796822 redis:7-alpine
docker load < f41cfca2cd8b.tar
docker tag f41cfca2cd8b mailcow/sogo:1.123
docker load < b789d3355d66.tar
docker tag b789d3355d66 robbertkl/ipv6nat:latest

执行docker-load.sh脚本,进行镜像导入并修改标签:

[root@localhost backup]# sh docker-load.sh 
94e5f06ff8e3: Loading layer [==================================================>]  8.083MB/8.083MB
8c41234f262b: Loading layer [==================================================>]  10.75kB/10.75kB
17358f769c7c: Loading layer [==================================================>]  285.2kB/285.2kB
c1416d4bd1aa: Loading layer [==================================================>]  7.684MB/7.684MB
....

导入完成后,查看镜像列表如下:

[root@localhost backup]# docker images 
REPOSITORY          TAG               IMAGE ID       CREATED        SIZE
memcached           alpine            936dbfa3fd1a   11 days ago    15.7MB
mailcow/phpfpm      1.88              f9d025710983   12 days ago    301MB
mailcow/dovecot     1.30              2aca708281e0   12 days ago    251MB
mailcow/solr        1.8.3             a77fb6cd923e   12 days ago    454MB
mailcow/postfix     1.75              d13755c00185   13 days ago    335MB
mailcow/dockerapi   2.08              adc1446be9a4   2 weeks ago    166MB
mailcow/olefy       1.13              6572de3dccbb   2 weeks ago    112MB
mailcow/watchdog    2.03              c801c70f93a6   2 weeks ago    117MB
mailcow/acme        1.88              a97424882d9c   2 weeks ago    146MB
mailcow/netfilter   1.59              59b514e53b6d   2 weeks ago    110MB
mailcow/rspamd      1.96              f3ddc7d4a34a   2 weeks ago    184MB
nginx               mainline-alpine   099a2d701db1   2 weeks ago    43.2MB
mariadb             10.5              8d27db214bfa   4 weeks ago    394MB
mailcow/clamd       1.66              5b6dfc3668d8   4 weeks ago    78.8MB
mailcow/unbound     1.22              8ccf6655d8aa   4 weeks ago    27.7MB
mcuadros/ofelia     latest            05600fa3b007   6 weeks ago    23MB
redis               7-alpine          38a44d796822   6 weeks ago    40.7MB
mailcow/sogo        1.123             f41cfca2cd8b   4 months ago   336MB
robbertkl/ipv6nat   latest            b789d3355d66   2 years ago    18MB

启动容器

通过如下命令启动容器:

[root@localhost ~]# cd mailcow-dockerized
[root@localhost mailcow-dockerized]# docker compose up -d

如果一切顺利,至此即完成mailcow部署。

但是,如果是一个纯内网环境,大概率会遇到dependency failed to start: container mailcowdockerized-unbound-mailcow-1 is unhealthy 问题:

[root@localhost mailcow-dockerized]# docker compose up -d
[+] Running 20/20
 ✔ Network mailcowdockerized_mailcow-network        Created                                                                                                    0.4s 
 ✔ Container mailcowdockerized-netfilter-mailcow-1  Started                                                                                                    0.3s 
 ✔ Container mailcowdockerized-dockerapi-mailcow-1  Started                                                                                                    0.9s 
 ✔ Container mailcowdockerized-memcached-mailcow-1  Started                                                                                                    0.7s 
 ✔ Container mailcowdockerized-olefy-mailcow-1      Started                                                                                                    0.7s 
 ✔ Container mailcowdockerized-sogo-mailcow-1       Started                                                                                                    0.8s 
 ✘ Container mailcowdockerized-unbound-mailcow-1    Error                                                                                                    135.1s 
 ✔ Container mailcowdockerized-redis-mailcow-1      Started                                                                                                    0.9s 
 ✔ Container mailcowdockerized-solr-mailcow-1       Started                                                                                                    0.9s 
 ✔ Container mailcowdockerized-mysql-mailcow-1      Started                                                                                                    1.0s 
 ✔ Container mailcowdockerized-clamd-mailcow-1      Created                                                                                                    0.0s 
 ✔ Container mailcowdockerized-php-fpm-mailcow-1    Started                                                                                                    1.2s 
 ✔ Container mailcowdockerized-dovecot-mailcow-1    Started                                                                                                    1.7s 
 ✔ Container mailcowdockerized-postfix-mailcow-1    Created                                                                                                    0.0s 
 ✔ Container mailcowdockerized-nginx-mailcow-1      Started                                                                                                    1.6s 
 ✔ Container mailcowdockerized-ofelia-mailcow-1     Started                                                                                                    2.0s 
 ✔ Container mailcowdockerized-rspamd-mailcow-1     Started                                                                                                    2.0s 
 ✔ Container mailcowdockerized-acme-mailcow-1       Created                                                                                                    0.0s 
 ✔ Container mailcowdockerized-watchdog-mailcow-1   Created                                                                                                    0.0s 
 ✔ Container mailcowdockerized-ipv6nat-mailcow-1    Created                                                                                                    0.0s 
dependency failed to start: container mailcowdockerized-unbound-mailcow-1 is unhealthy

这是由于mailcow/unbound启动了健康检查,健康检查的逻辑是检查“1.1.1.1” “8.8.8.8” “9.9.9.9”三个dns做ping情况,并且通过本机的dns检查”mailcow.email” “github.com” “hub.docker.com”这三个域名的解析情况,如果检查不通过这个容器状态就是unhealthy。

可以通过修改mailcow.conf中SKIP_UNBOUND_HEALTHCHECK=n的健康检查参数跳过健康检查:

SKIP_UNBOUND_HEALTHCHECK=y

或者进入该容器,修改检查脚本healthcheck.sh:

[root@localhost mailcow-dockerized]# docker ps | grep unbound
08b379f97337   mailcow/unbound:1.22     "/docker-entrypoint.…"   54 minutes ago   Up 54 minutes (healthy)   53/tcp, 53/udp                                                                                                                                                                                                                      mailcowdockerized-unbound-mailcow-1
[root@localhost mailcow-dockerized]# docker exec -it 08b379f97337 /bin/bash

将脚本中 exit 1全部修改为 exit 0,然后手动执行该脚本,等待容器状态变为healthy状态,进行执行docker compose up -d 启动命令即可。

参考来源:docker compose离线部署mailcow | MailABC邮件知识百科

<think>嗯,用户想了解如何使用Docker离线部署mailcow。首先,我需要回忆一下mailcow的基本要求和结构。mailcow是一个基于Docker的邮件服务器解决方案,包含多个容器,比如Postfix、Dovecot、MySQL等。离线部署的话,用户可能没有互联网连接,所以需要提前下载所有依赖的镜像和文件。 首先,我应该确定用户的环境需求,比如系统是否安装好了DockerDocker Compose。然后,考虑如何获取mailcow的代码库和所有Docker镜像。在离线环境中,用户需要预先在另一台有网络的机器上下载这些资源,然后传输到目标服务器。 接下来,可能需要指导用户如何导出和导入Docker镜像,因为这是离线部署的关键步骤。另外,mailcow的配置文件需要调整,特别是在没有网络的情况下,可能需要禁用自动更新和某些依赖网络的服务。 还要注意,mailcow的安装脚本可能会尝试在线下载资源,所以用户需要修改脚本或者在离线环境中手动配置。比如,mailcow的生成配置步骤需要用到一些变量,如主机名、IP地址等,这些在离线环境下需要正确设置。 另外,用户可能会遇到依赖问题,比如缺少某些工具或库,需要提前安装。例如,curl、git、openssl等工具在安装过程中可能会被用到,如果目标服务器没有这些,需要用户预先安装。 还有,防火墙和端口配置也是需要考虑的,确保SMTP、IMAP等端口开放,但用户的问题主要是离线部署步骤,这部分可能不需要详细展开,但需要提醒用户注意。 最后,测试部署后的mailcow是否正常运行,检查各个容器的状态,以及邮件服务是否可用。可能需要指导用户如何进行基本的诊断,比如查看日志文件,验证DNS记录等。 总结一下,步骤应该是:准备环境,下载资源和镜像,传输到目标服务器,导入镜像,配置mailcow,修改配置文件,启动容器,最后测试。需要详细说明每个步骤的具体操作,尤其是如何处理离线环境中的依赖和配置问题。</think>以下为使用Docker离线部署mailcow的详细步骤: --- ### 一、环境准备 1. **系统要求** - 操作系统:Debian 10+/Ubuntu 20.04+ - 内存:>= 8GB - 磁盘空间:>= 50GB - 已安装DockerDocker Compose - 需提前下载离线依赖包 2. **离线资源准备(在可联网设备操作)** ```bash # 下载mailcow官方仓库 git clone https://github.com/mailcow/mailcow-dockerized cd mailcow-dockerized # 导出Docker镜像列表 grep 'image:' docker-compose.yml | awk '{print $2}' > images.list # 下载所有镜像 while read img; do docker pull $img; done < images.list # 打包镜像为离线文件 docker save $(cat images.list) -o mailcow-images.tar # 打包mailcow代码及配置 tar czvf mailcow-offline.tar.gz ./mailcow-dockerized ``` --- ### 二、离线环境部署 1. **传输文件到目标服务器** ```bash scp mailcow-images.tar user@server:/opt/ scp mailcow-offline.tar.gz user@server:/opt/ ``` 2. **加载Docker镜像** ```bash docker load -i /opt/mailcow-images.tar ``` 3. **解压mailcow代码** ```bash tar xzvf /opt/mailcow-offline.tar.gz -C /opt/ cd /opt/mailcow-dockerized ``` --- ### 三、配置调整 1. **生成配置文件** ```bash # 禁用自动更新检查 sed -i 's/ENABLE_UPDATES_CHECKS=1/ENABLE_UPDATES_CHECKS=0/' mailcow.conf # 手动生成初始配置 echo "MAILCOW_HOSTNAME=mail.example.com" >> mailcow.conf echo "IPV4_NETWORK=172.22.1.0/24" >> mailcow.conf ``` 2. **关闭DNS检查(离线环境需要)** ```bash sed -i 's/SKIP_CLAMD=y/SKIP_CLAMD=y\nSKIP_DNS_CHECK=y/' mailcow.conf ``` --- ### 四、启动服务 1. **初始化数据库** ```bash docker compose up -d mysql sleep 120 # 等待数据库初始化 ``` 2. **启动全部服务** ```bash docker compose up -d ``` 3. **验证状态** ```bash docker compose ps # 所有容器应为running状态 ``` --- ### 五、后续配置 1. **访问管理界面** - 浏览器访问:https://mail.example.com - 默认登录:admin / moohoo 2. **重要配置项** - 域名设置:`Admin > Configuration > Mail Setup` - SSL证书:使用离线自签名证书或提前导入证书 - 禁用自动更新:`Admin > Configuration > System` --- ### 六、注意事项 1. **防火墙需开放端口**: - 25(SMTP), 143(IMAP), 465(SMTPS), 587(Submission) - 993(IMAPS), 443(HTTPS) 2. **离线DNS配置**: ```bash # 在/etc/hosts添加解析 127.0.0.1 mail.example.com ``` 3. **备份恢复**: ```bash # 定期备份数据卷 docker compose stop tar czvf /backup/mailcow-$(date +%F).tar.gz ./data ``` --- ### 常见问题处理 1. **容器启动失败**: ```bash docker logs -f mailcow-dockerized-sogo-1 # 查看具体容器日志 ``` 2. **数据库连接问题**: ```bash docker exec -it mailcow-dockerized-mysql-1 mysql -uroot -p$(grep MYSQL_ROOT_PASSWORD mailcow.conf | awk -F= '{print $2}') ``` > 以上步骤已适配mailcow v2023.07版本,实际操作时请根据具体网络环境和硬件配置调整参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值