#まえがき
isoでインストールするといろいろ入ってるらしいですが、DockerHubから引っ張ってきたイメージはさらに絞られています。たとえば初期設定に便利なスクリプト"setup-alpine"とか"setup-ほにゃらら"系は全くありません。
(かと思えば、ifconfig や vi は入ってたりします)
dockerを動かすだけ and/or イメージをDIYするならubuntuでも贅肉ありありなのでAlpine Linuxでマシンを組みました。
・・・本当は512MBなVPSのリソースを無駄遣いできない、というビンボー事情です💦・・・
ちなみに、"setup-ほにゃらら"はシェルスクリプトみたいなものらしいです。ソースはここにあります。
#原典とか
#環境
最近のdockerな環境なら依存しないはず。
ちなみに現在は
Windows10 Education build 19042.928
PowerShell 5.1.19041.906
Docker Desktop for Windows version 20.10.5, build 55c4c88
特段、妙なアップデートはしてないはず。
#操作
##imageを引っ張ってきてコンテナを作る
###docker run
PS> docker run -d -it -name ali alpine /bin/ash
"ali" はコンテナ名です。ご自由につけてください。
/bin/ashは最初から入ってる唯一のshellです。/bin/shでも通じますが同じものが起動します。
###docker exec
中に入ります。
PS> docker exec -it ali /bin/ash
/ #
##初期設定
###rootパスワードの設定
初期値は"空”ですので、早めに設定しましょう。
# passwd root
Changing password for root
New password:***
Retype password:***
passwd: password for root changed by root
###ホスト名の設定
デフォルトではイメージIDになってます。
# hostname aliwww
"aliwww"がホスト名です。ご自由にどうぞ。
、、、といきたいところですが、「権限あらへん」エラーとなります。
現状、__docker run する時に"--hostname aliwww"とする__しか方法を知りません💦
ちなみに
# echo "aliwww" > /tmp/t
# hostname -F /tmp/t
も同じエラーとなります。また、"setup-hostname"のソースにあるとおりに
# echo "aliwww" > /etc/hostname
すれば、エラーにはなりませんが再起動すると元のイメージIDに書き戻ります。
これは”df”の結果が:
# df
Filesystem 1K-blocks Used Available Use% Mounted on
...
/dev/sdc 263174212 2923424 246812632 1% /etc/resolv.conf
/dev/sdc 263174212 2923424 246812632 1% /etc/hostname
/dev/sdc 263174212 2923424 246812632 1% /etc/hosts
...
となっているからだと思います(ということはDNSの設定もhostsの設定も一筋縄でいかない、ってことですね)。
###タイムゾーンの設定
残念ながら
https://wiki.alpinelinux.org/wiki/Setting_the_timezone
、、、と、__apk前提__ですので後述します。
###keymapの設定
省略。JISキーボードな環境がないので検証できないからです。
isoインストールなら setup-keymap というコマンドで設定できますのでここのソースを読むといいかも、です。
##基本的なパッケージのインストール
###apk使用開始前のおまじない
なにはともあれ。
# apk update
# apk upgrade
/etc/apk/repositoriesは最初から設定されてますから、よく紹介されている
# cat > /etc/apk/repositories << EOF
http://dl-cdn.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/main
http://dl-cdn.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/community
EOF
は__要らない__です。
###タイムゾーンの設定(再掲)
別にUTCでもいいけど。
# apk add tzdata
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtim
# cat "Asia/Tokyo" > /etc/timezone
# apk del tzdata
###OpenRCのインストールと設定
# apk add openrc
# sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf
# echo 'rc_provide="loopback net"' >> /etc/rc.conf
# sed -i 's/^#\(rc_logger="YES"\)$/\1/' /etc/rc.conf
# sed -i '/tty/d' /etc/inittab
# sed -i 's/hostname $opts/# hostname $opts/g' /etc/init.d/hostname
# sed -i 's/mount -t tmpfs/# mount -t tmpfs/g' /lib/rc/sh/init.sh
# sed -i 's/cgroup_add_service /# cgroup_add_service /g' /lib/rc/sh/openrc-run.sh
# rm -rf /var/cache/apk/
原典はここです。
https://github.com/neeravkumar/dockerfiles/blob/master/alpine-openrc/Dockerfile
これで rc-service でサービスを登録できるようになります。
###NTPの設定
# apk add openntpd
# vi /etc/ntpd.conf
...
近くのサーバを指すように修正
...
# rc-service openntpd start
###SSHdのインストールと起動
# apk add openssh
# rc-service sshd start
必要に応じて /etc/ssh/sshd_config などを設定してください。
###常用ユーザの設定
となると、rootでsshログインできないから、
# adduser boku
Changing password for boku
New password:***
Retype password:***
passwd: password for boku changed by root
"boku"はユーザー名です。ご自由にどうぞ。
###sudoのインストールと設定
rootになれないと困るから、
# apk add sudo
# visudo
...
boku ALL=(ALL) ALL を追記
...
##そのほか
##IP固定
決め打ちするときは__docker run する時に"--ip 192.168.0.2"__とします。
ちなみにDockerの仕様として、
・デフォルトのbridgeネットワークの時は--ipオプションは無視されます(つまり--networkオプションは必須です)。
・docker network createした時の--subnetオプションで指定した範囲にないとエラーになります。
##再起動***未解決***
# /sbin/reboot
# /sbin/poweroff
いずれも反応しません。な、なんと
# shutdown -r now
に至っては「そげなコマンドあらへん」となります。
WindowsなのでGUIで停止/再起動するさせてますが、結局はこれと同じかも。
PS> docker container stop ali
vmtoolsみたいに正規の方法でシャットダウンしてるとは思えない=電源ブチ切りと同じみたいで気持ちわるいかも💦
###ちょっと進展
# rc reboot
とか
# rc shutdown
かもしれない。