読者です 読者をやめる 読者になる 読者になる

osechiman’s blog

開発備忘録

Docker+MobaXtermで持ち運び出来る開発環境を作る

Docker MobaXterm

Docker+MobaXtermで持ち運び出来る開発環境を作る

やりたかったこと

WindowsPCを新しいマシンに替える時に毎回環境構築するのがめんどくさいと思いませんか。

私は思います。

すごい思ってます。

なのでDockerでimageを構築しておけば取り込むだけで「はい環境構築完了」の状態にできるのではと思ってました。

ただGUI系のツールも一緒に入れておいて使いたいので

今回はそこら辺も含め出来たことを備忘録にします。

できたこと

  • Dockerコンテナ内のGUIツールをMobaXterm経由で起動する
材料
作り方

材料にあるツールはすでにインストールされている事を前提とします。

それとツールの使い方も検索すれば出て来るので端折ります。

1.自分のお好みの環境が構築出来るDockerfileを用意します(↓は私が使いたいやつです)

# 僕の考えた最強の開発環境
FROM ubuntu:16.04

# 最強の作者名
MAINTAINER osechiman

# デフォがdashなんでぇシンボリックリンク書き換えてbashでいくんでよろしくぅ!!
RUN ln -fs bash /bin/sh

# packageのupdateしてやる!!
RUN echo '==========パッケージのアップデート開始...==========' && \
apt-get update && \
echo '==========...パッケージのアップデート終了=========='

# ついでにアップグレードお前もだ!!
RUN echo '==========パッケージのアップグレード開始...==========' && \
apt-get -y upgrade && \
apt-get -f install && \
echo '==========...パッケージのアップグレード終了=========='

# 日本仕様に改造してくれるわっ!
RUN echo '==========日本仕様に変更中...==========' && \
apt-get install -y language-pack-ja-base language-pack-ja && \
update-locale LANG=ja_JP.utf8 LANGUAGE=ja_JP.utf8 LC_ALL=ja_JP.utf8 && \
source /etc/default/locale && \
apt-get install -y man manpages-ja manpages-ja-dev && \
echo '==========...日本仕様に変更完了=========='

# 必要なモジュールインストールしていくのだ
## apt-get編
RUN apt-get install -y make vim php bash-completion git git-flow tmux curl python wget nkf ctags golang ssh xorg openbox

## curlとかwgetで頑張る編
RUN echo '==========composerのインストール==========' && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin && \
echo '==========nodebrewのインストール==========' && \
curl -L git.io/nodebrew | perl - setup && \
export PATH=$HOME/.nodebrew/current/bin:$PATH && \
nodebrew -v && \
export NODEBREW_ROOT=$HOME/.nodebrew && \
echo '==========nodeのインストール==========' && \
nodebrew install-binary stable && \
nodebrew use stable && \
node -v

## 設定ファイルを作っていくのです
RUN cp /usr/share/bash-completion/completions/git-flow /etc/bash_completion.d

## .bashrcに色々書いてく...
RUN echo "export GOROOT=~/go" >> ~/.bashrc
RUN echo "export NODEBREW_ROOT=~/.nodebrew" >> ~/.bashrc
RUN echo "export PATH=$PATH:/usr/local/bin/go/bin:$GOROOT/bin:~/.nodebrew/current/bin" >> ~/.bashrc
RUN echo "export PS1='[\[\033[0;34m\]\u@\h \W\[\033[0m\]]$ '" >> ~/.bashrc
RUN echo "if [ -f /etc/bash_completion ] && ! shopt -oq posix; then" >> ~/.bashrc
RUN echo "    . /etc/bash_completion" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
RUN source ~/.bashrc
# 使い方
#
## buildコマンド
### docker build -t my-env:1.0 [Dockerfile-DirPath]
#
## コンテナ起動コマンドサンプル
### docker run -itd -p 2022:22 -v [source-dir]:/source --name my-env my-env:1.0 

※割りとはっちゃけたコメントになっているのは深夜に作業した為です。

  • ポイント

Dockerコンテナに突っ込んだGUIツールを利用するために必要なのは

ssh xorg openbox

こちらになります。

他に入れたいコマンドやツールは適宜読み替えてください。

2.Dockerfileからimageを構築

MobaXtermを起動し「Start local terminal」を選択します。

そしたら

docker-machine start sandbox

で作成している仮想環境を立ち上げて

その中でimageを作ってコンテナを起動します。

docker build --no-cache=true -t my-env:1.0 .
・
・
・ //image作成中
docker run -itd -p 2022:22 --name my-env my-env:1.0

コンテナ起動時に-pで

-p 2022:22

しておいてください。

外からコンテナに接続する際に使います。

別に何番ポートでも構わないのですがsshで接続するのでわかりやすいように2022を設定しました。

3.コンテナでsshdを起動&rootでsshを許可する

vim /etc/ssh/sshd_config

 26 # Authentication:
 27 LoginGraceTime 120
 28 PermitRootLogin prohibit-password
 29 StrictModes yes

 26 # Authentication:
 27 LoginGraceTime 120
 28 PermitRootLogin yes // yesに書き換え
 29 StrictModes yes

rootのパスワードも変更

[root@79d7dbd28cb8 /]$ passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

そしたらsshd起動!

/etc/init.d/ssh start

これでコンテナへの接続準備は完了しました。

docker ps で確認するとこんな感じ。

docker@sandbox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
79d7dbd28cb8        sandbox             "/bin/bash"         24 minutes ago      Up 24 minutes       0.0.0.0:2022->22/tcp   my-env

4.MobaXtermでDockerのコンテナに接続する

[osechiman.osechiman] ➤ ssh -p 2022 root@192.168.99.100 // passwordは先程変更したやつ
Warning: Permanently added '[192.168.99.100]:2022' (RSA) to the list of known hosts.
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.27-boot2docker x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Mon Jan  9 08:03:37 2017 from 192.168.99.1
[root@79d7dbd28cb8 ~]$

docker-machineのIPに対して2022ポートでアクセスすると作成したコンテナにアクセスしにいきます。

ssh -p 2022 root@192.168.99.100

xmanを起動しているところが以下の画像です。

f:id:osechiman:20170109171347p:plain

これでDocker内のGUIツールをMobaXterm経由で起動する事が出来ました!

これならどこの現場に行ってもWindowsPCなら環境構築に苦労しないで済むはずっ...!

できなかったこと

この手順ではsshdのデーモン登録が出来ていないです。

今後対応するつもりだけど備忘録にするほどでもないかなぁ。

Dockerコンテナ内のJenkinsにJenkinsCLIを導入

Docker Jenkins

Dockerコンテナ内のJenkinsにJenkinsCLIを導入

やりたかったこと

Dockerコンテナで稼働しているJenkinsにJenkinsCLIを導入。

ちょっとだけハマったので備忘録に。

できたこと

JenkinsCLIの導入。

docker-machienでDockerを動かしてJenkinsを動かしている時に

http://192.168.99.100:8080/cli/

↑のURLにアクセスするとjenkins-cli.jarのダウンロード方法と共に

java -jar jenkins-cli.jar -s http://192.168.99.100:8080/ help

的な感じでコマンド実行例が出てくるけど

Jenkinsコンテナ内で実際にコマンド叩くときは

java -jar jenkins-cli.jar -s http://localhost:8080/ help

192.168.99.100の部分をlocalhostに置き換えないとURLにアクセス出来ないっすって怒られます。

よくよく考えればそりゃhostのIPなんてJenkinsコンテナは知ったこっちゃないか...。

PostgreSQL⇒MySQLへのデータ移行

PostgreSQL MySQL

PostgreSQLMySQLへのデータ移行

やりたかったこと

PostgreSQLのテーブルの一部のデータを、

MySQLで作成した新しいテーブルに移植したい、というような事がありまして。

今回はその時にやった手順の備忘録。

postgres=# \d+ p_name
                                  Table "public.p_name"
   Column    |         Type          | Modifiers | Storage  | Stats target | Description
-------------+-----------------------+-----------+----------+--------------+-------------
 id          | integer               |           | plain    |              |
 first_name  | character varying(40) |           | extended |              |
 family_name | character varying(40) |           | extended |              |

postgres=# \l sandbox
                          List of databases
  Name   |  Owner   | Encoding | Collate | Ctype | Access privileges
---------+----------+----------+---------+-------+-------------------
 sandbox | postgres | EUC_JP   | C       | C     |
(1 row)
  • テストデータ
postgres=# SELECT * FROM p_name;
 id | first_name | family_name
----+------------+-------------
  1 | 太郎       | 田中
  2 | 次郎       | 佐藤
  3 | 三郎       | 鈴木
(3 rows)
mysql> SHOW COLUMNS FROM name;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| first_name | varchar(40) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> SHOW CREATE table name\G
*************************** 1. row ***************************
       Table: name
Create Table: CREATE TABLE `name` (
  `id` int(11) NOT NULL,
  `first_name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

できたこと

単純にPostgreSQLからCSVでデータを出力して

postgres@f78d7d394494:/$ psql -c 'SELECT id, first_name FROM p_name' -A -F, -t > /tmp/p_name.csv

nkfかけて

[root@f78d7d394494 /]$ nkf -w --overwrite /tmp/p_name.csv

MySQLに突っ込む

mysql> use sandbox
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> LOAD DATA LOCAL INFILE '/tmp/p_name.csv' INTO TABLE name FIELDS TERMINATED BY ',' ENCLOSED BY '"';      Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> ^DBye
[root@f78d7d394494 /]$ mysql -p sandbox -e 'SELECT * FROM name'
Enter password:
+----+------------+
| id | first_name |
+----+------------+
|  1 | 太郎     |
|  2 | 次郎     |
|  3 | 三郎     |
+----+------------+
[root@f78d7d394494 /]$

で目的は達成できました。

GAE/go用のDockerfileを作った

GAE Docker Golang

GAE/go用のDockerfileを作った

やりたかったこと

GAE/goのスコーンと使える環境を作りたいんです。

できたこと

ubuntuベースでGAE/goが使えるDockerfileができました。

# GAE-GOの開発環境
FROM ubuntu:latest

# 作者名
MAINTAINER osechiman

# packageのupdate
RUN apt-get update

# 日本の環境に合わせる
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# shellをbashにする
RUN ln -fs /bin/bash /bin/sh && /bin/bash

# 日本の環境に対応する為の環境変数
RUN echo "export LC_ALL=jp_JP.UTF-8" >> /etc/profile && \
    echo "export LANGUAGE=jp_JP.UTF-8" >> /etc/profile && \
    echo "export PATH=$PATH:/usr/local/bin/go_appengine" >> /etc/profile

# 必要なコマンドと使いたいコマンドをinstall
RUN apt-get install -y \
    make \
    gcc \
    less \
    curl \
    wget \
    ca-certificates \
    python \
    tar \
    man \
    tree \
    tmux \
    bash-completion \
    git \
    vim \
    jq \
    golang \
    unzip

# go_appengineのSDKをダウンロード
RUN wget https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.40.zip && \
    unzip go_appengine_sdk_linux_amd64-1.9.40.zip -d /usr/local/bin && \
    rm go_appengine_sdk_linux_amd64-1.9.40.zip

# mountする想定でソースを管理するディレクトリ作成
RUN mkdir /source

# 可変的なデータを格納するディレクトリ作成
RUN mkdir /storage

## VOLUME設定
VOLUME /source

## 自分のgitから.bashrcを取得
RUN wget -O /root/.bashrc https://raw.githubusercontent.com/osechiman/MyConf/master/gae/bashrc

## echoをgo getする
RUN /usr/local/bin/go_appengine/goapp get -u github.com/labstack/echo

## ポートを設定
EXPOSE 8000:8000 8080:8080 18080:18080

## ENTRYPOINTの設定
ENTRYPOINT /usr/local/bin/go_appengine/dev_appserver.py --host 0.0.0.0 --admin_host 0.0.0.0 --api_host 0.0.0.0 --api_port 18080 --storage_path /source/storage --skip_sdk_update_check true /source

# 使い方
#
## buildコマンド
### docker build -t gae-go:1.0 [Dockerfile-DirPath]
#
## コンテナ起動コマンドサンプル
### docker run -itd -p 8080:8080 -p 8000:8000 -p 18080:18080 -v [source-dir]:/source --name gae-go gae-go:1.0 
#
# 作られるイメージはgo_appengine_sdkを解凍して使えるようにした最低限のもの
# mount先のディレクトリでコードを書いていく感じで

docker-machineで動かしているのでローカル環境で確認したい場合

192.168.99.100:8080

とか

192.168.99.100:8000

で見れるはずです。

最初alpineベースで作ったら動かなかったので試しにubuntuベースにしたら動いたのでもうこれで良し。

できなかったこと

alpineベースでGAE/goのDockerfileを作ること。

/usr/local/bin/go_appengine/dev_appserver.py --host 0.0.0.0 --admin_host 0.0.0.0 --api_host 0.0.0.0 --api_port

alpineで作った時はこのオプション指定する部分でなんかこけたんだよなぁ...。