「Asterisk on Docker」の版間の差分
細 Takatyan がページ「利用者:Takatyan/sandbox/Asterisk on Docker」を「Asterisk on Docker」に移動しました |
編集の要約なし |
||
| 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 | ||
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
で入れます。