phoenix-power最近、Wineを使うことが多くなった気がするので、どんな感じで使ってるかのメモ。

MT4とかその他のアプリもそうだけど、LinuxでWindowsアプリを動かしたいことがあります。そんな時は、Wineで動かして、VNCやSSHで接続するのですが(ほとんど外部サーバーで動かしてるので)、Docker Imageも使います。

Host:ArchLinux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ sudo pacman -S docker lxc openssh

$ docker -v

$ sudo cp /usr/lib/systemd/system/docker.service /etc/systemd/system/docker.service

$ sudo mkdir -p /etc/systemd/system/docker.service.d/

$ sudo vim /etc/systemd/system/docker.service.d/lxc.conf
[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -e lxc

$ sudo vim /etc/ssh/sshd_config
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts no
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

$ sudo systemctl start docker
$ sudo systemctl start sshd

で、Dockerfileを書いてきます。

1
2
$ mkdir -p ~/docker/firefox
$ vim ~/docker/firefox/Dockerfile
~/docker/firefox/DockerfileLINK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

これはGUIアプリをDockerから転送するやり方です。

1
2
3
4
5
6
7
8
9
10
11
$ cd ~/docker/firefox

$ sudo docker build -t firefox .

# Guest:Ubuntu
$ sudo docker run -ti --rm \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  firefox

developer@docker $ firefox

次に、Wine用のコンテナを作ってみます。

~/docker/wine/DockerfileLINK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FROM ubuntu:14.04

RUN dpkg --add-architecture i386
RUN apt-get update -y
RUN apt-get install --no-install-recommends software-properties-common -y
RUN add-apt-repository -y ppa:ubuntu-wine/ppa
RUN apt-get update -y
RUN apt-get install wine1.7 winetricks winbind -y

RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt-get install language-pack-ja -y && update-locale LANG=ja_JP.UTF-8
RUN apt-get install fonts-takao fonts-takao-gothic fonts-takao-pgothic fonts-takao-mincho
RUN sed -i -e 's/^XKBMODEL="pc105"/XKBMODEL="jp106"/g' /etc/default/keyboard
RUN sed -i -e 's/^XKBLAYOUT="us"/XKBLAYOUT="jp"/g' /etc/default/keyboard
RUN apt-get purge software-properties-common -y
RUN apt-get autoclean -y
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/wineuser && \
    echo "wineuser:x:${uid}:${gid}:Developer,,,:/home/wineuser:/bin/bash" >> /etc/passwd && \
    echo "wineuser:x:${uid}:" >> /etc/group && \
    echo "wineuser ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/wineuser && \
    chmod 0440 /etc/sudoers.d/wineuser && \
    chown ${uid}:${gid} -R /home/wineuser

USER wineuser
ENV HOME /home/wineuser
ENV LANG ja_JP.UTF-8
WORKDIR /home/wineuser
CMD /bin/bash

後は同じように、build, runします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ cd ~/docker/wine

$ sudo docker build -t wine:base .

# `lxc.network.hwaddr = ac:ac:ac:11:22:33`では、アプリによってハード固有の番号が読み込まれることがあるので便宜上指定します。
$ sudo docker run -ti --rm --lxc-conf="lxc.network.hwaddr = ac:ac:ac:11:22:33" \
  -e XMODIFIERS="@im=fcitx" \
  -e GTK_IM_MODULE=fcitx \
  -e QT_IM_MODULE=fcitx \
  -e XIMPROGRAM=fcitx \
  -e LC_CTYPE=ja_JP.UTF-8 \
  -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
  wine:base

wineuser@docker $ wget http://cdn.line-apps.com/client/win/new/LineInst.exe
wineuser@docker $ wine LineInst.exe
--------------------------------------------
$ sudo docker ps
commitID

$ sudo docker commit ${commitID} wine:line
$ sudo docker images
wine line
wine base

$  sudo docker run -ti --rm --lxc-conf="lxc.network.hwaddr = ac:ac:ac:11:22:33" \
  -e XMODIFIERS="@im=fcitx" \
  -e GTK_IM_MODULE=fcitx \
  -e QT_IM_MODULE=fcitx \
  -e XIMPROGRAM=fcitx \
  -e LC_CTYPE=ja_JP.UTF-8 \
  -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
  wine:line