20200528のdockerに関する記事は18件です。

docker、cakePHP、apache、mysqlの作りました!

はじめに

今回githubの方にまとめる形をとってみました!!
手順まとめてあるので以下見てください!:relaxed:
ちなみにDockerコマンド打てるところからお願いします!
打てない場合『困ったときは以下も』の一番上のリンクから行う形になるかんじです!

https://github.com/sachiko-kame/docker_cakePHP_mysql_apache_1

一応:

php:7.4
mysql:8
cakePHP:4.0.8

困ったときは以下も

全部自分の記事です!:relaxed:

Dockerの大まかなイメージから自分が作成したものをDockerhubにあげて、インストールして実行まで

[Docker][apache][CakePHP]The requested URL was not found on this server.

CakePHPハマったの対策

とりあえずhtmlの表示をDocker使って行う[apacheバージョン]

実は

行う処理をもっと少なくしたいけど今のところまだ出来ていない感じです、、、
手作業が多いのがネックではあります、、、
なんかいい方法教えてください?‍♀️

ただ結構シンプルにしたので何を行っているかなどはわかりやすいのではないかと思っています!
なのでqiitaに載せました!!←載せる理由を作成する必要があると思ってい、ま、す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでARM用Dockerイメージを作成する

dockerのExperimental機能であるbuildxを利用すると、異なるCPUアーキテクチャ用のDockerイメージを作ることができます。
今までは、ARM用のDockerイメージを作るためにはARM用のマシンでDockerイメージをbuildする必要がありましたが、
buildxを利用することでローカルで作業を完結させることができるようになりました。

環境用意

まずはインストール済みのDocker Desktopのバージョンが以下であることを確認します。

  • Docker Desktop Version 2.0.4.0 (33772) 以上

また、buildxはExperimental機能のため利用するために以下のように設定ファイルを編集する必要があります。

$HOME/.docker/config.json

{
  "stackOrchestrator" : "swarm",
  "credsStore" : "desktop",
  "experimental" : "disabled",
  "auths" : {
    "787080764332.dkr.ecr.ap-northeast-1.amazonaws.com" : {

    },
    "https://index.docker.io/v1/" : {

    }
  },
  "HttpHeaders" : {
    "User-Agent" : "Docker-Client/19.03.5 (darwin)"
  },
  "experimental": "enabled" <-- ここを追加
}

次にbuild用のコンテナを作成していきます。

$ docker buildx create --name buildarm --platform linux/arm64 --use
$ docker buildx use buildarm
$ docker buildx inspect --bootstrap
[+] Building 0.8s (1/1) FINISHED                                                                                                                                                                                                                                             
 => [internal] booting buildkit                                                                                                                                                                                                                                         0.8s
 => => starting container buildx_buildkit_buildarm0                                                                                                                                                                                                                     0.8s
Name:   buildarm
Driver: docker-container

Nodes:
Name:      buildarm0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/arm64, linux/amd64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

これでARM用のDockerイメージを作る準備ができました。

Dockerイメージを作成

ここではテスト用に簡易的なDockerfileを用意してbuildしていきます。

$ mkdir test && cd test && cat <<EOF > Dockerfile

FROM ubuntu
RUN apt-get update && apt-get install -y curl
WORKDIR /src
COPY . .
EOF

以下イメージ作成になります。

$ docker buildx build --platform linux/arm/v7 -t test-buildx --load .                   
[+] Building 8.3s (10/10) FINISHED                                                                                                  
 => [internal] load build definition from Dockerfile                                                                           0.0s
 => => transferring dockerfile: 31B                                                                                            0.0s
 => [internal] load .dockerignore                                                                                              0.0s
 => => transferring context: 2B                                                                                                0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                               4.7s
 => [internal] load build context                                                                                              0.0s
 => => transferring context: 31B                                                                                               0.0s
 => [1/4] FROM docker.io/library/ubuntu@sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7                0.0s
 => => resolve docker.io/library/ubuntu@sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7                0.0s
 => CACHED [2/4] RUN apt-get update && apt-get install -y curl                                                                 0.0s
 => CACHED [3/4] WORKDIR /src                                                                                                  0.0s
 => CACHED [4/4] COPY . .                                                                                                      0.0s
 => exporting to oci image format                                                                                              3.4s
 => => exporting layers                                                                                                        0.0s
 => => exporting manifest sha256:75f5df7b0a817b040d8e06c4547c17734bf719ce038f91a0f59e4b379a0213b7                              0.0s
 => => exporting config sha256:4815274966cce0c0f0ce84e54cd28b9ee02164bd1d3e4899578d1176e0388506                                0.0s
 => => sending tarball                                                                                                         3.4s
 => importing to docker                                                                                                        0.0s
$ docker images | grep test-buildx                                          
test-buildx                                           latest                         4815274966cc        About an hour ago   82.1MB
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerでapt-get upgrade

はじめに

Dockerでイメージをビルドしようとすると、ユーザインタラクションを避ける必要があります。ところがapt-get upgrade したときのサービスのリスタートの確認では、一般につかわれている -y オプションをつけてもYes/Noの確認がでてしまいdocker build が停止してしまいます。

問題点

Dockerfile内でapt-upgradeすると、-yをつけようが--force-yesをつけようが--allow-downgradesをつけようが--allow-remove-essentialをつけようが--allow-change-held-packages をつけようが、以下のプロンプトが避けられない

Configuring libssl1.1:arm64
There are services installed on your system which need to be restarted when
certain libraries, such as libpam, libc, and libssl, are upgraded. Since these
restarts may cause interruptions of service for the system, you will normally
be prompted on each upgrade for the list of services you wish to restart.  You
can choose this option to avoid being prompted; instead, all necessary restarts
will be done for you automatically so you can avoid being asked questions on
each library upgrade.

Restart services during package upgrades without asking? [yes/no]

で、これがでるとdocker build がとまって、どうしようもない感じ

解決策

debconf-set-selections
コマンドに設定をいれることでプロンプトのデフォルトの選択肢が選択できます。
'* libraries/restart-without-asking boolean true'をわたすことで、上記のプロンプトでとまるのを抑止できました。
Dockerfileに以下を設定

RUN echo '* libraries/restart-without-asking boolean true' |  
debconf-set-selections

でもって、このあとの
apt-get upgrade -y
では上記のプロンプトでは止まらなくなります。

利用例

Darknetをビルド済なXavierNX/JetsonNANOのDockerイメージを作成でつくったイメージだと、apt-upgradeがおこなわれなくて、いろいろ起きますが、これで、apt-get updateとupgrade部分を自動化することができます。

FROM darknet:100
RUN apt-get -y update
RUN echo '* libraries/restart-without-asking boolean true' |  debconf-set-selections
RUN apt-get -y upgrade
RUN apt -y install xfce4-terminal
CMD ["/bin/bash"]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CTF用にUbuntuのDocker Imageファイルを作成する

概要

バイナリ(実行ファイル)解析用PythonパッケージAngrを中心とした、CTF用のコマンド類をまとめてインストールしたコンテナを作って、Imageファイルにしておくと何かと便利かなと思ったので、作り方を記録しておく。

手順

以下の作業はWindows10上のVirtualBoxで稼働するUbuntuで検証。

Ubuntu上でUbuntuコンテナを作成

[端末]を起動し、以下のコマンドを実行。

docker run -it --name ubuntu_base ubuntu

DockerImage_001.png

apt update

DockerImage_002.png
DockerImage_003.png

Ubuntuコンテナにいろいろinstall

python3

apt install python3

DockerImage_004.png
yを入力し[Enter]
DockerImage_005.png

apt install python3-pip

DockerImage_006.png
DockerImage_007.png
yを入力し[Enter]
DockerImage_008.png

Angr

pip3 install angr

DockerImage_009.png
DockerImage_010.png

イメージ作成

コンテナを停止し、状態を確認。Dockerイメージを作成

exit
docker ps
docker ps -a
docker commit ubuntu_base ubuntu4ctf1

DockerImage_101.png

作成結果を確認した後、イメージをファイルに出力。
出力ファイルを圧縮して、最終確認。

docker images
docker save ubuntu4ctf1 -o ubuntu4ctf1.tar
zip ubuntu4ctf1.zip ubuntu4ctf1.tar
ls -la ubuntu4ctf1*

DockerImage_102.png

コマンド追加

とりあえず、できたみたいなので、コマンドを追加してみる。
コンテナの状態を確認してから、再度コンテナを起動。

docker images
docker ps
docker ps -a
docker run -it --name ubuntu4ctf1_base ubuntu4ctf1

DockerImage_201.png

gdbの追加

apt install gdb

DockerImage_202.png
yを入力し[Enter]キーを押下。
DockerImage_203.png
6を入力し、[Enter]キーを押下。
DockerImage_204.png
[Enter]キーを押下。
DockerImage_205.png
79を入力し、[Enter]キーを押下。
DockerImage_206.png

その他

同じ要領で以下のコマンドをインストール

apt install strace
apt install ltrace
apt install netcat
apt install curl
apt install nmap

イメージ作成

exit
docker ps
docker ps -a
docker commit ubuntu4ctf1_base ubuntu4ctf2

DockerImage_301.png

作成結果を確認後、イメージをファイルに出力

docker images
docker save ubuntu4ctf2 -o ubuntu4ctf2.tar
zip ubuntu4ctf2.zip ubuntu4ctf2.tar
ls -la ubuntu4ctf2*

DockerImage_302.png

イメージからコンテナを作成

mkdir d_share
docker run -it --mount type=bind,src=$PWD/d_share,dst=/tmp/share --name ctf2 ubuntu4ctf2

DockerImage_303.png

別マシンの別OS上で稼働

CentOS8をインストールした環境には、Dockerと互換のpodmanがインストールされている。
作成したコンテナが正しく動作するか検証する。

以下の作業はWindows10上のVirtualBoxで稼働するCentOSで検証。

cp /tmp/ubuntu4ctf2.zip .
unzip ubuntu4ctf2.zip
podman images
podman ps -a

DockerImage_401.png
既存のコンテナが存在しないことを確認。

podman load -i ubuntu4ctf2.tar
podman images
podman ps -a
podman run -it ubuntu4ctf2
python3
import angr
exit()

DockerImage_402.png
正しく動作した。

参考URL

http://angr.io/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10 Update が来たので WSL2 で Ubuntu 20.04 LTS を起動し Docker をインストール

はじめに

本日 2020年05月28日に Windows10 2004 May 2020 Update が正式に来たみたいですね?

最近 PC を購入し、Linuxをデュアルブートでインストールしようと考えていたのですが、WSL2がもうすぐ来るというので待っていました。

今回の Windows Update で WSL2 が使えるようになるということだったので、「Ubuntu 20.04 LTS」を WSL2 で動かし、Docker をインストールして動作確認まで行いたいと思います?‍♀️

Windows10 2004 May 2020 Update

もう少し待てば Windows Update の更新確認にも出てくると思いますが、今回は Windows 10 のダウンロード サイトで更新しいています。

2020-05-28 (6).png

WSL2 のインストール

Windows PowerShell を管理者権限で実行します。

「Linux 用 Windows サブシステム」と「仮想マシンプラットホーム」の有効化

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

WSL 2 Linux カーネルの更新

WSL 2 Linux カーネルの更新
で 最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロード しインストール

WSLのデフォルトをWSL2に設定

wsl --set-default-version 2

Ubuntu 20.04 LTS のダウンロード

Microsoft Storeで linux と検索し「Ubuntu 20.04 LTS」をインストール

ubuntu20インストール.png

バージョン確認

wsl --list --verbose

バージョンが2になっていたらOK

Ubuntu 20.04 LTS の 起動

2020-05-28.png

起動するとこの画面が出るのでユーザを登録すれば完了です。

Docker のインストール

Ubuntuにdockerをインストールする
を参考にしながらインストールしてみます。

まず最新にします

sudo apt update
sudo apt upgrade -y

前提ソフトウェアをインストール

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

docker公式のGPG公開鍵をインストール

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

aptリポジトリの設定

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

docker と docker-compose インストール

sudo apt install -y docker-ce docker-compose

すると GRUB install devices の確認画面が出ました
2020-05-28 (12).png

Vagrant環境でUbuntuをupgradeした際に起きるGRUBの問い合わせ
を確認してみましたが問題なさそうなのでそのまま Enter
2020-05-28 (11).png
Yesを選択で インストールは完了しました

docker daemon を起動

sudo service docker start

dockerグループに追加

sudo usermod -aG docker $USER

グループ反映のため一度再起動します

起動確認

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
t

docker ps で上記のようにエラーがなければ インストール完了です。

動作確認をしてみます

ここは実際には行わなくても大丈夫です。

以前 Docker Desktop for Windows で Rocket.Chatを動かすと MongoDB が動かなくてエラーになっていたので、Rocket.Chatで確認してみたいと思います。

mkdir -p docker/rocketchat
cd docker/rocketchat/
curl -L https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml -o docker-compose.yml

docker-compose.ymlの中身を確認

docker-compose.yml
version: '2'

services:
  rocketchat:
    image: rocketchat/rocket.chat:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - MAIL_URL=smtp://smtp.email
#       - HTTP_PROXY=http://proxy.domain.com
#       - HTTPS_PROXY=http://proxy.domain.com
    depends_on:
      - mongo
    ports:
      - 3000:3000
    labels:
      - "traefik.backend=rocketchat"
      - "traefik.frontend.rule=Host: your.domain.tld"

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     #- ./data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
    labels:
      - "traefik.enable=false"

  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    depends_on:
      - mongo

  # hubot, the popular chatbot (add the bot user first and change the password before starting this image)
  hubot:
    image: rocketchat/hubot-rocketchat:latest
    restart: unless-stopped
    environment:
      - ROCKETCHAT_URL=rocketchat:3000
      - ROCKETCHAT_ROOM=GENERAL
      - ROCKETCHAT_USER=bot
      - ROCKETCHAT_PASSWORD=botpassword
      - BOT_NAME=bot
  # you can add more scripts as you'd like here, they need to be installable by npm
      - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
    depends_on:
      - rocketchat
    labels:
      - "traefik.enable=false"
    volumes:
      - ./scripts:/home/hubot/scripts
  # this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
    ports:
      - 3001:8080

  #traefik:
  #  image: traefik:latest
  #  restart: unless-stopped
  #  command: >
  #    traefik
  #     --docker
  #     --acme=true
  #     --acme.domains='your.domain.tld'
  #     --acme.email='your@email.tld'
  #     --acme.entrypoint=https
  #     --acme.storagefile=acme.json
  #     --defaultentrypoints=http
  #     --defaultentrypoints=https
  #     --entryPoints='Name:http Address::80 Redirect.EntryPoint:https'
  #     --entryPoints='Name:https Address::443 TLS.Certificates:'
  #  ports:
  #    - 80:80
  #    - 443:443
  #  volumes:
  #    - /var/run/docker.sock:/var/run/docker.sock

そのまま実行してみます

docker-compose up -d

http://localhost:3000/
で確認
2020-05-28 (9).png

動きましたね!!

まとめ

WSL2 で問題なく Docker が動かせそうですね。

MongoDB がいつから出来るようになったのかはよくわかっていませんが、とりあえず動いてよかったです?

Docker Desktop for Windows だと docker-compose.yml に書くパスを c:\ などと Windows 形式の絶対パスで書かないといけませんでしたが、WSL2 上で動かすと Linux 同様に書けて相対パスもいけるので、定義ファイルを分ける必要がなくなりましたね。

「Windwsキー」 + 「.」
で絵文字が打てるようになったのも少し面白いですね???

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django GirlsチュートリアルでつくったものでDockerfile作成

環境

macOS

Dockerfileの作成

Django Girlsチュートリアルでつくったもの

$ ls 
blog            manage.py        myvenv 
README.md        db.sqlite3        mysite            requirements.txt

Docker Hubで使いたいイメージを探します。
公式のものなど、なるべく信頼できるイメージをつかいます。

元になるイメージはpython:3.7-slim-busterを選びました。
Django起動時に打ち込んでいるコマンドを
Dockerfileに書き込んでいきます。

$ vi Dockerfile 
FROM python:3.7-slim-buster 
COPY . /app/ 
WORKDIR /app 
RUN pip3 install -r requirements.txt 
RUN python3 manage.py collectstatic --noinput 
CMD python3 manage.py runserver 0.0.0.0:8000

Dockerの構築

任意でイメージ名やタグなどの指定をして
buildしてみます。

$ docker build -t [イメージ名]:[タグ] . 
例えば 
$ docker build -t djangogirls:0.1.0 .

イメージの一覧を表示させます。

$ docker images 
REPOSITORY        TAG          IMAGE ID             CREATED              SIZE 
djangogirls              latest        53a38ee83c1a      24 minutes ago 

ローカルで何か走っていないか確認?

Dockerを走らせる前に
心当たりがある場合は、ローカルで何か走っていないか確認します。
※特にローカルで走らせているものがなければ、以下読み飛ばしてもOKです。

$ ps -ef | grep runserver 
  502  2437   479   0 土02PM ttys000    0:00.60 /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python manage.py runserver 
  502  2438  2437   0 土02PM ttys000   58:01.79 /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python manage.py runserver 
  502 26677 13920   0  3:55PM ttys003    0:00.01 grep runserver

大まかに書くと

2437(子:Django)    479(親:shell) 
2438(子:Python)   2437(親:Django) 
26677 13920 => いま検索したgrepコマンドが走っているので無視

shellは殺さず、2437を殺せば親のDjangoもろとも子の2438も死ぬので
ローカルで走りっぱなしでいたDjangoのrunserverをkillします。

$ kill 2437

killできたか確認。

$ ps -ef | grep runserver 
  502 26680 13920   0  3:55PM ttys003    0:00.01 grep runserver

Docker run

Dockerを走らせます。
djangogirlsDocker IDでもOK。

$ docker run -it --rm -p djangogirls

下記にアクセス

http://127.0.0.1:8000/

image.png

できた?

Tips (.dockerignore)

全体的に重かったので.dockerignoreを作成し、無視するファイルを指定します。

$ vi .dockerignore 
.dockerignore
myvenv 
db.sqlite3

myvenvは仮想環境なので不要です。
db.sqlite3はDockerに乗せるには今後重くなる可能性が高いので
もしデプロイする際にはMySQLなどを使っても良いかもです。
ちなみにDBをignoreで無視するとDockerを走らせた際に赤文字で


You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, blog, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

このようにDBに問題ありなどと表示されます。
あえてignoreしている場合はスルーです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails: ActionView::Template::Error http error 500 対処法について

現在、ポートフォリオを作成している途中のゆーた(@onoblog)です。
スクリーンショット 2020-05-22 13.48.07.png
そこそこ、ローカル環境で、ポートフォリオのデザインも整ってきたし、1回、デプロイしとこうかなと思い、デプロイしたときのエラーをまとめておきます。

環境

  • rails 5.2.3
  • carrierwave
  • fog-aws
  • jquery-rails (4.3.5)
  • vue/cli 4.1.2
  • yarn 1.21.1
  • webpacker (5.0.1)
  • Docker 19.03.5
  • docker-compose 1.25.2
  • nginx 1.15.8

対処法

assetへのパイプラインを通してあげる設定にしてあげます。

config/enviroments/production.rb
config.assets.compile = true

状況

スクリーンショット 2020-05-22 13.48.07.png

このように、デプロイしたものを表示しようとするとhttp error 500が起きてしまいました。

最初に、nginxのlogかawsのec2の設定を疑い、無駄な時間を使ってしまいました。

docker-compose -f staging.yml exec app tail -f log/production.log

その後、上記コマンドで本番環境のログを見るとActionView::Template::Errorが起きている状況でした。

原因

ローカル環境では、trueになっていたことにより、動的にコンパイルができていましたが、本番環境では、falseになってしまっていました。

precompileしていないファイルを動的にコンパイルするので、本番環境では、負荷がかかってしまうので、良くないと思いますが、一時的に、適宜変更します。

development production
true false

参照

https://qiita.com/metheglin/items/c5c756246b7afbd34ae2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CLI on dockerで死なないためのalias設定

.zshrcとか.bashrcなどに書いておく内容

長くなってしまいました。
変数評価のところをもうすこしきれいに書きたいのですが、動いているので一旦お披露目します。

AWS_PAGER=cat
alias aws='docker run --rm -ti \
-v ~/.aws:/root/.aws \
-v $(pwd):/aws \
-v ~/.ssh:/root/ssh \
$(for _e in AWS_PAGER AWS_ACCESS_KEY_ID AWS_CA_BUNDLE AWS_CONFIG_FILE AWS_DEFAULT_OUTPUT AWS_DEFAULT_REGION AWS_PROFILE AWS_ROLE_SESSION_NAME AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_SHARED_CREDENTIALS_FILE;\
do \
if [ "x$(eval echo \$$_e)" != "x" ];\
then \
echo -n " --env $(echo ${_e})=$(eval echo \$$_e) ";\
fi;\
done) \
amazon/aws-cli'

経緯

AWS CLI v2になり、いくつかの理由により on docker で動かそうとしたところ以下のような挙動を確認し、こう動かしたいという要望を持ちました。

  • cli_pager を ~/.aws/config に設定しているのに反映されてな差そうな挙動を示します。具体的にはless/moreのようなものが間に挟まっているように見えます。
  • dockerコンテナに対して環境変数を可能な限り引き渡してあげたい(公式ドキュメントでは動作の確認のための最小限の利用方法のみの記載となっています)

cli_pager についてはあまり大きな問題になってないようなので、僕の端末環境に依存するものじゃないかと推測しています。
いずれにしても、

  • 環境変数は全部引き渡したほうがよい
  • pager を使わない = cat にすればいいんじゃね?

というような理由により、aws cli on docker における(そこそこ)気の利いたaliasを書いてみることにしました。

挙動の説明らしきもの

環境変数全部渡し

$for _e in ... 以降でAWS CLIが取り扱う変数を列挙し、設定が行われている場合にはdockerコンテナに対して環境変数を引き渡します。

aws cliをdockerで動かすとcli_pagerを正しく評価しない?

~/.aws/config には

[default]
region=us-west-2
output=json
cli_pager=

のような記述を行っていますが、どうしてもless(more?)を使いたいようです。
僕の意図した挙動ではないので、一行目で cat をpagerとして指定しています。
別の何かをフィルタにする際には随時 env pager="hoge" aws ... のような手続きにすることとします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

bitcoindをdockerで動かしてみる

概要

bitcoind v0.19.1をalpine linux on dockerで動かしてみました
bitcoind周りのサービスをリファクタリングすることにしたので
その準備として、まずは、2020/5/28現在で、最新のbitcoinのバージョン(v0.19.1)のものを
Dockerでビルドして動かしてみることにしました。

せっかくなので、alpine linuxを使って小さめなサイズになるように工夫しました。

実施事項

まずは、以下のDockerfileを作成しました。

Dockerfile

FROM alpine as berkeley-db

RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/alpine.global.ssl.fastly.net/g' /etc/apk/repositories
RUN apk --no-cache add autoconf
RUN apk --no-cache add automake
RUN apk --no-cache add build-base
RUN apk --no-cache add libressl

ENV BERKELEYDB_VERSION=db-4.8.30.NC
ENV BERKELEYDB_PREFIX=/opt/${BERKELEYDB_VERSION}

RUN wget https://download.oracle.com/berkeley-db/${BERKELEYDB_VERSION}.tar.gz
RUN tar -xzf *.tar.gz
RUN sed s/__atomic_compare_exchange/__atomic_compare_exchange_db/g -i ${BERKELEYDB_VERSION}/dbinc/atomic.h
RUN mkdir -p ${BERKELEYDB_PREFIX}

WORKDIR /${BERKELEYDB_VERSION}/build_unix

RUN ../dist/configure --enable-cxx --disable-shared --with-pic --prefix=${BERKELEYDB_PREFIX}
RUN make -j4
RUN make install
RUN rm -rf ${BERKELEYDB_PREFIX}/docs


FROM alpine as bitcoin-core

# copy berkeley-db from berkeley-db
COPY --from=berkeley-db /opt /opt

RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/alpine.global.ssl.fastly.net/g' /etc/apk/repositories
RUN apk --no-cache add autoconf
RUN apk --no-cache add automake
RUN apk --no-cache add boost-dev
RUN apk --no-cache add build-base
RUN apk --no-cache add chrpath
RUN apk --no-cache add file
RUN apk --no-cache add gnupg
RUN apk --no-cache add libevent-dev
RUN apk --no-cache add libressl
RUN apk --no-cache add libressl-dev
RUN apk --no-cache add libtool
RUN apk --no-cache add linux-headers
RUN apk --no-cache add protobuf-dev
RUN apk --no-cache add zeromq-dev
RUN set -ex \
  && for key in \
    90C8019E36C2E964 \
  ; do \
    gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" || \
    gpg --batch --keyserver pgp.mit.edu --recv-keys "$key" || \
    gpg --batch --keyserver keyserver.pgp.com --recv-keys "$key" || \
    gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || \
    gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" ; \
  done

ENV BITCOIN_VERSION=0.19.1
ENV BITCOIN_PREFIX=/opt/bitcoin-${BITCOIN_VERSION}

RUN wget https://bitcoin.org/bin/bitcoin-core-${BITCOIN_VERSION}/SHA256SUMS.asc
RUN wget https://bitcoin.org/bin/bitcoin-core-${BITCOIN_VERSION}/bitcoin-${BITCOIN_VERSION}.tar.gz
RUN gpg --verify SHA256SUMS.asc
RUN grep " bitcoin-${BITCOIN_VERSION}.tar.gz\$" SHA256SUMS.asc | sha256sum -c -
RUN tar -xzf *.tar.gz

WORKDIR /bitcoin-${BITCOIN_VERSION}

RUN sed -i '/AC_PREREQ/a\AR_FLAGS=cr' src/univalue/configure.ac
RUN sed -i '/AX_PROG_CC_FOR_BUILD/a\AR_FLAGS=cr' src/secp256k1/configure.ac
RUN sed -i s:sys/fcntl.h:fcntl.h: src/compat.h
RUN ./autogen.sh
RUN ./configure LDFLAGS=-L`ls -d /opt/db*`/lib/ CPPFLAGS=-I`ls -d /opt/db*`/include/ \
    --prefix=${BITCOIN_PREFIX} \
    --mandir=/usr/share/man \
    --disable-tests \
    --disable-bench \
    --disable-ccache \
    --with-gui=no \
    --with-utils \
    --with-libs \
    --with-daemon
RUN make -j4
RUN make install
# delete symbols from executables for security
RUN strip ${BITCOIN_PREFIX}/bin/bitcoin-cli
RUN strip ${BITCOIN_PREFIX}/bin/bitcoin-tx
RUN strip ${BITCOIN_PREFIX}/bin/bitcoind
RUN strip ${BITCOIN_PREFIX}/lib/libbitcoinconsensus.a
RUN strip ${BITCOIN_PREFIX}/lib/libbitcoinconsensus.so.0.0.0


FROM alpine
LABEL maintainer="Hiroki Tanaka"

# copy applications from bitcoin-core
COPY --from=bitcoin-core /opt /opt

ARG USER_ID
ARG GROUP_ID

ENV BITCOIN_VERSION=0.19.1
ENV HOME /bitcoin

# add user with specified (or default) user/group ids
ENV USER_ID ${USER_ID:-1000}
ENV GROUP_ID ${GROUP_ID:-1000}
ENV PATH=/opt/bitcoin-${BITCOIN_VERSION}/bin:${PATH}

RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/alpine.global.ssl.fastly.net/g' /etc/apk/repositories
RUN apk --no-cache add \
  boost \
  boost-program_options \
  libevent \
  libressl \
  libzmq \
  su-exec \
  bash

RUN addgroup -g ${GROUP_ID} bitcoin; \
    adduser -D -u ${USER_ID} -G bitcoin -h /bitcoin -s "/bin/bash" bitcoin;

# add utilities
ADD ./bin /usr/local/bin
RUN chmod +x /usr/local/bin/btc_*

VOLUME ["/bitcoin"]

EXPOSE 8332 8333 18332 18333 18444 28333

WORKDIR /bitcoin

CMD ["su-exec", "bitcoin", "bitcoind"]

こちらをビルドしました。

% docker build -t bitcoind:0.19.1 -f Dockerfile .

そうしたら・・以下のようなエラーに遭遇

g++: fatal error: Killed signal terminated program cc1plus

調べてみたら・・・原因は「メモリ不足」のようでした・・・

Docker Desktopから Preferences > Resources > Memory を大きく(3GBから8GB)にして再度ビルドしてみます
(最近ローカルの開発マシンをMac Miniにしたので、ここら辺は十分リソースがあって嬉しいです)

今度は、うまくビルドできました。

あとは、docker-compose-data/testnet/bitcoin.conf を作成しておき、以下のように実行します。

% docker run --rm -it -p 18332:18332 -v `pwd`/docker-compose-data/testnet:/bitcoin/.bitcoin bitcoind:0.19.1 bash
# su-exec bitcoin bitcoind

こちらで、ちゃんと動作するのを確認しました。

以下でも同様のTipsを記載しています。
https://kumano-te.com/activities/developed-bitcoind-with-alpine-docker

以上になります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows 10 May 2020 UpdateでのWSL2導入手順

Windows 10の9回目の大型アップデート「May 2020 Update」でようやくWSL2が使えるようになりました。
以下はWSL2の導入、及びWSLをWSL2に切り替える手順です。

⚠︎注意

「Windows 10 May 2020 Update」でブルースクリーン発生やBluetooth、IMEの不具合
のような不具合も出ています。作業を行う際はバックアップをきっちり取った方が良いです。
また、この記事を参考にしたことにより生じたあらゆる損害について筆者は一切の責任を負いません。

前提

  • Windows 10 Pro(多分Homeでも動くが手順は違うと思う)

Windows 10 May 2020 Update の適用

「Windows 10 May 2020 Update」2004(Build 19041)が適用済みでない場合
Windows Updateが降ってくるのを待つでも良いですが以下からUpdateが可能です。
https://www.microsoft.com/en-us/software-download/windows10

Hyper-Vを無効化する

WSLではHyper-Vが必須でしたが、WSL2では不要になりました。
Hyper-Vを有効化しておくことでgRPCのport 50051などHyper-Vが予約しているポートとバッティングしているポートを使用しようとする場合などで困ることになるので必要なければ無効化しておいた方がよさそうです。

Powershellを管理者権限で立ち上げ以下を実行します。

Disable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V")

VirtualMachinePlatformとWSLを有効化する

Powershellを管理者権限で立ち上げ以下を実行します。

Enable-WindowsOptionalFeature -Online -FeatureName $("VirtualMachinePlatform", "Microsoft-Windows-Subsystem-Linux")

WSL2 Linux カーネル更新プログラム パッケージのインストール

以下から「WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードしてきてインストールします。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

(既にWSLが入ってる場合)ディストリビューションの更新

WSLを既に使用してる場合はディストリビューションの更新が必要です。
Powershell を管理者権限で立ち上げて以下を実行します。

  • WSLのディストリビューションを検索
wsl -l -v
#  NAME            STATE           VERSION
#* Ubuntu-18.04    Running         1
  • バージョンを2に上げたいディストリビューションを更新
wsl --set-version Ubuntu-18.04 2

更新までしばらく時間がかかります。

  • ディストリビューションのバージョンが「2」に上がったことを確認
wsl -l -v
#  NAME            STATE           VERSION
#* Ubuntu-18.04    Running         2

(おまけ) Docker for Windowsの設定変更

  • WSL 2 based engine を有効化

image.png

  • WSL INTEGRATION を有効化

image.png

以上で元々Docker for Windowsで動いていたDockerコンテナのWSL2での起動までは確認できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker上にRails環境構築(DBはmariadb)

Docker上にRails環境(DBはmariadb)を構築したい!

ローカル環境上にRailsの環境構築を行うと、どんどんローカルが汚れていくので嫌だなと。
なのでローカル上でDocker for Windowsを使用してRails環境を構築したく記事を書きました。
※色々弄りすぎた結果、この投稿に記載しているDockerファイルやdocker-composeファイルも汚れた状態での投稿になっています。。。綺麗にしたい。。。

構築にあたっての前提環境

構築手順

  1. プロジェクトを作成したい場所にフォルダを作成
  2. 上記で作成したフォルダ内にDockerファイルを作成

    FROM ruby:2.7
    
    ENV LANG C.UTF-8
    ENV WORKSPACE=/usr/local/src
    
    # install bundler.
    RUN apt-get update && \
        apt-get install -y vim less && \
        apt-get install -y build-essential libpq-dev nodejs && \
        apt install -y lsb-release && \
        apt remove -y libmariadb-dev-compat libmariadb-dev && \
        apt-get install -y nginx
    
    RUN wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-common_8.0.18-1debian10_amd64.deb \
        https://dev.mysql.com/get/Downloads/MySQL-8.0/libmysqlclient21_8.0.18-1debian10_amd64.deb \
        https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client-core_8.0.18-1debian10_amd64.deb \
        https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client_8.0.18-1debian10_amd64.deb \
        https://dev.mysql.com/get/Downloads/MySQL-8.0/libmysqlclient-dev_8.0.18-1debian10_amd64.deb
    
    RUN dpkg -i mysql-common_8.0.18-1debian10_amd64.deb \
        libmysqlclient21_8.0.18-1debian10_amd64.deb \
        mysql-community-client-core_8.0.18-1debian10_amd64.deb \
        mysql-community-client_8.0.18-1debian10_amd64.deb \
        libmysqlclient-dev_8.0.18-1debian10_amd64.deb
    
    RUN gem install bundler && \
        apt-get clean && \
        rm -r /var/lib/apt/lists/*
    
    # create user and group.
    RUN groupadd -r --gid 1000 rails && \
        useradd -m -r --uid 1000 --gid 1000 rails
    
    # create directory.
    RUN mkdir -p $WORKSPACE $BUNDLE_APP_CONFIG && \
        chown -R rails:rails $WORKSPACE && \
        chown -R rails:rails $BUNDLE_APP_CONFIG
    
    USER rails
    WORKDIR $WORKSPACE
    
    # install ruby on rails.
    ADD --chown=rails:rails . $WORKSPACE
    RUN bundle install
    
    ADD . /app
    RUN mkdir -p tmp/sockets
    
    # Expose volumes to frontend
    VOLUME /app/public
    VOLUME /app/tmp
    
    # Start Server
    # TODO: environment
    CMD bundle exec puma
    
  3. 同一フォルダにdocker-compose.ymlを作成

    docker-compose.yml
    version: '3.2'
    services:
      api:
        build: .
        command: bundle exec rails s -p 8080 -b '0.0.0.0'
        container_name: '好きなコンテナー名'
        ports:
          - 8080:8080
        volumes:
          - type: bind
            source: ./
            target: /usr/local/src
        restart: always
        environment:
            TZ: Asia/Tokyo
        links:
            - maria-db
    
      maria-db:
        image: mariadb:10.5.2
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
        environment:
            MYSQL_ROOT_PASSWORD: hoge
            MYSQL_DATABASE: hoge
            MYSQL_USER: hoge
            MYSQL_PASSWORD: hoge
        ports:
            - '3306:3306'
        command: --innodb-use-native-aio=0
        volumes:
            - ./docker_config/db/volumes:/var/lib/mariadb
            - ./docker_config/db/my.cnf:/etc/mysql/conf.d/my.cnf
    
  4. プロジェクトの作成
    コマンドプロンプトを立ち上げプロジェクトを作成するフォルダまで移動後、下記コマンドを実行する

    $ docker-compose run --rm api rails new . --force --database=mysql --skip-bundle
    $ docker-compose run --rm api bundle exec spring binstub --all
    
  5. databaseの接続情報を設定
    プロジェクトフォルダ/config/database.ymlにDBの接続情報を記載

    default: &default
    adapter: mysql2
    encoding: utf8
    pool: 5
    username: hoge
    password: hoge
    host: maria-db
    
  6. 起動する

$ docker-compose up
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker の低レベルランタイムを Nabla Container に入れ替え、専用イメージもビルドして動かしてみる

要約

  • コンテナの作成方法は Docker 標準 (containerd + runc) だけではなく、複数存在する。
  • その多くがホストとのカーネル共有から脱却して安全にコンテナを使う方法を検討しており、異なる手法で実現を目指している。
  • Unikernel を使って実現しようとしている IBM の Nabla Container の導入~専用イメージのビルドを実際にやってみました。

コンテナランタイムも runnc も知ってる!という方は以下から。
Nabla Containers のインストール
コンテナランタイムは分かるけど runnc って何?という方は以下から。
Nabla Containers (runnc) とは
コンテナランタイムって何?という方は以下から。
Docker 標準 (containerd + runc) 以外のコンテナ作成方法

Docker 標準 (containerd + runc) 以外のコンテナ作成方法

コンテナの作成・管理を直接的に担っているのはコンテナランタイムと呼ばれる部分です。
多くのコンテナランタイムは次の二層から成ります。

  • 高レベルランタイム: ユーザや Kubernetes のようなコンテナオーケストレータからの命令を受け取り、低レベルランタイムへ指示を出す。
  • 低レベルランタイム: 高レベルランタイムからの指示を受け取り、コンテナ環境を実際に作成する。

Dockerのデフォルトで採用されているコンテナランタイムは以下の通りです。

  • 高レベルランタイム: containerd
  • 低レベルランタイム: runc

これ以外にも様々なコンテナランタイムが存在します。
高レベルランタイムと低レベルランタイムの間のやり取りは OCI という規格で定義されているので、入れ替えて使うこともできます。
主要なランタイムと特色については以下を参照してください。
http://c.itdo.jp/?p=2653

なぜランタイムを入れ替えるのか

多くの場合はセキュリティのためだと思います。
runc はコンテナとホストがカーネルを共有しているため、コンテナが乗っ取られるとホストに被害範囲が拡大する恐れがあります。
Docker デフォルト以外のランタイムはこの問題の抜本的な解決のため、ホストとカーネルを共有しない方向でランタイムの改善を図っています。

Nabla Containers (runnc) とは

  • Unikernel を使ってホストとカーネルを共有せずにコンテナをより安全に動作させるランタイム。runnc とも呼ばれる。
  • ざっくり言うと Unikernel とは、アプリを動作させるための最低限の機能のみを持ち、 1:1 で紐づくカーネルのこと。
  • コンテナライフサイクルのパフォーマンスに優れ、アプリケーションの動作パフォーマンスも比較的良好な一方で、専用イメージでしかコンテナを実行できないなど機能面に大きな制約がある。(具体的な制約は Nabla Containers の Github リポジトリ から確認できます。)

Nabla Containers のインストール

環境

  • OS: Ubuntu 18.04
  • Docker: 19.03.8
  • git: 2.17.1
  • gcc: 6.5.0

実行手順

1. Go のインストール

参考: https://github.com/golang/go#download-and-install
 
1. Go のバイナリをダウンロード。

# ver.1.14.2 は 2020/05/12 時点の最新安定版です。
$ wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz

 
2. /usr/local 下へ解凍。

$ tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz

 
3. 環境変数の設定。

$ export PATH=$PATH:/usr/local/go/bin
$ export GOPATH=$HOME/go

2. Nabla Containers のインストール

参考: https://github.com/nabla-containers/runnc#getting-started-with-the-go-repo
 
1. リポジトリを取得。

$ go get github.com/nabla-containers/runnc

どうやら runc の github リポジトリから依存パッケージを引っ張ってきているらしいですが、依存先から一部のパッケージが消失しておりこんなメッセージが出ますがこの後の作業には差し支えませんでした。

package github.com/opencontainers/runc/libcontainer/label: cannot find package "github.com/opencontainers/runc/libcontainer/label" in any of:
        /usr/local/go/src/github.com/opencontainers/runc/libcontainer/label (from $GOROOT)
        /home/yasuda/go/src/github.com/opencontainers/runc/libcontainer/label (from $GOPATH)

 
2. ホストに genisoimage をインストール。

$ sudo apt install genisoimage。

 
3. ホストに jq をインストール。

$ sudo apt install jq

 
4. コンテナを使ってインストール。

Docker があれば、コンテナ内でビルドした成果物をホストへコピーする形でインストールができます。

$ cd $GOPATH/src/github.com/nabla-containers/runnc
$ make container-build
$ make container-install

 
5. libseccomp-dev をインストール。

$ sudo apt install libseccomp-dev

 
6. /etc/docker/daemon.json を編集して docker デーモン起動時のオプションを追加。

$ vi /etc/docker/daemon.json
/etc/docker/daemon.json
{
    "runtimes": {
        "runnc": {
                "path": "/usr/local/bin/runnc"
        }
    }
}

※他のランタイムと併用したい場合、以下のように , で区切る必要があります。

/etc/docker/daemon.json(複数のランタイムを併用する場合)
{
    "runtimes": {
        "runnc": {
                "path": "/usr/local/bin/runnc"
        },
        "runsc":{
                "path": "/usr/local/bin/runsc"
    }
}

 
7. docker デーモンを再起動。

$ systemctl restart docker

 
8. テストイメージを実行。

$ sudo docker run --rm --runtime=runnc nablact/nabla-node-base:v0.3
nabla-run arg [/opt/runnc/bin/nabla-run --x-exec-heap --mem=512 --net=tap1123274cef1a --disk=/var/run/docker/runtime-runnc/moby/1123274cef1a51a3405f359b4b27f02df95ddcee60dfeafda8c6d10cd187b923/rootfs.iso /var/lib/docker/overlay2/94626cd9623c92c1c5820b39aaf0c369d732ec856ee37a491b349e3679e45951/merged/node.nabla {"env":"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","env":"HOSTNAME=1123274cef1a","cmdline":"/var/lib/docker/overlay2/94626cd9623c92c1c5820b39aaf0c369d732ec856ee37a491b349e3679e45951/merged/node.nabla","net":{"if":"ukvmif0","cloner":"True","type":"inet","method":"static","addr":"172.18.0.2","mask":"16","gw":"172.18.0.1"},"blk":{"source":"etfs","path":"/dev/ld0a","fstype":"blk","mountpoint":"/"},"cwd":"/"}]
nabla-run: WARNING: The use of --x-exec-heap is dangerous and not recommended as it makes the heap and stack executable.
nabla-run: /var/lib/docker/overlay2/94626cd9623c92c1c5820b39aaf0c369d732ec856ee37a491b349e3679e45951/merged/node.nabla: Warning: phdr[0] requests WRITE and EXEC permissions
            |      ___|
  __|  _ \  |  _ \ __ \
\__ \ (   | | (   |  ) |
____/\___/ _|\___/____/
Solo5: Memory map: 512 MB addressable:
Solo5:   reserved @ (0x0 - 0xfffff)
Solo5:       text @ (0x100000 - 0xb0f377)
Solo5:     rodata @ (0xb0f378 - 0xdd3bef)
Solo5:       data @ (0xdd3bf0 - 0x1018aa7)
Solo5:       heap >= 0x1019000 < stack < 0x20000000
rump kernel bare metal bootstrap

[   1.0000000] Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
[   1.0000000]     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
[   1.0000000]     2018 The NetBSD Foundation, Inc.  All rights reserved.
[   1.0000000] Copyright (c) 1982, 1986, 1989, 1991, 1993
[   1.0000000]     The Regents of the University of California.  All rights reserved.

[   1.0000000] NetBSD 8.99.25 (RUMP-ROAST)
[   1.0000000] total memory = 247 MB
[   1.0000000] timecounter: Timecounters tick every 10.000 msec
[   1.0000080] timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
[   1.0000090] cpu0 at thinair0: rump virtual cpu
[   1.0000090] root file system type: rumpfs
[   1.0000090] kern.module.path=/stand/amd64/8.99.25/modules
[   1.0200090] mainbus0 (root)
[   1.0200090] timecounter: Timecounter "bmktc" frequency 1000000000 Hz quality 100
[   1.0200090] ukvmif0: Ethernet address 06:bb:07:e1:d1:56
[   1.0662231] /dev//dev/ld0a: hostpath XENBLK_/dev/ld0a (45002 KB)
mounted tmpfs on /tmp

=== calling "/var/lib/docker/overlay2/94626cd9623c92c1c5820b39aaf0c369d732ec856ee37a491b349e3679e45951/merged/node.nabla" main() ===

rumprun: call to ``_sys___sigprocmask14'' ignored
rumprun: call to ``sigaction'' ignored
Hello, Rump!!

=== main() of "/var/lib/docker/overlay2/94626cd9623c92c1c5820b39aaf0c369d732ec856ee37a491b349e3679e45951/merged/node.nabla" returned 0 ===

=== _exit(0) called ===
[   1.2419573] rump kernel halting...
[   1.2419573] syncing disks... done
[   1.2419573] unmounting file systems...
[   1.2421135] unmounted tmpfs on /tmp type tmpfs
[   1.2421135] unmounted /dev//dev/ld0a on / type cd9660
[   1.2421135] unmounted rumpfs on / type rumpfs
[   1.2421135] unmounting done
halted

お疲れさまでした。インストールは終了です。

専用イメージをビルドする

参考: https://github.com/nabla-containers/nabla-base-build

  1. ローカルリポジトリを用意。
$ mkdir localrepo
$ cd localrepo
$ git init

 
2. Nabla Containers が公開する、nabla-base-build リポジトリをクローン。

$ git clone https://github.com/nabla-containers/nabla-base-build.git

 
3. サブモジュールをフェッチ。

$ ls -la
$ cd nabla-base-build
$ git submodule update --init --recursive

 
4. zlib1g-devとlibseccomp-devをインストール。

$ apt install zlib1g-dev libseccomp-dev

 
5. gcc のバージョンが 5 か 6 であることを確認。

gcc --version

 
6. gcc のバージョンが 5 か 6 でない場合、 6.5 をインストール。

内部では rumprun が Unikernel を提供しているのですが、7 以上のバージョンだと rumprun のビルドが失敗します。

$ sudo apt-get update && \
sudo apt-get install build-essential software-properties-common -y && \
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
sudo apt-get update && \
sudo apt-get install gcc-6 g++-6 -y && \
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6 && \
$ gcc -v

7.gcc-6 を明示的に指定。

$ export CC=gcc-6

 
8. pcre のダウンロード元を変更。

pcre のダウンロード元として指定されている ftp.csx.cam.ac.uk ですが、現在は存在していません。
代わりになるダウンロード先を指定します。

$ vi rumprun-packages/pcre/Makefile
rumprun-packages/pcre/Makefile
include ../Makefile.inc
#UPSTREAM=ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz #この行をコメントアウト
UPSTREAM=ftp://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz # この行を追加

 
9. イメージをビルド。

インストール可能なイメージは以下の通り。

  • nginx-base
  • node-base
  • python3-base
  • redis-base
  • go-base
# 全てのイメージをビルドしたい場合
$ make world
# または、特定のイメージのみビルドしたい場合
$ make -C nginx-base

 
10. イメージを確認。

$ sudo docker images

 
11. nginx コンテナを実行して実際にブラウザから接続してみる。

$ sudo docker run --rm -d -p 80:80 --name nabginx nabla-nginx-base

docker ホストのポート80番へ接続すれば nginx コンテナの同ポートへ転送されます。

nabginx.png

おわりに

この後、対話的シェルを呼び出してバージョンを確認しようと思ったのですが、 Nabla Containers の制約 を読む限り docker exec や docker run -it などコンテナ作成後に任意のコマンドを実行する手段に対応していないようだったので断念しました。今の段階で運用するには機能面の制約が大きく感じますが、Unikernels は数あるカーネル分離へのアプローチの中でも光るものがある技術であると感じます。今後の動向にも着目していきたいと思います。

ちなみに記事中でも触れたパフォーマンス面ですが、弊社 web サイトにて Redis-benchmark と Apache benchmark を使った runc との動作パフォーマンス比較があるので、よろしければご参照ください。
http://c.itdo.jp/?p=2653#nablavsrunc

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Rails 起動しなくなった

前提

DockerでRails環境を構築し、突然コンテナが起動しないくなった原因と解決方法について記述します。

本題

dockerのアップデート終了後にdocker-compose up -dで立ち上げても一瞬で終了してしまうことがありました。

原因

すでにサーバーが起動していると認識していたからでした。

まずは、ログを確認します。

$ docker-compose up

確認すると、、、

#省略
 ・
 ・
 ・
db_1               | 2020-05-28T04:13:02.167787Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1               | 2020-05-28T04:13:02.207302Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200528  4:13:02
db_1               | 2020-05-28T04:13:02.234813Z 0 [Note] Event Scheduler: Loaded 0 events
db_1               | 2020-05-28T04:13:02.235265Z 0 [Note] mysqld: ready for connections.
db_1               | Version: '5.7.30'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
web_1              | => Booting Puma
web_1              | => Rails 5.2.3 application starting in development 
web_1              | => Run `rails server -h` for more startup options
web_1              | A server is already running. Check /app/tmp/pids/server.pid.
web_1              | Exiting

上記のように、A server is already runningとなっており、サーバーがすでに立ち上がっているから終了してしまっていることがわかります。
tmp/pids/server.pidというファイルが原因となってます。
確認してみると、、、

$ cat tmp/pids/server.pid
1

この1という数字はRails ServerのPID(Process ID)となります。
Linuxでは各プロセスにIDをつけて管理しています。
またDockerでは, プロセスIDが1であるプロセスが終了した場合、コンテナも終了するようになっているとのことです。

解決方法

$ rm tmp/pids/server.pid

上記でtmp/pids/server.pidを削除後、再度立ち上げると無事に立ち上がりました!

$ docker-compose up -d

毎回 rm tmp/pids/server.pid するのも手間であるため、docker-compose.ymlを修正しました。

docker-compose.yml
#変更前
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
    environment:
    - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"
docker-compose.yml
#変更後
version: '3'
services:
  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
    environment:
    - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Composeを使った初期装備なRails6/PostgreSQL環境の作り方

Docker Composeを使ったRails環境を作る場合、Quickstart: Compose and Rails | Docker Documentationがとても参考になります。ただし、このドキュメントはRails5を前提として書かれており、現時点(2020-05-28)で最新のRails6を使う場合には一部修正が必要です。

そこでこの記事では、Rails6を使う場合について記載します。また、この記事の対象読者は下記を想定しており、環境構築は下記の方針と前提に基づいて行ないます。

:family_mmgb: 想定読者

  • Rails環境構築でいつも躓くの方(丁寧めに説明します)
  • 未来の自分(思い出せるように書きます)

:telescope: 方針

:pushpin: 前提

  • dockerをインストール済みである
  • gitをインストール済みである

なお、今回の作業内容はこちらのプルリクエスト https://github.com/tanaken0515/docker-compose-rails-sample/pull/1 にまとまっています。

では、やっていきましょう。

リポジトリを作る

まずはリポジトリを作りましょう。

$ mkdir docker-compose-rails-sample
$ cd docker-compose-rails-sample
$ git init
$ touch README.md
$ git add .
$ git commit -m "initial commit"

ここではdocker-compose-rails-sampleという名前でリポジトリを作りました。
空のREADME.mdを作ってコミットしています。

プロジェクトを定義する

ここから環境構築です。
まずは https://docs.docker.com/compose/rails/#define-the-project をまるっと書き写しながらファイルを作っていきます。
このドキュメントは解説も交えて書かれているので、詳しくはドキュメントを参照してください。

(英語のドキュメントが苦手な方は @daichi41 さんが書かれた DockerでのRuby on Rails環境構築を一つずつ詳解する - Qiita と照らし合わせながら読むと理解が進むかもしれません)

一つ目はDockerfileです。FROM ruby:2.5となってますがこれは後で書き換えるのでいったんそのままで。

Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

次にGemfileです。gem 'rails', '~>5'となってますがこれもあとで書き換えます。このままで。

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5'

Gemfile.lockは空のファイルを作っておきます。これはあとでrails newするときに上書きされます。

$ touch Gemfile.lock

続いてentrypoint.shです。これもそのまま。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

説明の都合上、ここまでいったんコミットしました。

さて、Ruby2.7とRails6を使うために少し手を加えます。

DockerfileのベースイメージをRuby2.7にします。また、Rails6のデフォルトではWebpackerを使うのでyarnpkgもインストールするようにしておきます。

Dockerfile
-FROM ruby:2.5
-RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
+FROM ruby:2.7
+RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarnpkg
+RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn
 RUN mkdir /myapp
 WORKDIR /myapp
 COPY Gemfile /myapp/Gemfile

Gemfileのrailsを~>6に書き換えます。

Gemfile
 source 'https://rubygems.org'
-gem 'rails', '~>5'
+gem 'rails', '~>6'

プロジェクトの定義はこれで完了です。

プロジェクトをビルドする

https://docs.docker.com/compose/rails/#build-the-project の通りに進めます。

まずはrails newします。少々時間がかかりますので休憩しつつ待ちましょう。(僕の環境では15分くらい待ちました)

docker-compose run web rails new . --force --no-deps --database=postgresql

rails newしたことで、たくさんのファイルが生成されているはずです。
(この段階でコミットしておくと良いでしょう)

続いてビルドしましょう。これも少々時間がかかります。(僕の環境では10分くらいでした)

docker-compose build

プロジェクトのビルドはこれで完了です。

データベースに接続する

https://docs.docker.com/compose/rails/#connect-the-database に沿って進めます。

rails newしたときにconfig/database.ymlが生成されています。これを書き換えます。

config/database.yml
 default: &default
   adapter: postgresql
   encoding: unicode
-  # For details on connection pooling, see Rails configuration guide
-  # https://guides.rubyonrails.org/configuring.html#database-pooling
-  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+  host: db
+  username: postgres
+  password:
+  pool: 5

 development:
   <<: *default

アプリケーションを起動します。

$ docker-compose up

おっと、ここでエラーに遭遇しました。

db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   | 
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   | 
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html
docker-compose-rails-sample_db_1 exited with code 1

一旦別のターミナルで以下を実行して、アプリケーションを停止しましょう。

$ docker-compose down

さて、先ほどのエラーは割と最近の変更によってPostgreSQLにパスワードなしでアクセスできなくなったからのようです。
ref: https://github.com/docker-library/postgres/issues/681

ここまでの手順でインストールされたPostgreSQLのバージョンはdocker-compose.ymlで指定されたimage: postgresに依存していますが、そもそもここでバージョンを指定していないので、どのバージョンがインストールされるのかが自明ではないですね(最新の安定版がインストールされそう)

docker-compose.ymlでPostgreSQLのバージョンを指定し、環境変数にPOSTGRES_HOST_AUTH_METHOD=trustを設定しましょう。
バージョンは https://hub.docker.com/_/postgres をみて現時点(2020-05-28)で最新安定版の12.3を指定します。

docker-compose.yml
 version: '3'
 services:
   db:
-    image: postgres
+    image: postgres:12.3
     volumes:
       - ./tmp/db:/var/lib/postgresql/data
+    environment:
+      POSTGRES_HOST_AUTH_METHOD: trust
   web:
     build: .
     command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

改めてアプリケーションを起動します。

$ docker-compose up

warningが出ますが、無事にデータベースと接続することができました。

db_1   | ********************************************************************************
db_1   | WARNING: POSTGRES_HOST_AUTH_METHOD has been set to "trust". This will allow
db_1   |          anyone with access to the Postgres port to access your database without
db_1   |          a password, even if POSTGRES_PASSWORD is set. See PostgreSQL
db_1   |          documentation about "trust":
db_1   |          https://www.postgresql.org/docs/current/auth-trust.html
db_1   |          In Docker's default configuration, this is effectively any other
db_1   |          container on the same system.
db_1   | 
db_1   |          It is not recommended to use POSTGRES_HOST_AUTH_METHOD=trust. Replace
db_1   |          it with "-e POSTGRES_PASSWORD=password" instead to set a password in
db_1   |          "docker run".
db_1   | ********************************************************************************
(中略)
db_1   | PostgreSQL init process complete; ready for start up.
db_1   | 
db_1   | 2020-05-28 01:21:45.583 UTC [1] LOG:  starting PostgreSQL 12.3 (Debian 12.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1   | 2020-05-28 01:21:45.583 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2020-05-28 01:21:45.584 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2020-05-28 01:21:45.588 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2020-05-28 01:21:45.694 UTC [58] LOG:  database system was shut down at 2020-05-28 01:21:45 UTC
db_1   | 2020-05-28 01:21:45.735 UTC [1] LOG:  database system is ready to accept connections

データベースへの接続はこれで完了です。

アプリケーションの動作確認

ここまでの状態で localhost:3000 にアクセスするとActiveRecord::NoDatabaseErrorになります。データベースの環境に接続できる状態ではあるものの、このアプリケーション用のデータベースを作っていないからですね。

ドキュメントに従って以下を実行しましょう(アプリケーションを起動したターミナルとは別のターミナルで実行して下さい)。
データベースが作成されます。

$ docker-compose run web rake db:create
Starting docker-compose-rails-sample_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'

改めて localhost:3000 にアクセスするとお馴染みのこの画面が出るはずです。

スクリーンショット 2020-05-28 10.30.38.png

環境構築は以上です! :tada::tada::tada:

まとめ

今回はQuickstart: Compose and Rails | Docker Documentationに沿ってRuby2.7とRails6の環境を作る方法についてまとめました。参考になれば幸いです。

なお、この記事の続編として以下のような記事を書いていこうかなと思っています。

  • Docker Composeのvolumesを使ってもっと効率的に
  • 初期装備なRails6にVue.jsを導入する
  • Docker Composeでwebpack-dev-serverを動かしてもっと快適に

(予定は未定です)

ではまた〜

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kubernetesコマンド

Pod

Pot List

kubectl get pods
kubectl get pods -o wide
kubectl get pods -n kube-system // namespace指定
kubectl get pods --selector app=app1,env=prod // labelフィルタリング
kubectl get pods --all-namespaces

Pot Status

kubectl describe pod pod-name

Create Pod

kubectl run pod-name --image nginx

Edit Pod

kubectl edit pod pod-name
kubectl get pod pod-name -o yaml > pod.yaml

Create Pot By YML

kubectl create -f pod-difinition.yml
kubectl apply -f pod-difinition.yml

Delete Pod

kubectl delete pod pod-name

ReplicaSet

Get Replicaset

kubectl get replicaset

Delete Replicaset

kubectl delete replicaset replicaset-name

Scale

kubectl replace -f replicaset-definition.yml
kubectl scale --replicas=6 -f replicaset-definition.yml
kubectl scale --replicas=6 replicaset myapp-replicaset

Generate Deployment YAML file (-o yaml)

kubectl create deployment --image=nginx nginx --replicas=4 --dry-run -o yaml > nginx-deployment.yaml

Namespace

Get Pods

kubectl get pods --namespace=stg
kubectl get pods --all-namespaces

Change Defualt Namespace

kubelctl config set-context $(kubectl config current-context) --namespace=dev

Scheduling

Taints | Tolerations -Node

kubectl taint nodes node1 app=blue:NoSchedule // NoSchedule | PreferNoSchedule | NoExecute
// YAML側の設定は以下
spec:
 tolerations:
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule" 

Remove Taints

kubectl taint nodes node1 app=blue:NoSchedule-

Kubemaster

kubectl describe node kubemaster | grep Taint

Node Slector | Label Nodes

kubectl label nodes node-name label-key=label-name
// YAML側の設定は以下
spec:
  nodeSelector:
    label-key: label-name

Node Affinity

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
            - key: security
              operator: In
              values:
              - S1
  containers:
  - name: with-pod-affinity
    image: k8s.gcr.io/pause:2.0

Get Events

kubectl get events | grep schedule

Get Logs

kubectl get logs | grep schedule
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows 10 homeでDocker Desktopを利用する。【初心者】

Windows 10 homeでDocker Desktopを利用してみたい!!

Docker DesktopWindows 10 homeでも利用できるようになっていました!

Windows 10 homeでDocker Desktopを利用するには

  • 必要な環境
    • Windows Subsystem for Linux 2(WSL2)

しかし、Microsoftの公式サイトによると、WSL2を利用するには、Windows 10 home, version 2004 (Build 19041)以上でなければならない。

Windows 10 home, version 2004 (Build 19041)へのアップデートの仕方

Windows 10 home, version 2004 (Build 19041)Windows Insider programに参加することで手に入るらしいので、さっそく参加してみる。(無料)

Windows Insider programに参加する方法

こちらの公式サイトからSettings > Update & Security > Windows Insider Programをクリック。

設定画面が開くのでMicrosoft Accountを登録、そして参加。

Windows 10 home, version 2004 (Build 19041)へのアップデート

公式サイトSettings > Update & Security > Windows Updateをクリックすると、設定画面が開く。

そして、Windows Updateを選択してWindows 10 home, version 2004 (Build 19041)のインストールとダウンロードをしばし待ちます。

再起動を促されるので、再起動するとWindowsのアップデートがはじまる。

これが終わればWindows 10 home, version 2004 (Build 19041)にアップデートされていると思います。

WSL2のインストール

まずはWSL1を利用できるようにします。

まずは、PowerShellを管理者権限で開きます。
管理者権限での開き方は、タスクバーの検索に"PowerShell"と入力し、"Windows PowerShell"を右クリックして"管理者として実行"を選択すると開けます。

次に、Microsoft公式サイトのあるようにPowerShellで次のように入力して実行。(~>は入力しない)

~> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Microsoft Storeで好きなLinux Distributionをインストールします。

これでWSL1は利用できるようになったと思います。

WSLの設定を反映するために再起動が必要かもしれません。

※Windowsの設定->更新とセキュリティ->開発者向けから開発者モードをオンにしないといけないかもしれません。

WSL2へアップデートの仕方

まずは、WSL2へアップデートする前に'Virtual Machine Platform' optional componentを利用できるようにしなければいけません。

公式サイトのように、再びPower Shellを管理者権限で実行し、次のように入力して、実行します。

~> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

※再び設定変更を反映させるために再起動が必要かもしれません。先ほどのコマンドとこのコマンドを実行してから再起動した方がいいかもしれません。(時短)

WSL2を利用するにはLinux kernelのアップデートが必要

公式サイトからご自身のPCのアーキテクチャにあった更新プログラムをダウンロードします。

そして実行。

ご自身のPCアーキテクチャが異なっていればエラーが出るのですぐにわかると思います。

アップデートが終われば再起動。

最後にPower Shellを管理者権限で開いてWSL2をデフォルトに設定します。

~> wsl --set-default-version 2

最後にDocker Desktopをインストール

dockerhubからDocker Desktop for Windows(stable)をダウンロード!

ダウンロードしたDocker Desktop Installer.exeを実行してインストールすると、晴れてWindows 10 homeDocker Desktopを利用できるようになります。

dockerdesktop.png

※Docker Desktopの画面が立ち上がらないときはWindowsタスクバーの^マークをクリックして、白いクジラにカーソルを合わせるとDocker Desktop is runningが表示されるので、白いクジラをクリックしてDashboardをクリックすると立ち上がると思います。

最後に動作確認

画面の通り、コマンドプロンプトで

~> docker run -dp 80:80 docker/getting-started

と実行すると、

firstcontainer.png

コンテナが立ち上がりました。

やったね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Desktopインストール後WSL2でもつまずいたのでメモ

以前、Dockerのインストールでつまずいたのでメモ
という記事を投稿したが、その後も実際にDockerを使えるまでにいろいろとつまずいたので自分用の備忘録。

ではいこう!

【環境】
Windows HOME(64bit)

【流れ】

基本的には公式の手順に従ってやった。
WindowsホームにDockerデスクトップをインストールする

Windows HOMEはWSL2を使ってDockerを扱う。
なんでWSL2の設定やらなんやらしないといけないわけで、こっちも公式(MicroSoft)の手順に従ってやった
Windows 10 用 WSL のインストール ガイド

手順をもらうと分かるが、MicroSoft Storeからお好きなLinux ディストリビューションをインストールすることになっている。
自分はUbuntuをインストールしたが、そのあとが問題だった。

つまずいたトコ

その1.0x80370102 エラー

初めての起動だとコンソール ウィンドウが開き、もろもろ自動で設定されたのちに、ログインユーザとパスワードを設定しろといわれるはずなのだが、
Setting...
という画面で数秒固まったあと出てきたのは
0x80370102
というエラー。

原因

コンピューターの BIOS 内部で仮想化が有効になっていなかった。
Windows 10 用 WSL のインストール ガイドにもこのエラーについては書いてあったけど普通に読み飛ばしてた。

対処方法

BIOSを起動して仮想化を有効にする。
BIOSの起動方法はメーカーによって若干異なる。
自分のはLenovo製だったのでこっちも公式に則ってやった。
BIOSの入り方(でもこの手順、他メーカーでもいけそう。。。)

BIOSに入ったら
「UEFI firmware settings」選んで

configurationのIntel Virtual Technologyをenableへ

有効になったかの確認はパフォーマンスマネージャーから
img.png

その2.0xC03A001A エラー

その1のエラーが解決して、「よろしくおねがいしまーーす!!」とばかりに意気揚々とEnterを押してUbuntoを起動させた。(気分はサマーウォーズのラストシーン)

しかし
Setting...
という画面で数秒固まったあと出てきたのは
0xC03A001A
というエラー。
(サマーウォーズだったら死んでた)

原因

WSLのフォルダが圧縮対象になっていた

対処方法

これに関してはQiitaで別に記事を上げているお方がいるのでそっち参照。
WSL2 にしたいのにエラーが出る問題

その3.0x80370109エラー

その2のエラーが解決して、再度、「よろしくおねがいしまーーす!!」とばかりに意気揚々とEnterを押してUbuntoを起動させた。(気分はサマーウォーズのラストシーン)

しかし、またもや
Setting...
という画面で数秒固まったあと出てきたのは
0x80370109
というエラー。
(サマーウォーズだったらまた死んでた)

対処方法

再起動したら治った。(原因はようわからん)

エンドロール

こうしてようやくUbuntoも正常に立ち上がり、Dockerの起動までもっていくことができた。
無事、「よろしくおねがいしまーーす!!」とばかりに意気揚々とEnterを押してもUbuntoが起動するようになった(サマーウォーズだったら彼女できてた。。。)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

個人でRedmine環境用意する

Redmine構築手順

個人のタスク管理にもRedmine使ってみたくなった。
最初はローカルのMacで起動させてたけどちゃんとサーバ用意して動かしたくなったのでやってみた。

0. サーバの用意

dockerコンテナを動かすサーバを用意する。

  • 自由にできるサーバを手に入れる
    • さくらVPSサーバを申し込んだ
    • とりあえず有名なところかつお財布にダメージが少なめな月額800円のやつ
    • 2週間お試しなのでひよこエンジニアにはちょうど良さそうだった
  • OSインストール
    • デフォルトがCentosなのでそのままでいい場合は不要
    • 今回はCentos7を使った

1. dockerのインストール

今回、Redmineはdockerイメージで配布されているものを使用するのでサーバにdockerをインストールする。
(bitnami Redmineでも良かったかも)

  • sshでサーバにログイン
    • 今回はパスワード認証で進める(公開鍵認証の設定は割愛)
    • rootでやってるんかいというのも一旦置いておく
# ログイン
 ssh root@[各自のドメイン].vs.sakura.ne.jp
  • yumの更新とリポジトリの設定(念為)
# 更新
yum update
yum upgrade
# yumリポジトリの設定
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • dockerのインストールと設定
yum install -y docker-ce docker-ce-cli containerd.io
  • dockerの起動と自動起動の設定
# 起動
systemctl start docker
# サーバ起動時に自動で起動する設定
systemctl enable docker

2. Redmineの導入

公式のdockerイメージを使ってRedmineを構築する。

  • dockerイメージの入手と起動
    • 引き続きsshでログインした状態で作業
# イメージの入手
docker pull redmine
# コンテナの起動(バックグラウンドで実行)
docker run -p 3000:3000 --name redmine redmine &
# 確認
docker ps
curl http://localhost:3000/

3. プラグインの適用

かんばんを使いたかったのでAgilePluginをRedmineに導入する。
不要な場合はここはスキップして問題ない。

  • プラグインをローカルで入手、解凍する
    • 公式からダウンロード
  • ローカル → サーバにプラグインを転送
    • 転送用のディレクトリをサーバに用意
# (サーバにログインした状態で)任意のディレクトリで作成
mkdir tmp
cd tmp
# 確認
pwd
  • プラグインの転送
    • サーバではなくローカルのシェルで実行
scp -r [ダウンロードしたプラグインのパス] root@[各自のドメイン].vs.sakura.ne.jp:[作成したtmpディレクトリのパス]
  • サーバに転送したプラグインをコンテナに持っていく
    • 最終的にプラグインを持っていくコンテナ上のディレクトリを確認する
# (サーバにログインした状態で)コンテナに入る
docker exec -i -t redmine bash
# プラグインを入れるディレクトを確認する
cd plugins/
pwd
# コンテナから出る
exit
  • Redmineを動かしているコンテナにプラグインを持ち込む
# 作成したtmpディレクトリの1つ上のディレクトリで実行
docker cp ./tmp/. redmine:[コンテナ上のプラグインを入れるディレクトリのパス/]
  • プラグインをコンテナ上にインストールする(インストール後再起動)
# コンテナに入る
docker exec -i -t redmine bash
# プラグインのインストール
bundle install
bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
# コンテナから出てコンテナ再起動
exit
docker restart redmine
  • ブラウザから以下にアクセスしてRedmineのトップページが表示されればOK

    • http://[各自のドメイン].vs.sakura.ne.jp:3000/
    • お試し期間終わったらhttpsにします
  • admin/adminでログイン後、Agileプラグインが有効になっていることを確認して終わり
    スクリーンショット 2020-05-27 23.39.05.png

おわり

割とあっさり用意できたので満足。
いくつか課題も残ってるのでその辺りは使いながらおいおい対応。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む