📑

DockerもいいけどLXDもね 4 〜profileで楽をする〜

2021/04/02に公開

さて備忘録も兼ねてるので復習も兼ねて複数回に分けて書いてきたけどぶっちゃけ

https://zenn.dev/tantan_tanuki/articles/7796a4f1d6d1b0
https://zenn.dev/tantan_tanuki/articles/d1ca906ddf3c01

これ両方やるのって結構手間だよね?

実はこれLXDのprofileを使うと自動化出来ます。

早速やってみましょう。

profileを作る

私も独学でやってるので正しいかどうか確信がないのですがprofile使うとコンテナ自体の設定周りの初期値を定義しておけるものと理解しています。
ちなみに作らないでも下記のようにdefaultっていう初期設定があって何も指定しないと暗黙の了解でそいつが適用されてます。

default
$ lxc profile show default 
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/instances/gui

で実はイメージによってはcloud-initっていうのに対応しててこれも便利なのです。
これを使うとこのプロファイルに定義しといたコマンドとかを実行とかもしてくれるからある程度までイメージの初期設定の手順が省略できるようになります。

DockerComposeみたいなものって考えたらわかりやすいかな?

百聞は一見にしかずなので早速最初に作ったデスクトップ環境とLXD内でDockerを使えるようにしたprofileを作ってみようか

ちょっと長いけどコピペするだけだよ

lxc profile create myProfile

でプロファイルを作成して

lxc profile edit myProfile << EOF
config:
  security.nesting: true
  security.privileged: true
  user.user-data: |
    #cloud-config
    timezone: Asia/Tokyo
    locale: ja_JP.utf8
    write_files:
      - content: |
          [Unit]
          Description=Remote desktop service (VNC)
          After=syslog.target network.target

          [Service]
          Type=forking
          User=ubuntu
          PAMName=login
          PIDFile=/home/ubuntu/.vnc/%H%i.pid
          ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
          ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24
          ExecStop=/usr/bin/vncserver -kill %i

          [Install]
          WantedBy=multi-user.target
        path: /etc/systemd/system/vncserver@:1.service
    package_upgrade: true
    packages:
      - gnupg
      - wget
      - lxde
      - tightvncserver
      - docker.io
    runcmd:
      - wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | apt-key add -
      - wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | apt-key add -
      - wget https://www.ubuntulinux.jp/sources.list.d/focal.list -O /etc/apt/sources.list.d/ubuntu-ja.list
      - apt update -y
      - apt upgrade -y
      - apt install -y ubuntu-defaults-ja
      - systemctl enable vncserver@:1
EOF

はい、これでmyProfileっていう名前のプロファイルが出来たよ中身は最初と2回目の記事の内容をプロファイルの書式に直しただけだよ

ちゃんと出来てるか確認してみたい場合は以下のコマンドを打つと設定内容が表示されるよ

lxc profile show myProfile

じゃあこのプロファイルを適用したコンテナを起動しよう
前作ったコンテナと違う名前にしたいのでguiって名前のコンテナで作るね。

lxc launch images:ubuntu/21.04/cloud gui -p default -p myProfile

はい、出来た

これだけでほぼほぼ出来ました。

launchする時に-pで作ったプロファイルを指定できるよ

1回目の記事のときとちょっと起動イメージ名が違うよね?
イメージ名の後ろに/cloudってついてるのが今回重要なcloud-init対応のイメージになるよ
他にも色々あるからLXDUIのリモートイメージをcloudで絞って確認してみよう

Imgur

一杯あるね!

ところでコンソールすぐ返ってくるの変だよね?

手動でやってたときってaptでかなり時間かかったよね?

そう、実は起動は終わってるんだけど今必死にcloud-initくんが設定した内容をせっせせっせとやってくれてるんだね
それが終わるまで待たないといけないので以下のコマンドで終わるまで待とう!

lxc exec gui -- cloud-init status --wait

なんかずっと.......................って出ると思うけどいま頑張ってますよって証拠だから焦らずにBGMでも付けて眺めてよう

そのうちこんなの出るよ

status: done

doneってでたら成功して終わってるってことだから次へ行こう
とりあえずセットアップは終わったのでvncで繋ぐためのパスワード設定をするよ

$ lxc exec gui -- su ubuntu -c 'vncserver :1 -geometry 1920x1080 -depth 24'

これでPW設定したら起動してるよ。
一度VNCクライアントでgui.local:5901に繋いでみよう。

Imgur

やった!
1回目の記事でやったことが簡単に出来るようになったね!

続いて2回目の記事でやったdockerが動くかも見てみようか

$ lxc exec gui -- docker run --rm -it alpine ash
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
ca3cd42a7c95: Pull complete 
Digest: sha256:ec14c7992a97fc11425907e908340c6c3d6ff602f5f13d899e6b7027c9b4133a
Status: Downloaded newer image for alpine:latest
/ # echo yahoo!
yahoo!

出来てる出来てる

いや〜便利な世の中に乾杯🍾

というわけで自堕落底辺おじさんが楽をするためにprofileを使った時の備忘録でした。

それでは良いLinuxライフを

しゃみしゃっきりー

Discussion