Orange Pi 3 docker (CentOS)

前回のalpineに続いて学習用CentOSのコンテナを作成してみました。

CentOSではsystemdを使いたいので–privilegedオプションでコンテナを作成、sshからログインすることにしました。

CentOSは使い慣れていないOSでそれもdockerコンテナということもありlocaleの設定で躓いてしまいました。

CentOS

docker hubからpull run(–name centos-opi3 適当)

$ docker pull centos
$ docker container run --privileged -d --name centos-opi3 centos /sbin/init

ホストから.bashrcをコピー、コンテナに入ります。

$ docker cp .bashrc centos-opi3:/root
$ docker container exec -it centos-opi3 /bin/bash

アップデート

# yum -y update

localeの確認

# localectl                              
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
# localectl list-locales | grep -i ja
なし
# locale -a
C
POSIX
# locale                               
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

localeの設定

何度かコンテナを作り直して結果的に下記の方法でうまくいきました。

# localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
# localectl set-locale LANG=ja_JP.UTF-8
# source /etc/locale.conf

設定後

# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: us
      X11 Layout: us
# localectl list-locales | grep -i ja
ja_JP.utf8
# locale -a
C
POSIX
ja_JP.utf8

localeはコマンドラインからexport

# export LANG=ja_JP.UTF-8
# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

localeはユーザー設定になると思うのでコンテナに直接入った場合は読み込まないようです。適切なユーザーでログイン.bashrc(.cshrc)などから設定を読み込む。

タイムゾーンの設定

# date
2019年  7月  7日 日曜日 03:18:21 UTC
# timedatectl set-timezone Asia/Tokyo
# date
2019年  7月  7日 日曜日 12:20:11 JST

ツールのインストール

# yum -y install tcsh less file bind-utils whois iproute wget

openssh-server

sshd_configはPermitRootLogin yesを有効にしてroot passwordを設定しておきます。

# yum -y install openssh-server openssh-clients
/etc/ssh/sshd_config
PermitRootLogin yes
# systemctl enable sshd
# systemctl start sshd
# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

ホストから別ターミナルを開いてsshからログインできることを確認

$ ssh root@172.17.0.2
root@172.17.0.2's password:
# date
2019年  7月  7日 日曜日 12:52:48 JST

コミット

コンテナから抜けてここでコミット、新しいコンテナ(centos)を作成
コンテナをstopするとexecでアクセスすることは不可になります。

$ docker container stop centos-opi3
$ docker container commit centos-opi3 centos-ssh
$ docker container run --privileged -d --name centos centos-ssh /sbin/init
$ docker container rm centos-opi3

コンテナスタート

$ docker container start centos


poweroffでコンテナstop
ターミナルをexitで抜けるとコンテナは起動したままになっています。


webではCentOSベースの記事が多いですね。少し使ってみたいと思います。
CentOSと比べるとalpineのベースイメージの小ささがよくわかります。少し詰め込むと大きくなりますが特定の用途や実験などにはいいかもしれません。

起動ボタン

# Button centos
def centos():
    subprocess.run("docker container start centos", shell=True)
    time.sleep(3)
    subprocess.run("xterm -e ssh root@172.17.0.2 &", shell=True)
icon2 = PhotoImage(file='~/.icons/64x64/centos.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=centos)
button2.grid(row=1,column=2)

rangerは前回のalpineの要領で入れています。(pythonはベースイメージにインストール済)
現状はdocker networkを構成していないのでalpineを先に起動するとipが(172.17.0.3)となってボタンの指定とずれてしまいます。(今後の勉強次第ですね)