erlang的一次docker部署尝试

背景

最近需要在arm64和x86平台上,多个系统版本上部署,被环境问题折磨的焦头烂额。因为erlang本身是基于C语言的,基于不同的gcc环境编译的包不能很好的运行。docker用于解决开发生产环境一致性的问题,所有萌发用docker来解决erlang部署环境问题。

docker安装

## 1. 安装依赖
sudo apt-get install apt-transport-https  ca-certificates curl gnupg-agent software-properties-common

## 2. 
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

## 3. 增加仓库源
### X86架构
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

### Arm64架构
sudo add-apt-repository "deb [arch=arm64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

## 4. 更新源 
sudo apt-get update

## 5. 查看可用版本
apt-cache madison docker-ce

## 6. 安装指定版本docker
### ubuntu 20.04
sudo apt-get install docker-ce=5:20.10.24~3-0~ubuntu-focal  docker-ce-cli=5:20.10.24~3-0~ubuntu-focal  containerd.io

### ubuntu 18.04
sudo apt-get install docker-ce=5:19.03.12~3-0~ubuntu-bionic  docker-ce-cli=5:19.03.12~3-0~ubuntu-bionic  containerd.io

### ubuntu 16.04
sudo apt-get install docker-ce=5:19.03.12~3-0~ubuntu-xenial  docker-ce-cli=5:19.03.12~3-0~ubuntu-xenial  containerd.io

## 卸载 docker
sudo apt-get remove docker docker-engine docker.io containerd 

免sudo设置
sudo groupadd docker
sudo gpasswd -a <你的用户名> docker
newgrp docker

docker基础命令

## 获取镜像 erlang
docker pull erlang:20.3

## 查看所有镜像
docker images

## 创建docker容器
docker run -it -p 8124:8124 erlang:20.3 bash

## 退出容器
exit

## 查看容器列表
docker ps -a  或者 docker container ls

## 宿主到容器复制
docker cp /host/path  <containerId>:/file/path/within/container

## 容器到宿主复制
docker cp <containerId>:/file/path/within/container  /host/path

## 启动容器
docker start <containerId> 或者 docker container start <containerId>

## 停止容器
docker stop <containerId> 或者 docker container stop <containerId>

## 重启容器
docker restart <containerId> 或者 docker container restart <containerId>

## attach容器
docker attach <containerId>

## attach容器后退出
ctrl+p,ctrl+q

## 删除容器
docker rm -f <containerId>

## 容器内执行
docker exec -it [name] /bin/bash

## 导出镜像或者容器
docker save -o xxx.tar.gz ImageName

## 从文件加载镜像或容器
docker load < xxx.tar.gz
或者
docker load --input xxx.tar.gz

容器内运行erlang

  • 存在问题

    • 只使用docker容器内的环境,运行程序及数据都在宿主机器,因此需要容器和宿主机器进行目录映射;

    • erlang节点间通讯,除4369端口外,其他为动态端口,docker容器与宿主默认网络隔离,需要使用宿主网络

    • docker容器启动后关闭问题,需运行不停止的命令

  • docker run参数调整

## 名称参数,设置容器名称为erl_test
--name erl_test

## 网络参数,需共享宿主网络
--net=host

## 目录挂载
--mount type=bind,source=/host/path/erl/release,target=/container/path/erl/release

## 后台执行
-d

## 重启规则
--restart=always

docker 运行erlang

  • erlang服务说明
## 服务名称
erl_md

## 打包工具
rebar3

## 服务后台启动 无返回结果,随即命令结束
bin/erl_md start

## 后台服务停止
bin/erl_md stop

## 服务console模式启动
bin/erl_md console

## 服务console模式停止
Ctrl+c
  • 启动erlang容器
## erlang服务宿主目录  /root/erl_server/erl_md
## erlang服务容器目录 /erl_server/erl_md
## erlang服务名称 erl_test
## 镜像 erlang:20.3
docker run --name erl_test --restart=always --net=host --mount type=bind,source=/root/erl_server/erl_md,target=/erl_server/erl_md -itd erlang:20.3 /erl_server/erl_md/bin/erl_test console

  • 实现效果

    • 多个erlang节点可正常交互

    • erlang服务端口可正常访问

    • 可实现开机自启

posted @   敬code  阅读(609)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示