Docker: SRS支持x86/armv7/aarch64鏡像

最近我發(fā)現(xiàn)有個趨勢哈苍蔬,就是ARM server越來越多诱建,但是ARM好像不像x64平臺那么好識別,總是有各種各樣的arm識別不了碟绑。如果SRS能出ARM的docker鏡像俺猿,那會比較容易跑起來。

SRS已經(jīng)支持了多CPU架構(gòu)的docker鏡像格仲,如下圖所示:

下面是用法和技術(shù)背景押袍。

Usage

現(xiàn)在SRS支持了多個CPU架構(gòu),參考ossrs/srs

  • linux/amd64 這就是x86_64架構(gòu)凯肋,Intel的64位服務器谊惭,目前主要的Linux服務器都是這種類型,無論任何操作系統(tǒng)只要是這個芯片都可以用這個鏡像侮东。蘋果Mac Intel芯片也是可以用這個鏡像午笛。
  • linux/arm/v7 這是armv7也就是32位架構(gòu),比如RaspberryPI就是這種服務器苗桂,如果你要在PI上使用SRS,可以用這個鏡像告组。我沒有硬件驗證煤伟,所以歡迎大家測試反饋。
  • linux/arm64/v8 這就是armv8也就是64位架構(gòu),目前一般的ARM云服務器都是這種架構(gòu)便锨,無論任何操作系統(tǒng)都可以用這個鏡像围辙。蘋果Mac M1芯片,應該是可以用這個鏡像的放案,我沒有硬件所以歡迎大家測試反饋月而。

Note: 國內(nèi)可以用阿里云鏡像registry.cn-hangzhou.aliyuncs.com/ossrs/srs铐殃,注意沒有顯示多CPU架構(gòu),但也是支持的。

具體用法和之前是一樣的瞻坝,docker會根據(jù)機器的CPU架構(gòu),選擇合適的鏡像執(zhí)行催束。所以用法沒有變更澎现,舉一個簡單例子:

docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
    ossrs/srs:4 ./objs/srs -c conf/docker.conf

國內(nèi)可以用阿里云鏡像,比如:

docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
    registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 ./objs/srs -c conf/docker.conf

更多的例子可以參考Wiki:

下面是支持多CPU架構(gòu)的鏡像的其他背景押赊,若你需要修改代碼了自己打鏡像饺藤,或者需要支持其他CPU架構(gòu),可以參考下面的資料支持流礁。

Note: 除了SRS鏡像涕俗,SRS的開發(fā)鏡像中,CentOS 7Ubuntu 20支持了多CPU架構(gòu)神帅,注意CentOS不支持linux/arm/v7詳細請參考本文后面的詳細描述再姑。

Verify

如果需要驗證arm/v7架構(gòu),可以選擇RaspberryPI枕稀。目前云主機都是arm64/v8的架構(gòu)询刹。

實際上SRS可以支持多種CPU,比如x86_64萎坷、arm凹联、aarch64、mips哆档、loongarch等蔽挠,具體請參考ST:適配,但是要支持這些CPU的docker鏡像需要再單獨適配瓜浸。

可以選擇云主機驗證ARM的docker澳淑,騰訊云ARM阿里云ARM插佛,華為云鯤鵬杠巡,AWS ARM

執(zhí)行命令雇寇,查看機器的CPU架構(gòu):

# uname -p
aarch64

啟動docker氢拥,查看容器中的CPU架構(gòu):

docker run -it --rm ossrs/srs:ubuntu20 uname -p
aarch64

docker run -it --rm registry.cn-hangzhou.aliyuncs.com/ossrs/srs:ubuntu20 uname -p
aarch64

開發(fā)鏡像驗證完成蚌铜。我們驗證下SRS的鏡像,在一臺ARM云主機上嫩海,CPU架構(gòu)是aarch64也就是linux/arm64/v8冬殃,執(zhí)行命令:

docker run --rm -it registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v4 ldd objs/srs
    libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff97240000)
    libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff97200000)
    libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000ffff97010000)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff96f60000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff96f30000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff96db0000)
    /lib/ld-linux-aarch64.so.1 (0x0000ffff97c10000)

可以看到docker正確下載了aarch64架構(gòu)的鏡像,驗證完成叁怪。

SRS Image

若你需要自己打SRS的多CPU架構(gòu)鏡像审葬,可以詳細看這一節(jié)的內(nèi)容。

Note: 由于基礎(chǔ)開發(fā)鏡像ossrs/srs:ubuntu20支持多CPU架構(gòu)后奕谭,SRS鏡像的編譯就比較簡單涣觉,只需要從ossrs/srs:dev修改成ossrs/srs:ubuntu20,同時從CentOS切換到Ubuntu安裝命令要修改展箱;發(fā)布的鏡像旨枯,從CentOS改成Ubuntu,詳細修改請參考Commit:xxxx

操作起來很簡單混驰,可以調(diào)用命令打包就行:

docker buildx create --name mybuilder --driver docker-container
docker buildx use mybuilder

cd ~/git/srs
docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \
  --output "type=image,push=true" --progress plain --build-arg JOBS=10 \
  --tag your-repository/ossrs/srs:4 -f trunk/Dockerfile .

Note: 記得修改--tag為你的倉庫的鏡像就可以攀隔。

Multiple CPU Image

之前SRS的docker實際上只支持了x86_64架構(gòu),所以在ARM和其他CPU上是沒法跑的栖榨,參考SRS昆汹。其實鏡像是可以支持多個架構(gòu)的,參考手動打多CPU架構(gòu)鏡像婴栽。

為了了解docker的多CPU架構(gòu)鏡像满粗,我們先嘗試一個簡單的鏡像,沒有任何依賴愚争。

首先映皆,新建一個Dockerfile,它的FROM是帶ARCH前綴:

ARG ARCH
FROM ${ARCH}debian:buster-slim

RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*

ENTRYPOINT [ "curl" ]

若在Mac下轰枝,需要創(chuàng)建一個builder捅彻,例如:

docker buildx create --name mybuilder --driver docker-container
docker buildx use mybuilder

然后,使用docker buildx編譯鏡像:

docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \
  -t ossrs/srs:multiarch-example .

若需要上傳到其他registry比如阿里云鞍陨,可以再運行一次步淹,docker有緩存:

docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \
  -t registry.cn-hangzhou.aliyuncs.com/ossrs/srs:multiarch-example .

這樣就打包并上傳了一個多CPU架構(gòu)的鏡像:

# docker manifest inspect ossrs/srs:multiarch-example

{
   "manifests": [
      { "platform": { "architecture": "arm", "variant": "v7" }  },
      { "platform": { "architecture": "arm64", } },
      { "platform": { "architecture": "amd64", } }
   ]
}

可以在docker hub上看到這個鏡像,包含多個CPU架構(gòu)诚撵。

GitHub Actions

SRS是使用GitHub Actions自動打鏡像缭裆,并上傳到Docker和Aliyun的鏡像倉庫。

.github/workflows/release.yml中寿烟,需要加一個步驟澈驼,安裝buildx:

      # See https://github.com/crazy-max/ghaction-docker-buildx#moved-to-docker-organization
      # https://github.com/docker/setup-qemu-action
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      # https://github.com/docker/setup-buildx-action
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

Note: 注意最新的是用的qemu和官方docker的actions,很多文檔還是老的筛武。

Multiple Repositories

多CPU架構(gòu)的鏡像盅藻,不能使用一般的方式直接推送多倉庫购桑,需要使用一個獨立的action。

.github/workflows/release.yml中氏淑,需要加一個步驟,推送多個倉庫:

      - name: Login aliyun hub
        uses: docker/login-action@v1
        with:
          registry: registry.cn-hangzhou.aliyuncs.com
          username: "${{ secrets.ACR_USERNAME }}"
          password: "${{ secrets.ACR_PASSWORD }}"
      - name: Push to Aliyun registry
        uses: akhilerm/tag-push-action@v2.0.0
        with:
          src: ossrs/srs:${{ env.SRS_TAG }}
          dst: |
            registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_TAG }}

Note: 由于buildx涉及到了manifest硕噩,所以不能直接用docker tag和docker push假残。

ARG

參數(shù)ARCH只能在FROM中用,還可以根據(jù)目標平臺在FROM之后做判斷:

ARG ARCH
FROM ${ARCH}centos:7 as build

ARG BUILDPLATFORM
ARG TARGETPLATFORM
RUN echo "BUILDPLATFORM: $BUILDPLATFORM, TARGETPLATFORM: $TARGETPLATFORM"

Note: 注意ARCH在FROM之前申明炉擅,只能在FROM中使用辉懒。

Issues

CentOS7的鏡像,無法支持linux/arm/v7谍失,會出現(xiàn)錯誤:

ARG ARCH
FROM ${ARCH}centos:7

RUN yum install -y curl

ENTRYPOINT [ "curl" ]

執(zhí)行命令:

docker buildx build --platform linux/arm/v7 .

出現(xiàn)錯誤眶俩,并一直卡死:

[+] Building 29.0s (5/6) 
 => [2/2] RUN yum install -y curl                                                                                        25.7s
 => => # qemu: uncaught target signal 11 (Segmentation fault) - core dumped 

Note: 換成CentOS8也不支持armv7。

換成Ubuntu20就沒有問題:

ARG ARCH
# http://releases.ubuntu.com/focal/
FROM ${ARCH}ubuntu:focal

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y curl

ENTRYPOINT [ "curl" ]

三個平臺都能編譯:

docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64 .

所以SRS準備切換成Ubuntu20的基礎(chǔ)開發(fā)鏡像快鱼。

Debug Building SRT

編譯某個平臺比如linux/arm/v7的SRT颠印,先對代碼打包:

cd ~/git/srs
tar cf srs.tar trunk

然后修改trunk/Dockerfile,直接編譯SRT:

ARG ARCH
FROM ${ARCH}ossrs/srs:ubuntu20 AS build

ARG BUILDPLATFORM
ARG TARGETPLATFORM
RUN echo "BUILDPLATFORM: $BUILDPLATFORM, TARGETPLATFORM: $TARGETPLATFORM"

# https://serverfault.com/questions/949991/how-to-install-tzdata-on-a-ubuntu-docker-image
ENV DEBIAN_FRONTEND noninteractive

# Install depends tools.
RUN apt-get update && apt-get install -y gcc make g++ patch unzip perl git

ARG SRS_AUTO_PACKAGER

############ TEST
ADD srs.tar /srs
WORKDIR /srs/trunk/3rdparty/srt-1-fit
RUN apt-get install -y libssl-dev
RUN ./configure --disable-app  --enable-static --enable-c++11=0 --enable-shared=0
RUN echo "CMakeOutput.log" && cat /srs/trunk/3rdparty/srt-1-fit/CMakeFiles/CMakeOutput.log
RUN echo "CMakeError.log" && cat /srs/trunk/3rdparty/srt-1-fit/CMakeFiles/CMakeError.log
RUN exit 1

執(zhí)行命令:

docker buildx create --name mybuilder --driver docker-container
docker buildx use mybuilder
cd ~/git/srs && docker buildx build --platform linux/arm/v7 -f trunk/Dockerfile --progress=plain .

這樣相當于直接編譯SRT抹竹,調(diào)試周期很短线罕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窃判,隨后出現(xiàn)的幾起案子钞楼,更是在濱河造成了極大的恐慌,老刑警劉巖袄琳,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件询件,死亡現(xiàn)場離奇詭異,居然都是意外死亡唆樊,警方通過查閱死者的電腦和手機宛琅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗轩,“玉大人夯秃,你說我怎么就攤上這事×∫眨” “怎么了仓洼?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堤舒。 經(jīng)常有香客問我色建,道長,這世上最難降的妖魔是什么舌缤? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任箕戳,我火速辦了婚禮某残,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陵吸。我一直安慰自己玻墅,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布壮虫。 她就那樣靜靜地躺著澳厢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囚似。 梳的紋絲不亂的頭發(fā)上剩拢,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音饶唤,去河邊找鬼徐伐。 笑死,一個胖子當著我的面吹牛募狂,可吹牛的內(nèi)容都是我干的办素。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼熬尺,長吁一口氣:“原來是場噩夢啊……” “哼摸屠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粱哼,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤季二,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揭措,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胯舷,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年绊含,在試婚紗的時候發(fā)現(xiàn)自己被綠了桑嘶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡躬充,死狀恐怖逃顶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情充甚,我是刑警寧澤以政,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伴找,受9級特大地震影響盈蛮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜技矮,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一抖誉、第九天 我趴在偏房一處隱蔽的房頂上張望殊轴。 院中可真熱鬧,春花似錦袒炉、人聲如沸旁理。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韧拒。三九已至,卻和暖如春十性,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塑悼。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工劲适, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厢蒜。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓霞势,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斑鸦。 傳聞我的和親對象是個殘疾皇子愕贡,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容