M1 MacのdockerでUbuntuのGIMPを立ち上げた件@2021.05.07

ライフ

記事のテーマ

M1 MacのdockerでubuntuのGIMPを立ち上げる方法について解説します。

想定読者

  • M1 Mac, docker, Ubuntu, GUI, VNC, GIMPを使いたい方

動作確認環境

  • PCやOSのバージョンは以下です。
PCMacBook Air (M1, 2020) 8GB SSD256GB
OSmacOS Big Sur 11.3.1
dockerdocker desktop version 3.5.2(66501)
Docker version 20.10.7, build f0df350
Docker Compose version v2.0.0-beta.6

M1 MacでのDocker Desktopのインストール

M1 Macへのdockerのインストール方法は以下を参照しました。

リダイレクトします…

Dockerfile

Dockerfileは以下です。
最新のubuntu20.04を使っています。
basic packageとして、sudo, ssh, build-essential, tzdataをインストール。
optional packageとして、emacs, screenをインストール。この辺りは好みで。
ssh接続のためにopensshをインストール。
GUIのためにxrdpをインストール。rdp接続は断念。
リモートディスクトップのためvncをインストール。
GIMPを使いたいのでインストール。
userの追加。uidは1000でうまくいく。sudo権限の追加など。
スクリプトの追加。entrypoint.shは起動スクリプト。vncserver.shはvncの起動スクリプト。
emacsとscreenの初期設定を追加。
ENTRYPOINTを指定。

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

# basic package
RUN apt-get update && apt-get install -y \
 sudo ssh build-essential tzdata

# optional package
RUN apt-get update && apt-get install -y \
 emacs screen

# openssh
RUN apt-get install -y openssh-server
EXPOSE 22

# xrdp
RUN apt-get install -y lxde xrdp
RUN echo "startlxde" > /etc/skel/.xsession && \
  cp /etc/skel/.xsession /home/${user}/.xsession && \
  chown ${user}:${user} /home/${user}/.xsession
EXPOSE 3389

# vnc
RUN apt-get install -y tightvncserver
EXPOSE 5901

# gimp
RUN apt-get install -y gimp

# user
ARG user=michio
ARG password=password

RUN groupadd -g 1000 $user && \
  useradd -u 1000 -g $user -s /bin/bash $user && \
  echo "${user}:${password}" | chpasswd && \
  mkdir -p /home/${user} && \
  echo "${user} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

WORKDIR /home/$user
COPY ./entrypoint.sh .
COPY ./vncserver.sh .
RUN chmod +x /home/${user}/entrypoint.sh
RUN chmod +x /home/${user}/vncserver.sh

RUN mkdir -p .emacs.d
COPY ./init.el .emacs.d/
COPY ./.screenrc .

RUN chown -R ${user}:${user} /home/${user}

USER $user

ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh

Dockerfileコンテナの起動スクリプト。sshを起動する。xrdpはうまく接続できなかったので諦め。vncは起動時点で立ち上げるとエラーになるのでここでは立ち上げない。

#!/bin/bash
set -e
sudo /etc/init.d/ssh start
#sudo /etc/init.d/xrdp start
#vncserver
tail -f /dev/null

docker起動と終了

docker build

イメージの作成。Dockerfileに沿ってイメージを作成する。

% docker build -t ubuntu:michiolife .

docker run

コンテナの起動。
時刻設定のために環境変数TZを設定。
sshとvncのために22番と5901番ポートをオープン。
ファイル共有設定。
コンテナ名はcont1を指定。

% docker run -d -it -e TZ=Asia/Tokyo -p 127.0.0.1:22:22 -p 127.0.0.1:5901:5901 -v /Users/michio/michiolife:/home/michio/michiolife --name cont1 ubuntu:michiolife

docker stop

コンテナの停止。停止後に再スタートする場合は「% docker start cont1」。リスタートする場合は「% docker restart cont1」。

% docker stop cont1

docker rm

コンテナの削除。Dockerfileを修正してdocker buildし直す場合。-fオプションをつけると実行中でも強制削除できる。

% docker rm -f cont1

docker-composeによる起動と終了

dokcer-compose.ymlに以下を記載。

version: '3'
services:
  ubuntu:
    image: ubuntu:michiolife
    restart: always
    environment:
      - TZ=Asia/Tokyo
      - LANG=ja_JP.UTF-8
    ports:
      - 5901:5901
      - 22:22
    volumes:
      - /Users/michio/michiolife:/home/michio/michiolife

docker-composeコマンドで起動

% docker-compose up -d

docker-composeコマンドで終了

% docker-compose down

ssh接続

ターミナルからsshで接続。パスワード「password」を入力してログイン。

% ssh michio@127.0.0.1

vncserverの立ち上げ

sshログイン後に以下のコマンドでvncを立ち上げる。

$ ./vncserver.sh

vncserver.sh

vncの起動スクリプト。パスワード入力と画面サイズ設定などをスクリプト化。

#!/bin/bash
PASSWD="password"
VNCPASSFILE="$HOME/.vnc/passwd"
VNCPASSWD="password"
VNCSERVER="tightvncserver -geometry 1920x1080"

mkdir -p $HOME/.vnc
echo "$PASSWD" | $VNCPASSWD -f > $VNCPASSFILE
chmod 600 $VNCPASSFILE
$VNCSERVER

vnc接続

Finderを開き、command+k。「サーバへの接続」が立ち上がるので以下を入力し接続。次にパスワード「password」を入力。次のようなvnc画面が開く。メッセージボックス2つはOKボタンを押す。

vnc://127.0.0.1:5901

GIMPの立ち上げ

左下のメニューから「Graphics」を選び「GNU Image Manipulation Program」を選択。GIMPが立ち上がる。下が画面左にGIMPが、画面右にFireFoxが立ち上がった画面キャプチャ。

参考

emacsの設定

init.elの設定は以下。

(menu-bar-mode -1)
(global-linum-mode t)
(setq linum-format "%4d:")
(setq default-tab-width 4)

(setq c-basic-offset tab-width)
(setq inhibit-startup-message t)

(require 'whitespace)
(setq whitespace-style '(face           ; faceで可視化
                         trailing       ; 行末
                         tabs           ; タブ
                         empty          ; 先頭/末尾の空行
                         space-mark     ; 表示のマッピング
                         tab-mark
                         ))

(setq whitespace-display-mappings
      '((tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))

; (global-whitespace-mode 1)

(autoload 'gtags-mode "gtags" "" t)
(setq gtags-mode-hook
      '(lambda ()
         (local-set-key "\M-t" 'gtags-find-tag)
         (local-set-key "\M-r" 'gtags-find-rtag)
         (local-set-key "\M-s" 'gtags-find-symbol)
         (local-set-key "\C-t" 'gtags-pop-stack)
         ))
(add-hook 'c-mode-common-hook
          '(lambda()
             (gtags-mode 1)
             (gtags-make-complete-list)
             ))

(show-paren-mode t)
(electric-indent-mode -1) ; インデントしない
(setq-default truncate-lines t) ; 折返ししない

screenの設定

.screenrcの設定は以下。

escape ^Jj
startup_message off
defscrollback 1000000
autodetach on
vbell off
hardstatus alwayslastline "%{= rw} %H %{= wk}%-Lw%{= bw}%n%f* %t%{= wk}%+Lw %{= wk}%=%{= gk} %y/%m/%d %c "

コメント

タイトルとURLをコピーしました