「Asterisk on Docker」の版間の差分

提供: VoIP-Info.jp
ナビゲーションに移動 検索に移動
Takatyan (トーク | 投稿記録)
編集の要約なし
Takatyan (トーク | 投稿記録)
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
[[Asterisk 22]]をDockerで動かそう!
[[Asterisk 22]]をDockerで動かそう!<br/>
Dockerとは、コンテナ仮想化のためのプラットフォームです。
Dockerとは、コンテナ仮想化のためのプラットフォームです。


7行目: 7行目:
Linuxで、x86_64のマシンで試しています。[[Opusコーデック]]がARM非対応のため、ARMは試しておりません。
Linuxで、x86_64のマシンで試しています。[[Opusコーデック]]がARM非対応のため、ARMは試しておりません。


==Dockerfile==
==イメージをビルドする==
次のDockerfileとdocker-entrypoint.shを用意します。
 
===Dockerfile===
このDockerfileは、[[Opusコーデック]]を使用しています。
このDockerfileは、[[Opusコーデック]]を使用しています。


44行目: 47行目:
COPY --from=build /usr/sbin/astcanary /usr/sbin/astdb2bdb /usr/sbin/astdb2sqlite3 /usr/sbin/asterisk /usr/sbin/astversion /usr/sbin/astgenkey /usr/sbin/autosupport /usr/sbin/
COPY --from=build /usr/sbin/astcanary /usr/sbin/astdb2bdb /usr/sbin/astdb2sqlite3 /usr/sbin/asterisk /usr/sbin/astversion /usr/sbin/astgenkey /usr/sbin/autosupport /usr/sbin/
COPY --from=build /usr/sbin/rasterisk /usr/sbin/safe_asterisk /usr/sbin/
COPY --from=build /usr/sbin/rasterisk /usr/sbin/safe_asterisk /usr/sbin/
COPY --from=build /var/lib/asterisk /var/lib/asterisk
COPY --from=build /var/lib/asterisk /var/lib/asterisk_orig
COPY --from=build /var/spool/asterisk /var/spool/asterisk_orig
COPY --from=build /libasterisk.tar.gz /libasterisk.tar.gz
COPY --from=build /libasterisk.tar.gz /libasterisk.tar.gz
RUN tar xf /libasterisk.tar.gz \
RUN tar xf /libasterisk.tar.gz \
52行目: 56行目:
  && rm -f core-sound-ja.tgz
  && rm -f core-sound-ja.tgz


ENTRYPOINT ["/usr/sbin/asterisk", "-f", "-C", "/etc/asterisk/asterisk.conf"]</nowiki>
ADD docker-entrypoint.sh /
RUN ["chmod", "755", "docker-entrypoint.sh"]
 
WORKDIR /
ENTRYPOINT ["./docker-entrypoint.sh"]</nowiki>
 
===docker-compose.sh===


==イメージをビルドする==
<nowiki>#!/usr/bin/sh
 
if [ -d "/var/spool/asterisk" ]; then
  # フォルダ構成だけでもコピー ファイルは上書きしない
  cp -r -n /var/spool/asterisk_orig/* /var/spool/asterisk
fi
if [ ! -e "/var/lib/asterisk/astdb.sqlite3" ]; then
  # astdb.sqlite3がないということは初回の起動またはマウントされてない
  if [ -d "/var/lib/asterisk" ]; then
    # フォルダはある。初回起動
    cp -r -n /var/lib/asterisk_orig/* /var/lib/asterisk
  else
    # フォルダもない。マウントされてない。リネームで対応
    mv /var/lib/asterisk_org /var/lib/asterisk
  fi
fi
 
exec /usr/sbin/asterisk -f</nowiki>
 
/var/lib/asteriskにastdb.sqlite3がなければ初回起動として、ファイルをコピーします。
 
===ビルド===
  docker build --build-arg asterisk_version=22.5.1 -t asterisk:22.5.1 .
  docker build --build-arg asterisk_version=22.5.1 -t asterisk:22.5.1 .


このイメージはビルドすると409MB程度となります。
このイメージはビルドすると409MB程度となります。


==イメージを起動する==
==イメージを起動する==
64行目: 96行目:
通常、Dockerでイメージを起動する場合、ネットワークはbridgeネットワークを用い、-pオプションでポートを指定しますが、Asteriskでbridgeネットワークを使用すると、UDPポートでの通信がうまく行かなかったため、--network hostを使い、直接Dockerホストのポートで待ち受けをさせます。
通常、Dockerでイメージを起動する場合、ネットワークはbridgeネットワークを用い、-pオプションでポートを指定しますが、Asteriskでbridgeネットワークを使用すると、UDPポートでの通信がうまく行かなかったため、--network hostを使い、直接Dockerホストのポートで待ち受けをさせます。


例えば、設定ファイルは'''./asterisk-conf'''、ログファイルは'''./asterisk-log'''に配置する場合、
例えば、設定ファイルは'''./asterisk-conf'''、ログファイルは'''./asterisk-log'''に配置、更に、astdb.sqlite3を含むastvarlibdir、録音ファイルや留守番電話のastspooldirをボリュームマウントする場合、次のように起動します。


  docker run -d --name asterisk --rm --network host -v $(pwd)/asterisk-conf:/etc/asterisk:ro -v $(pwd)/asterisk-log:/var/log/asterisk:rw asterisk:22.5.1
  docker run -d --name asterisk --rm --network host -v $(pwd)/asterisk-conf:/etc/asterisk:ro -v $(pwd)/asterisk-log:/var/log/asterisk:rw -v $(pwd)/asterisk-spool:/var/spool/asterisk:rw -v $(pwd)/asterisk-lib:/var/lib/asterisk:rw asterisk:22.5.1


特に問題なく動けばOKです。
特に問題なく動けばOKです。
72行目: 104行目:
==Asterisk CLIに入る==
==Asterisk CLIに入る==
  docker exec -it asterisk asterisk -vvvvcr
  docker exec -it asterisk asterisk -vvvvcr
で入れます。

2025年9月7日 (日) 12:40時点における最新版

Asterisk 22をDockerで動かそう!
Dockerとは、コンテナ仮想化のためのプラットフォームです。

Asteriskには公式のDockerイメージがないようです。 インターネットを探すと、有志が構築したイメージやDockerfileがありますが、古かったり、マルチステージビルドでなく最終イメージのサイズが大きかったりして、良さそうなものがなかったので、独自のDockerfileを作成しました。

Linuxで、x86_64のマシンで試しています。OpusコーデックがARM非対応のため、ARMは試しておりません。

イメージをビルドする

次のDockerfileとdocker-entrypoint.shを用意します。

Dockerfile

このDockerfileは、Opusコーデックを使用しています。

FROM debian:bookworm-slim AS base

RUN echo "APT::Install-Recommends 0;" >> /etc/apt/apt.conf.d/01norecommends \
 && echo "APT::Install-Suggests 0;" >> /etc/apt/apt.conf.d/01norecommends \
 && apt-get update -qq \
 && apt -y install readline-common uuid libxml2 libsqlite3-0 libssl3 net-tools dnsutils ca-certificates curl xmlstarlet \
 && apt-get autoremove -y \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists /var/cache/apt/archives

FROM base AS build
ARG asterisk_version=22.5.1
ENV TZ Asia/Tokyo
WORKDIR /build
RUN apt-get update \
 && apt -y install build-essential libedit-dev uuid-dev pkg-config libxml2-dev libsqlite3-dev sqlite3 libssl-dev net-tools dnsutils \
\
 && curl http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-${asterisk_version}.tar.gz | tar xfz - \
 && cd /build/asterisk-${asterisk_version} \
 && ./configure --with-jansson-bundled \
 && make menuselect.makeopts \
 && menuselect/menuselect --enable codec_opus --enable CORE-SOUNDS-EN-WAV --disable CORE-SOUNDS-EN-GSM menuselect.makeopts \
 && make -j$(nproc) \
 && make install \
 && apt-get autoremove -y \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists /var/cache/apt/archives \
 && cd / && tar cfz libasterisk.tar.gz usr/lib/libasteriskpj.* usr/lib/libasteriskssl.*

FROM base
RUN mkdir /usr/lib/asterisk
COPY --from=build /usr/lib/asterisk/modules /usr/lib/asterisk/modules
COPY --from=build /usr/sbin/astcanary /usr/sbin/astdb2bdb /usr/sbin/astdb2sqlite3 /usr/sbin/asterisk /usr/sbin/astversion /usr/sbin/astgenkey /usr/sbin/autosupport /usr/sbin/
COPY --from=build /usr/sbin/rasterisk /usr/sbin/safe_asterisk /usr/sbin/
COPY --from=build /var/lib/asterisk /var/lib/asterisk_orig
COPY --from=build /var/spool/asterisk /var/spool/asterisk_orig
COPY --from=build /libasterisk.tar.gz /libasterisk.tar.gz
RUN tar xf /libasterisk.tar.gz \
 && cd /var/lib/asterisk/sounds \
 && curl -o core-sound-ja.tgz -L https://github.com/takao-t/asterisk-sound-ja/raw/refs/heads/master/core-sound-ja.tgz \
 && tar xf core-sound-ja.tgz \
 && rm -f core-sound-ja.tgz

ADD docker-entrypoint.sh /
RUN ["chmod", "755", "docker-entrypoint.sh"]

WORKDIR /
ENTRYPOINT ["./docker-entrypoint.sh"]

docker-compose.sh

#!/usr/bin/sh

if [ -d "/var/spool/asterisk" ]; then
  # フォルダ構成だけでもコピー ファイルは上書きしない
  cp -r -n /var/spool/asterisk_orig/* /var/spool/asterisk
fi
if [ ! -e "/var/lib/asterisk/astdb.sqlite3" ]; then
  # astdb.sqlite3がないということは初回の起動またはマウントされてない
  if [ -d "/var/lib/asterisk" ]; then
    # フォルダはある。初回起動
    cp -r -n /var/lib/asterisk_orig/* /var/lib/asterisk
  else
    # フォルダもない。マウントされてない。リネームで対応
    mv /var/lib/asterisk_org /var/lib/asterisk
  fi
fi

exec /usr/sbin/asterisk -f

/var/lib/asteriskにastdb.sqlite3がなければ初回起動として、ファイルをコピーします。

ビルド

docker build --build-arg asterisk_version=22.5.1 -t asterisk:22.5.1 .

このイメージはビルドすると409MB程度となります。


イメージを起動する

設定ファイルは別途用意してください。

通常、Dockerでイメージを起動する場合、ネットワークはbridgeネットワークを用い、-pオプションでポートを指定しますが、Asteriskでbridgeネットワークを使用すると、UDPポートでの通信がうまく行かなかったため、--network hostを使い、直接Dockerホストのポートで待ち受けをさせます。

例えば、設定ファイルは./asterisk-conf、ログファイルは./asterisk-logに配置、更に、astdb.sqlite3を含むastvarlibdir、録音ファイルや留守番電話のastspooldirをボリュームマウントする場合、次のように起動します。

docker run -d --name asterisk --rm --network host -v $(pwd)/asterisk-conf:/etc/asterisk:ro -v $(pwd)/asterisk-log:/var/log/asterisk:rw -v $(pwd)/asterisk-spool:/var/spool/asterisk:rw -v $(pwd)/asterisk-lib:/var/lib/asterisk:rw asterisk:22.5.1

特に問題なく動けばOKです。

Asterisk CLIに入る

docker exec -it asterisk asterisk -vvvvcr

で入れます。