20201104のdockerに関する記事は21件です。

docker compose build のメモリ容量不足の対策

こちら参照。
https://kazmax.zpp.jp/linux_beginner/mkswap.html

解決策 swap領域を追加し、bundle installを可能にする。

以下エラー文。

Installing nokogiri 1.10.10 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /usr/local/bundle/gems/nokogiri-1.10.10/ext/nokogiri
/usr/local/bin/ruby -r ./siteconf20201104-6-1o7c1oy.rb extconf.rb
Cannot allocate memory - /usr/local/bin/ruby -r ./siteconf20201104-6-1o7c1oy.rb
extconf.rb 2>&1

Gem files will remain installed in /usr/local/bundle/gems/nokogiri-1.10.10 for
inspection.
Results logged to
/usr/local/bundle/extensions/x86_64-linux/2.5.0/nokogiri-1.10.10/gem_make.out

An error occurred while installing nokogiri (1.10.10), and Bundler cannot

continue.
Make sure that `gem install nokogiri -v '1.10.10' --source
'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  rails was resolved to 5.2.4.4, which depends on
    actioncable was resolved to 5.2.4.4, which depends on
      actionpack was resolved to 5.2.4.4, which depends on
        actionview was resolved to 5.2.4.4, which depends on
          rails-dom-testing was resolved to 2.0.3, which depends on
            nokogiri
ERROR: Service 'app' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 5
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

React.js × TypeScript × Material-UI on docker環境を作ってみた

本記事について

本記事は、Docker上でReact×TypeScript×Material-uiが動く環境を作ってみた記事になります。
これからDockerで開発環境をサクッと作りたい方々にとっては参考になる部分もあるかなと思います!
もし、内容等に間違い、またアドバイス等ございましたらご教示いただけると非常に助かります。。

今回使用した主な技術は以下になります。

  • Docker,Docker-compose
  • React.js (version.17.0.1)
  • TypeScript
  • material-ui (version.4.11.0)

作成前のスペック

  • VueでSPAを作ったことはある。
  • Dockerはなんとなく・・(実務未経験)

作ろうと思った背景

最近Vueが少しわかるようになってきて、他のJSのFWやライブラリについても勉強して、
新たな知見が得られればいいなぁ。。と思い、ReactとTypeScriptを勉強し始めました。

とりあえず理解を深めるために、なにか形になるものを作りたいなー。と考え、
まずは開発環境を構築しよう!ということで、今回やってみました。

開発環境作成

ひとまず、作業用ディレクトリを切ります。
今回は、react-todos(ディレクトリ名)を切りました。

mkdir react-todos

次に、プロジェクトのルートディレクトリに、Dockerfile、docker-compose.ymlをそれぞれ作成します。

Dockerfile作成

#Dockerfileの作成
vi Dockerfile

ベースとなるimageの取得。今回は最新版(2020/11/1時点で)を取ってきました。
https://hub.docker.com/_/node

Dockerfile
FROM node:15.0.1-alpine3.10

docker-compose.ymlの作成

https://docs.docker.com/compose/compose-file/ からテンプレートを取得し、ゴニョゴニョします。

#docker-compose.ymlの作成
vi Docker-compose.yml
docker-compose.yml
version: "3.8"
services:
  front:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./front:/front
    working_dir: /front
    command: node
    tty: true
# コンテナ立ち上げ
docker-compose up

nodeのコンテナが立ち上がったことが確認できたら、コンテナ内部に入り、Reactのプロジェクトを作成していきます。

コンテナ内部に入り、Reactプロジェクト作成。

# コンテナに入る。
docker-compose exec front sh
# Create React Appで、TypeScriptを使用するには、以下のコマンドを実行します。
npx create-react-app my-app --template typescript

front/my-app配下に、Reactのプロジェクトが作成されたことを確認できたら、
再度Dockerfileと、docker-compose.ymlファイルを修正し、コンテナを立ち上げます!

Dockerfile
FROM node:15.0.1-alpine3.10
#下2行を追記!
COPY ./front /front 
WORKDIR /front 
docker-compose.yml
version: "3.8"
services:
  front:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./front:/front
    working_dir: /front/my-app #修正!
    command: sh -c "npm install & npm start" #修正!
    tty: true
    ports:
      - 3000:3000 #ポートを指定!

再度コンテナを立ち上げて、http://localhost:3000/ にアクセスできるか確認しましょう!

# コンテナ立ち上げ
docker-compose up

無事に画面が起動したでしょうか??

Material-uiのインストール

次に、ReactのUIフレームワークである、Material-uiをインストールしていきます。再びコンテナの内部に入ります。

# /front/my-appディレクトリ内でインストール
npm install @material-ui/core
npm install @material-ui/style

しかし、、ここで問題が発生。。インストールができない。。
どうやら、Reactのバージョンが、material-uiのバージョンと合わなかったため、依存関係のエラーが出ていたよう・・
詳細はこちらで記述しました。

https://qiita.com/koh97222/items/c46d1ef2a63b92bb6c15
(ERESOLVE unable to resolve dependency treeの解決方法)

結果、https://github.com/mui-org/material-ui/issues/23306 を参考に、以下のコマンドを実行。

# /front/my-appディレクトリ内でインストール
npm install --save --legacy-peer-deps @material-ui/core

installできたら、tsconfig.jsonを修正し、TypeScript環境でもmaterial-uiが動くようにします。

tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["ES6", "dom", "dom.iterable", "esnext"], // ES6を追加
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    // 3行を追加
    "noImplicitAny": true,
    "noImplicitThis": true,
    "strictNullChecks": true,
    "jsx": "react"
  },
  "include": ["src"]
}

tsconfig.jsonが修正できたら、material-uiが実際に使えるかどうか試すために、一個コンポーネントを作ってみようと思います。
今回は、srcディレクトリの配下にcomponentsディレクトリを作成し、
そのディレクトリ内で、ButtonコンポーネントをラップしたWrapButton.tsxを作成しました。

.components/WrapButton.tsx
import React from "react";
import { Button } from "@material-ui/core";

const WrapButton = () => {
  return (
    <>
      <Button variant="contained" color="secondary">
        Hello World!
      </Button>
    </>
  );
};

export default WrapButton;
App.tsx
import React from "react";
import logo from "./logo.svg";
import "./App.css";
import WrapButton from "./components/WrapButton";

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
     // ↓追加
        <WrapButton />
      </header>
    </div>
  );
}

export default App;

スクリーンショット 2020-11-02 23.56.07.png

ちょっと不格好ですが、Buttonコンポーネントが表示できていることが確認できましたね!(メールの通知は気にしないでください・・笑)
ひとまず開発環境が整ったので、ここから好きなようにゴニョゴニョしていきましょう!

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

EC2/Docker/LaravelでHelloWorld

経緯

Laradocを使ったWebアプリの開発の勉強を始めています.

AWSとLaravel,docker,docker-compose勉強し始めて、1ヶ月ほどたって、
Docker/Doker Compose/AWSの使い方にはなれてきたので、Laradocでデプロイしてみたいなぁと思って、自分の勉強のために残しておきます。(2020年11月4日時点)

参考にさせていただいたのサイトは下記のところです。

https://laraweb.net/tutorial/6578/
https://noumenon-th.net/programming/2019/06/16/laradock/

参考にした本は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版」です。

docker,docker-composeの基礎知識は下記のudemy講座で勉強しました。

https://www.udemy.com/course/aidocker/

色々な知識与えてくれた上記の作者の方々に感謝です。

では早速やっていきましょう

ゴール

AWSでどこからでもアクセスできるLaravelのWebアプリをデプロイする。
本来はローカルでLaradoc作って、Webアプリ開発してそれをgit cloneするのだと思いますが、
全部AWSで完結します。

laravelの実行環境

Ubuntu:18.04
PHP : 7.3
mysql : 5.4
Docker : 19.03.13
Docker-compose : 1.17.1

リージョンの選定

東京リージョンで作成しましょう

VPCの作成

image.png

image.png

1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
image.png

VPC
image.png

EC2インスタンスの作成

EC2をコンソールから選択してインスタンスを起動をクリック
image.png

Ubuntu 18.04を選択
ステップ2でt2.microを選択
image.png

ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
image.png

ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
image.png

ステップ7 で起動をクリック。
      SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。

image.png

この間で、mykey.pemの認証をしましょう。

ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

しばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
image.png

SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。

image.png

ターミナルを開いて
mykey.pemのあるディレクトリに移動(cd)

先程AWSでコピーした
ssh ~~~
をターミナルに貼り付け。Enter

そしたら先程作成したEC2に入れます。
その後、
yesと入力
ここまででEC2の起動は終わりです。

EC2の中で、Docker,Git,Docker-composeをインストール

ubuntu@ip-10-0-0-205:~$ sudo su
root@ip-10-0-0-205:/home/ubuntu# 

以下root内での作業

じゃんじゃん下のコマンド打っていきましょう
apt-getのアップデートして,gitをインストール
apt-get update
apt-get install git

dockerとdocker-composeをインストール

$ apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

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

$ apt-key fingerprint 0EBFCD88

$ add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"
$ apt-get install docker-ce docker-ce-cli containerd.io

$ apt install docker-compose
exit

でrootから抜け出す

Laradocをgit cloneする。

https://laradock.io/

git clone https://github.com/Laradock/laradock.git

lsでgit cloneされているか確認しましょう。
image.png

$ cd laradockとして
$ cp env-example .env
とりあえず、PHP=7.3
mysqlで実行することにしてみましょう。
実行。

docker-compose up -d apache2 mysql

してapace2 mysqlのdockerを起動。
10分ほどまちます。Youtubeでも見ながらゆっくりしましょう。

workspaceコンテナに入ります。

dockerのインストールが終了したら、下記コマンド実行して、
workspaceで作業しましょう。

docker-compose exec --user=laradock workspace bash

でworkspace内で、docker-compose 起動します。

そうすると、var/www$に移動します。
laradockフォルダがあるので、

$ cd laradoock
として、.envファイルを編集します。
$ cp env-example .env
しましょう

下記を.envに追加
vi .env実行して下記追加。

DB_HOST=mysql
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

LaravelでWebアプリの作成

今回はサンプル用のアプリ名をSampleProjectとします。

laradock@e00afef1d36e:/var/www$ composer create-project laravel/laravel SampleProject "5.5.*"

そしたらSampleProjectができます。

var/www --- laradock
         |_ SampleProject

という構成になります。

SampleProjectに入って.envを編集。

DB_CONNECTION=mysql 
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

としてDB_HOSTをmysqlにします。

そして,Laradock内の.envを下記の通り編集して、起動するlaravelアプリを選択。
ここを記述しないと認識されないんだと思います。

APP_CODE_PATH_HOST=../SampleProject

とりあえずの設定は終わりました。

laradocのファルダに移動して、docker-compose再起動して、変更を読み込み。

docker-compose up -d nginx mysql phpmyadmin

あと少しでラストです。

Laravelの初期画面表示

EC2のパブリックIpv4 DNSをコピーして、
ブラウザのURLバーに貼り付け。(URLはElastic IPで固定にしてもいいですが、今回はしません。)

image.png

いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。

image.png

EC2再起動したときの注意事項

1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。

sudo su
cd laradock/
docker-compose up -d nginx mysql phpmyadmin

2)EC2停止したときは、Ipアドレス変わっているので、
 Elastic IPで固定化しましょう。

3) Laradockのファイル変更したら
docker-compose up -d mysql phpmyadmin
しましょう。
編集するファイルはもちろんSampleProject。

所感とこれから

EC2使って立ち上げるのに、すごい便利だなと思いましたし、デプロイできると嬉しいですね、
ただ、EC2再起動したあとのDocker-composeの立ち上げとか、
EC2立ち上げたときに、gitとかDocker/Docker-compose入れるの手間だなと思っちゃいました。

これからは発展的な内容としてEC2の冗長化とECS(Fargate),CI/CDも勉強しようとおもいます。

なにか、みなさまの参考になれば幸いです。

以上

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

EC2/Docker/Laravelでデプロイ

経緯

Laradocを使ったWebアプリの開発の勉強を始めています.

AWSとLaravel,docker,docker-compose勉強し始めて、1ヶ月ほどたって、
Docker/Doker Compose/AWSの使い方にはなれてきたので、Laradocでデプロイしてみたいなぁと思って、自分の勉強のために残しておきます。(2020年11月4日時点)

参考にさせていただいたのサイトは下記のところです。

https://laraweb.net/tutorial/6578/
https://noumenon-th.net/programming/2019/06/16/laradock/

参考にした本は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版」です。

docker,docker-composeの基礎知識は下記のudemy講座で勉強しました。

https://www.udemy.com/course/aidocker/

色々な知識与えてくれた上記の作者の方々に感謝です。

では早速やっていきましょう

ゴール

AWSでどこからでもアクセスできるLaravelのWebアプリをデプロイする。
本来はローカルでLaradoc作って、Webアプリ開発してそれをgit cloneするのだと思いますが、
全部AWSで完結します。

laravelの実行環境

Ubuntu:18.04
PHP : 7.3
mysql : 5.4
Docker : 19.03.13
Docker-compose : 1.17.1

リージョンの選定

東京リージョンで作成しましょう

VPCの作成

image.png

image.png

1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
image.png

VPC
image.png

EC2インスタンスの作成

EC2をコンソールから選択してインスタンスを起動をクリック
image.png

Ubuntu 18.04を選択
ステップ2でt2.microを選択
image.png

ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
image.png

ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
image.png

ステップ7 で起動をクリック。
      SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。

image.png

この間で、mykey.pemの認証をしましょう。

ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

しばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
image.png

SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。

image.png

ターミナルを開いて
mykey.pemのあるディレクトリに移動(cd)

先程AWSでコピーした
ssh ~~~
をターミナルに貼り付け。Enter

そしたら先程作成したEC2に入れます。
その後、
yesと入力
ここまででEC2の起動は終わりです。

EC2の中で、Docker,Git,Docker-composeをインストール

ubuntu@ip-10-0-0-205:~$ sudo su
root@ip-10-0-0-205:/home/ubuntu# 

以下root内での作業

じゃんじゃん下のコマンド打っていきましょう
apt-getのアップデートして,gitをインストール
apt-get update
apt-get install git

dockerとdocker-composeをインストール

$ apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

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

$ apt-key fingerprint 0EBFCD88

$ add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"
$ apt-get install docker-ce docker-ce-cli containerd.io

$ apt install docker-compose
exit

でrootから抜け出す

Laradocをgit cloneする。

https://laradock.io/

git clone https://github.com/Laradock/laradock.git

lsでgit cloneされているか確認しましょう。
image.png

$ cd laradockとして
$ cp env-example .env
とりあえず、PHP=7.3
mysqlで実行することにしてみましょう。
実行。

docker-compose up -d nginx mysql

してnginx mysqlのdockerを起動。
10分ほどまちます。Youtubeでも見ながらゆっくりしましょう。

workspaceコンテナに入ります。

dockerのインストールが終了したら、下記コマンド実行して、
workspaceで作業しましょう。

docker-compose exec --user=laradock workspace bash

でworkspace内で、docker-compose 起動します。

そうすると、var/www$に移動します。
laradockフォルダがあるので、

$ cd laradoock
として、.envファイルを編集します。
$ cp env-example .env
しましょう

下記を.envに追加
vi .env実行して下記追加。

DB_HOST=mysql
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

LaravelでWebアプリの作成

今回はサンプル用のアプリ名をSampleProjectとします。

laradock@e00afef1d36e:/var/www$ composer create-project laravel/laravel SampleProject "5.5.*"

そしたらSampleProjectができます。

var/www --- laradock
         |_ SampleProject

という構成になります。

SampleProjectに入って.envを編集。

DB_CONNECTION=mysql 
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

としてDB_HOSTをmysqlにします。

そして,Laradock内の.envを下記の通り編集して、起動するlaravelアプリを選択。
ここを記述しないと認識されないんだと思います。

APP_CODE_PATH_HOST=../SampleProject

とりあえずの設定は終わりました。

laradocのファルダに移動して、docker-compose再起動して、変更を読み込み。

docker-compose up -d nginx mysql phpmyadmin

あと少しでラストです。

Laravelの初期画面表示

EC2のパブリックIpv4 DNSをコピーして、
ブラウザのURLバーに貼り付け。(URLはElastic IPで固定にしてもいいですが、今回はしません。)

image.png

いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。

image.png

EC2再起動したときの注意事項

1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。

sudo su
cd laradock/
docker-compose up -d nginx mysql phpmyadmin

2)EC2停止したときは、Ipアドレス変わっているので、
 Elastic IPで固定化しましょう。

3) Laradockのファイル変更したら
docker-compose up -d mysql phpmyadmin
しましょう。
編集するファイルはもちろんSampleProject。

所感とこれから

EC2使って立ち上げるのに、すごい便利だなと思いましたし、デプロイできると嬉しいですね、
ただ、EC2再起動したあとのDocker-composeの立ち上げとか、
EC2立ち上げたときに、gitとかDocker/Docker-compose入れるの手間だなと思っちゃいました。

これからは発展的な内容としてEC2の冗長化とECS(Fargate),CI/CDも勉強しようとおもいます。

なにか、みなさまの参考になれば幸いです。

以上

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

【Linux】Docker、apacheで自己証明書を作成

はじめに

DockerのApacheで自己証明書を作成する方法をメモ

環境情報

  • OS:Redhat 7.7
  • Docker:19.03.6-ce
  • docker-compose:1.27.4
  • apache:2.4.46

Docker環境構築

下記の記事を参照
【Linux】RedhatにDocker環境構築

docker-compose.yml設定

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf

Dockerfile設定

apache

FROM httpd:latest

RUN apt update \
    && apt install -y \
    git \
    gcc \
    make \
    build-essential \
    wget \
    curl \
    llvm \
    xz-utils \
    tk-dev \
    zlib1g-dev \
    libncurses5-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    libxmlsec1-dev \
    liblzma-dev \
    libpq-dev \
    libffi-dev

WORKDIR /usr/local/apache2

apacheコンテナの起動

docker-compose up -d apache

自己証明書を作成

apacheコンテナに入り、自己証明書を作成
詳細は下記記事を参照
【apache】自己証明書を作成

docker-compose.yml修正

・作成した自己証明書をvolumesに追加
・portsに「443」を追加

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
      - 443:443 <==追加
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./apache/conf/server.crt:/usr/local/apache2/conf/server.crt <==追加
      - ./apache/conf/server.key:/usr/local/apache2/conf/server.key <==追加

各種ファイルの設定

./apache/conf/httpd.conf

・・・
LoadModule ssl_module modules/mod_ssl.so <==追加
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so <==追加

・・・
↓↓↓↓↓↓↓↓↓↓追加↓↓↓↓↓↓↓↓↓↓
Include conf/extra/httpd-ssl.conf 
<IfModule ssl_module>
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin
</IfModule>
↑↑↑↑↑↑↑↑↑↑追加↑↑↑↑↑↑↑↑↑↑

apacheコンテナの最新化

docker-compose up -d apache

HTTPS接続が可能になっていればOK
https://localhost
※ ドメイン名は適宜変更

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

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 のノート

要旨

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築
大澤 文孝、浅居 尚 著 
上記の本ををサクッと学ぶつもりが
いきなりハマったので・・・ただ動かせるようにとのノート

第1章 コンテナの仕組みと利点

第2章 Dockerを利用できるサーバーを作る

○「Docker Downloadサイトをaptリポジトリに追加する」でテキスト指定の資料ではうまくいかなかったので
探した結果。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

第3章 5分でWebサーバーを起動する

viの練習
https://language-and-engineering.hatenablog.jp/entry/20121207/p1
第4章 Dockerの基本操作
第5章 コンテナ内のファイルと永続化
第6章 コンテナのネットワーク
第7章 複数コンテナをまとめて起動するDocker Compose
第8章 イメージを自作する
第9章 Kubernetesを用いたコンテナ運用

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

【Linux】Dockerでjenkins環境構築

はじめに

Dockerでjenkins環境構築する方法をメモ

環境情報

  • OS:Redhat 7.7
  • Docker:19.03.6-ce
  • docker-compose:1.27.4
  • apache:2.4.46
  • jenkins:2.264

Docker環境構築

下記の記事を参照
【Linux】RedhatにDocker環境構築

docker-compose.yml設定

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./apache/conf/modules.conf:/usr/local/apache2/conf/modules.conf
      - ./apache/conf/proxy.conf:/usr/local/apache2/conf/proxy.conf
  jenkins:
    build: jenkins
    container_name: jenkins
    volumes:
      - ./jenkins/jenkins_home:/var/jenkins_home
    environment:
      - JENKINS_OPTS=--prefix=/Jenkins/ --sessionTimeout=1440
      - TZ=Asia/Tokyo
    privileged: true

Dockerfile設定

apache

FROM httpd:latest

RUN apt update \
    && apt install -y \
    git \
    gcc \
    make \
    build-essential \
    wget \
    curl \
    llvm \
    xz-utils \
    tk-dev \
    zlib1g-dev \
    libncurses5-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    libxmlsec1-dev \
    liblzma-dev \
    libpq-dev \
    libffi-dev

WORKDIR /usr/local/apache2

jenkins

FROM jenkins/jenkins:lts

WORKDIR /

USER root

RUN apt-get update \
    && apt-get install -y \
    gcc \
    g++ \
    expect \
    make \
    file \
    chromium \
    chromium-driver \
    libpq-dev \
    libssl-dev \
    libbz2-dev \
    libffi-dev \
    zlib1g-dev \
    liblzma-dev

WORKDIR /var/jenkins_home

EXPOSE 8080

各種ファイルの設定

./apache/conf/httpd.conf

・・・
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so

Include conf/modules.conf <==追加

・・・

IncludeOptional conf/proxy.conf <==追加

./apache/conf/modules.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

./apache/conf/proxy.conf

# jenkins
<Location "/Jenkins">
   <IfModule proxy_module>
      ProxyPass http://jenkins:8080/Jenkins
      ProxyPassReverse http://jenkins:8080/Jenkins
   </IfModule>
</Location>

Jenkins起動確認

下記URLでjenkinsにアクセスできればOK

http://localhost/Jenkins
※ ドメイン名は適宜変更

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

NVIDIA Docker 環境の作り方

はじめに

2020/11/04時点での NVIDIA Docker 環境の作り方をメモ。
いつの間にかCUDAが認識されなくなっていたため、ドライバーから入れ直すことに。

USER@HOST:~$nvidia-smi
Wed Nov  4 14:41:54 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.64       Driver Version: 430.64       CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   35C    P8    12W / 275W |     62MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1609      G   /usr/lib/xorg/Xorg                            59MiB |
+-----------------------------------------------------------------------------+

古い環境を消す

# 現在のCUDAをアンインストール
$ sudo apt purge cuda*
$ sudo apt purge nvidia-cuda-*
$ sudo apt purge libcuda*
# 完全に削除
$ sudo apt-get purge nvidia*
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ sudo rm -rf /usr/local/cuda*

本題

以下3手順で、CUDA、Docker、nvidia-docker2がインストールできる。尚、今まではNvidia Driverは別で入れていたが、CUDAを入れれば対応するDriverも一緒にインストールされる。

1. 最新CUDAドライバのインストール

CUDA Toolkit の Web サイトに従ってインストール

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
$ sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda #(※バージョン指定する場合はcuda-10-2という風に書く)

2. Dockerのインストール

Docker公式のインストール方法に従ってインストール

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

インストール後、docker サービスの開始と、自動起動を設定

$ sudo systemctl start docker && sudo systemctl enable docker

sudo なしに docker コマンドを実行可能にするのであれば、次のように対象のユーザーを docker グループへ追加

$ sudo usermod -aG docker $USER

3.nvidia-docker2 パッケージのインストール

公式のインストール方法に従ってインストール

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

再起動後、動作確認

$ sudo reboot
$ nvidia-smi

Nvidia DriverとCUDA Versionが表示されれば完了。

参考
NVIDIA Docker って今どうなってるの? (20.09 版)

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

WSL、Zsh、VSCode、Docker、NodeJS セットアップまとめ in 2020

はじめに

新しいSurfaceをもらったので、せっかくだからWSLを試したいと思います。
まとめだけなので、調べる手間を省きたい方向けです。

WSL、WSL2のインストール

Docker Desktop WSL 2 backendを使うためにWSL2が必要なので、最初からWSL2にアップグレードした方がいいと思います。

公式マニュアル(日本語)

すでにWSL1のディストリビューションを持っている方は同じドキュメントでアップグレード方法も記載されています

Zsh

Linux上の手順と同じ。
WSLを開き、ZSHをインストールします。
(PowerShellなどでwslを入力すれば開きます)

sudo apt update
sudo apt install zsh

oh-my-zsh & autosuggestion(自動補完)

Oh-my-zsh

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

zsh-autosuggestion

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

Vimなどのテキストエディターで~/.zshrcを開き、ファイル内で以下を追加:

source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh

Zshをリロード:

source ~/.zshrc

VSCode

大体VSCodeをインストールするだけで動きます。
公式マニュアル(日本語)
WSLためのExtension

自分は以下の方法でDefault ShellをZSHにしたのですが、必要かどうかはわかりません:
VSCodeで Ctrl+ Shift + P → "Select Default Shell" を入力 → WSL(ZSH)を選択

NodeJS

LinuxでNodeJSをインストールのと同じ手順です。
NVMを使ってインストールします。

nvm

インストール

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash

以下を~/.zshrcに追加:

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

Zshをリロード:

source ~/.zshrc

NodeJS

WSLを開きます。
特定バージョンをインストール

nvm install x.x.x

or 最新版

nvm install node

Docker (Docker Desktop WSL 2 backend)

要件は前述のWSL、WSL2のマニュアルに従えば満たしてるはずなので、
最新版のインストーラーをダウンロード、インストール途中でWSL2のチェックボックスを入れるだけで完成。

公式マニュアル (英語)(見なくてもおk)

もしWSLでdockerを入力すると以下のエラーが出てくると:

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

See https://docs.docker.com/docker-for-windows/wsl/ for details.

WindowsでDocker Desktopを起動していないか、もしくは自分のLinux DistributionのWSLバージョンをチェックしてください、WSL2じゃないと動きません。

確認とアップグレード方法

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

Dockerを監視のための ""監視ツール"" をご紹介

image.png

データは、あらゆる形態において、非常に強力で有用なものとなります。収集されたデータは、いつでも驚くべき洞察を提供し、最適化、障害認識/許容度、および新機能の開発のための意思決定の際に役立つものです。これらのデータは、ビジネス、ソフトウェアアプリケーションのセット、またはコンテナから由来するものである可能性があります。

コンテナは最新のソフトウェアアーキテクチャの不可欠な部分になり、データベース、アプリケーションの一部、さらにはアプリケーション全体を、ホストサーバーから独立した自己完結型の環境でホストできるようになりました。そのため、コンテナを適切に監視することは、コンテナがホストするアプリケーションを正常で効率的に保つために絶対に不可欠です。

現在、Dockerはコンテナーの世界で支配的な勢力であり、2018年に本番環境にあるすべてのコンテナーの83%以上を占めています。その人気により、Dockerコンテナーの監視は、さまざまなツールが存在するため、選択の問題に帰着することがあります。そこから選択し、それぞれに長所と短所があります。

多くのユースケースの場合、MetricFireはDockerコンテナを監視するための優れたオプションとなります。 MetricFireは、Graphite、Prometheus、Grafanaのホストバージョンを提供するプラットフォームです。 これらのオープンソースツールに基づいて構築されたMetricFireは、高度にカスタマイズ可能で、DevOpsおよびSREコミュニティ全体でよく知られているアジャイルツールを提供します。 しかも、お値段もお手頃です。ここでMetricFireの無料デモを予約し、今日からDockerコンテナーの監視を開始するために必要なことや質問等ございましたらご相談ください。

この記事の目的は、人気のあるDocker監視ツールの詳細を、ユースケースを用いて最適なツールを決定するのに役立つ方法と一緒に提供することです。

MetricFire

オープンソースのPrometheus、Graphite、Grafana上に構築されたMetricFireは、デフォルトのダッシュボードとプラグインをすぐに利用できる状態でDockerコンテナーをすぐに監視する準備ができています。 MetricFireは基本的に、オープンソースプロジェクトのホストバージョンを提供するサービスであるため、MetricFireはオープンソースプロジェクトが行えることは基本すべて実行できます。 これには、コミュニティ全体で開発されたすべての適応とプラグインが含まれています。

image.png

MetricFireは、cAdvisor、Prometheus、Kubernetesと統合されており、Dockerコンテナーを監視するための究極のツールになっています。 オープンソースツールの背後にいるフォロワーの大規模なコミュニティの結果として、MetricFireの背後にあるテクノロジーも絶えず開発され進化しています。

つまり、Docker監視ツールとしてMetricFireを選択した場合、DockerとKubernetesが急速に開発されるため、監視テクノロジーが時代遅れになることを心配する必要はありません。

MetricFireには14日間の無料トライアルがありますので、まずは無料デモを予約して、ユースケースについてご相談ください。

Docker CLI(docker stats)

docker自体が提供する監視ツールであるdockerstatsコマンドを見てみましょう。 ターミナルでこのコマンドを実行すると、コンテナを実行するためのライブデータストリームが返され、コンテナのリソース消費をカバーする基本的なメトリックが提供されます。

これらのメトリックには、存在するさまざまな実行中のコンテナーのコンテナーID、CPU、メモリー、およびネットワークの使用状況が含まれます。 実行中のすべてのコンテナーではなく、単一のコンテナーのメトリックをリストする場合は、コマンドの最後にそのコンテナーのコンテナーIDを追加するだけです。次に例を示します。

image.png

上記の例では、コンテナーIDがfb649db2dc20のコンテナーのみのメトリックをフェッチしています。 --no-streamオプションを使用してストリーミング統計を無効にし、最初の結果のみがプルされるようにします。

そのフラグなしでこのコマンドを実行すると、プロセスを手動で停止するまで、これらのメトリックが継続的にポーリングおよび表示されます。 このコマンドの他の便利なフラグは、dockerのドキュメントにあります。

ただし、docker statsコマンドは、いかなる形式のデータ視覚化もサポートしていません。ターミナルに生データとしてメトリックを表示するだけです。 そのため、コンテナの状態とステータスを一目で確認するのに役立ちますが、詳細な監視または視覚的な監視ダッシュボードが必要な状況ではあまり価値がありません。 優れた視覚化による長期的な監視には、Grafanaをお勧めします。

cAdvisor

cAdvisorは、Googleが管理するオープンソースのコンテナ監視ツールです。 Docker、または文字通り他のタイプのコンテナーのサポートが組み込まれているため、cAdvisorを使用して、事実上すべてのタイプの実行中のコンテナーに関するデータを収集できます。 これは、実行中のコンテナーに関する情報を収集、処理、集約、およびエクスポートする単一の実行デーモンで構成されています。

この情報は、組み込みのユーザーインターフェイスからエクスポートして表示することも、より大きな監視プラットフォームにエクスポートして分析と視覚化を行うこともできます。 ただし、cAdvisorは、監視するコンテナーで大量のメトリックを収集しますが、メモリやCPU使用率など、コンテナーのパフォーマンスの特定の側面に関する一般的なデータのみを表示するため、Webユーザーインターフェイスはかなり制限されています。 以下にcAdvisorダッシュボードの例を示します。

image.png

cAdvisorが収集する詳細なメトリックにアクセスするために、ストレージプラグインを使用して、これらのメトリックをより大きな監視システムまたはストレージシステムにエクスポートし、そこから処理することができます。 cAdvisorを使用してDockerコンテナーを監視する方法の詳細については、この記事を確認してください。 また、cAdvisorをMetricFireと統合することも検討してください。これにより、両方の長所が得られます。

Prometheus

Prometheusは、非常に人気のあるオープンソースの監視および警告システムです。 プッシュベースのメカニズムを使用してメトリックを収集するほとんどの監視ツール(監視対象のコンテナー上のエージェントがメトリックを収集して送信する)とは異なり、Prometheusはプルベースのメカニズム(ポーリング)を使用します。

プルベースのシステムでは、コンテナー/サーバーがメトリックエンドポイントをPrometheusに公開し、Prometheusが構成可能な間隔でこれらのエンドポイントからメトリックデータを取得します。

次に、Prometheusはこのデータを処理および集約して、組み込みの式ブラウザーを使用してデータを表示したり、Grafanaなどの視覚化ツールで洞察に満ちたダッシュボードを構築したりできるようにします。

Prometheusは、ポーリングメカニズムと組み合わせて、多種多様なクライアント側の統合を可能にする、大量のクライアントライブラリを提供しています。

基本的に、メトリックをPrometheusに取り込むために必要なのは、アプリケーションコードに適切なクライアントライブラリを使用して、アプリケーションのインスタンスでHTTPエンドポイントを使用してこれらのメトリックを定義および公開することです(クライアントライブラリを使用して作成されたメトリックはカスタムメトリックと呼ばれます)。

Redis DBメトリックをPrometheusにインポートする例を含む、完全なチュートリアルをここで見ることができます。 Prometheusはこれらのメトリックをスクレイプし、エクスプレッションブラウザまたはGrafanaなどのビジュアライザを使用してそれらを視覚化できます。 Prometheus ExpressionBrowserの例は以下にあります。

image.png

これらのクライアントライブラリを使用して、適切なライブラリを組み込み、公開したいカスタムメトリックを公開することで、Dockerコンテナ内で実行されているアプリケーションを監視できますが、これらのライブラリを使用して、次のようなDockerコンテナのメトリクスを取得することはできません。コンテナのCPUまたはメモリ使用量など。

これは、Dockerコンテナのメトリックを直接Prometheusにエクスポートするコンテナエクスポータを使用して可能でした。ただし、コンテナーエクスポーターメソッドは非推奨になり、cAdvisorを使用してコンテナーメトリックを監視し、前述のようにそれらをPrometheusに公開するようになりました。

Prometheusを選択すると、多くの構成とメンテナンスを行う必要があるというトレードオフが伴います。簡単ですぐに使用できるPrometheusインスタンスを優先して、これらの構成とメンテナンスのボトルネックをスキップしたい場合は、MetricFireが提供するPrometheusのマネージドツールHosted Prometheusの無料デモにサインアップしてチームと直接話し合ってください。

まとめ

コンテナ化されたアーキテクチャとDockerの一般的な人気を考えると、他にもいくつかの監視オプションがあります。 これらには、Datadog、Sysdig、SolarWinds、NewRelic、SignalFxなどがあります。

それぞれ長所と短所があり、アーキテクチャも異なります。エージェントベースのものとクラウドホスト型のものがあります。 非常に多くのオプションから選択するのは難しい場合がありますが、どちらを選択するかは、ユースケースまたは最終目標に大きく依存します。

決定の手助けが必要な場合は、デモを予約してMetricFireに連絡してください。 私たちはモニタリングの専門家であり、あなたに最適なモニタリング設定に向けてあなたを導くためにいます。 ハッピーモニタリング!

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

Linux Mint20でMJ4(麻雀ゲーム)をする

Linux Mint20でWineでMJ4を実行しようとしたら、すっとできなかったので、対応方法を記載する。

MJ4とは

SEGAの麻雀ゲーム
スマホアプリ・Windowsアプリ・アーケード版はあるけど、Linux版はない。

実施してみたこと

Linux Mint20のWine上で実行
⇛ゲームをしていると、ちょいちょいアプリが落ちる
⇛NG

VirtualBox上にUbuntu入れてWine上で実行
⇛画面の描画が重たい。そもそも立ち上げるのがめんどくさい
⇛NG

Docker上のUbuntuにWine入れて実行
⇛問題なし

そのため、Docker上のUbuntuにWine入れて実行する形で、MJ4を楽しみます。

実行までの手順

概要

  1. コマンドからGUIアプリ起動可能なUbuntuのDockerイメージを作成
  2. 上記にWineを導入したDockerイメージを作成
  3. 上記にdotnet35spを導入したDockerイメージを作成
  4. 上記にMJ4をインストールしたDockerコンテナを作成

詳細

コマンドからGUIアプリ起動可能なUbuntuのDockerイメージを作成

下記のDockerfileをもとにイメージ作成

FROM ubuntu

# ***********************************************
# install packages for xrdp, and do setting
# ***********************************************
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
        language-pack-ja bash-completion zenity x11-apps gnome-terminal

# ***********************************************
# setting skelton
# ***********************************************
RUN mkdir -p /etc/skel/Desktop \
    /etc/skel/Downloads \
    /etc/skel/Templates \
    /etc/skel/Public \
    /etc/skel/Documents \
    /etc/skel/Music \
    /etc/skel/Pictures \
    /etc/skel/Videos

# ***********************************************
# set local
# ***********************************************
RUN update-locale LANG=ja_JP.UTF-8

# ***********************************************
# setting keyboard layout
# ***********************************************
RUN { \
      echo 'XKBMODEL="pc105"'; \
      echo 'XKBLAYOUT="jp""'; \
      echo 'XKBVARIANT=""'; \
      echo 'XKBOPTIONS=""'; \
      echo ''; \
      echo 'BACKSPACE="guess"'; \
    } > /etc/default/keyboard

やっていることとしては、下記です。
■aptインストール
日本語パッケージの導入
bashで入力補完が使えるように、bash-completionを導入(これはMJ4使う上での設定というより、単純に使いやすいように)
コマンドからGUIアプリを起動できるように、zenityを導入
必要性は不明だが、x11-appsを導入
winetricksから、コマンドを立ち上げられるようにgnome-terminalを導入

■ユーザーのホームフォルダの雛形作成

■日本語化
これに関しては、うまく機能しているのか不明

■キーボードレイアウトを日本語化
これに関しては、うまく機能しているのか不明

イメージファイルの作成

下記コマンドでイメージの作成
イメージ名は、sabocla6/ubuntu_uiとしています

sudo docker build ./ -t sabocla6/ubuntu_ui

上記にWineを導入したDockerイメージを作成

下記のDockerfileからイメージを作成します。

FROM sabocla6/ubuntu_ui

# ***********************************************
# install wine
# ***********************************************
RUN dpkg --add-architecture i386
RUN apt-get -y autoclean
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
        curl wine-stable winetricks

インストールするMJ4のセットアッププログラムをダウンロードするために、curlを導入しています。
Wineを動かすので、wine-stable, winetricks を導入しています。

イメージファイルの作成

下記コマンドでイメージの作成
イメージ名は、sabocla6/tmp_wineとしています

sudo docker build ./ -t sabocla6/tmp_wine

dotnet35spを導入したDockerイメージを作成

このイメージをもとに、dotnet35spを導入したコンテナイメージを作成します。
この作業は、GUIからしかできない(と思っている)ので、コンテナを作成して実行します。

まずはコンテナを起動します。

sudo docker run -it --shm-size=2G --privileged --network host -e DISPLAY=$DISPLAY -v $HOME/.Xauthority:/root/.Xauthority sabocla6/tmp_wine

作業の途中、GUIが開かなくなることがあるので、その場合は、Dockerコンテナを再起動してください。

コンテナが起動したら、winetricksを起動し、32ビット・Windows10のWINEPREFIXを作成します。
WINEPREFIXの名前はwin32としています。
作成完了したら、コンテナを一度再起動します。

fontでfakejapaneseipamonaを導入
インストールが完了したら、また、コンテナを再起動します。

そのWINEPREFIXにdotnet35sp1をインストールします。
インストールが完了したら、コンテナをイメージとして保存します。

sudo docker commit [コンテナID] sabocla6/wine

MJ4をインストールしたDockerコンテナを作成

sabocla6/wineからコンテナを作成します。

sudo docker run -it --shm-size=2G --privileged --network host -e DISPLAY=$DISPLAY -v $HOME/.Xauthority:/root/.Xauthority sabocla6/wine

MJ4のインストーラをcurlでダウンロードして、winetricksで作成した32ビット版のWINEPREFIXでシェルを起動して、
wineでインストーラを実行します。
インストール先は、c:\Program Files\SEGA\ に変更しています。
(日本語化がうまくできていない?インストール先のフォルダ名が文字化け)

下記内容で/root/start.shというスクリプトを作成

#! /bin/bash

export COLORTERM=truecolor
export HOSTNAME=PortableMint
export HOME=/root
export WINEPREFIX=/root/.local/share/wineprefixes/win32
export WINE=wine
export W_PLATFORM=wine
cd /root/.local/share/wineprefixes/win32/drive_c/Program\ Files/SEGA/
wine MJ_Launcher.exe

/root/.bashrcに書きを追加

/root/start.sh

コンテナを再起動すると、MJ4が立ち上がります。

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

mecab(NEologd辞書)環境をDocker(ubuntu)で構築

最近、スクレイピングでデータを取得したり、mecabで形態素解析を行ったり、様々な分析を行ったりしております。

最近の記事
青空文庫の書籍をDoc2Vecでクラスタリング
文春オンラインの記事をスクレイピング&ネガポジ分析

その際どんな環境で分析を行っているかというと、全てDocker環境で行っています。
今回は私が使っているDockerfileを公開いたします。

ベース:ubuntu
入っているもの:anaconda,mecab,NEologd,gensim,janome,BeautifulSoupなど
工夫した点:NEologdをデフォルト辞書に設定したこと。こうすることでmecabを起動する度にNEologd辞書を指定する必要がない。

参考
かめさんのudemy Docker講座・・・私のDockerの基礎知識となっています。超お勧め講座。
NEologdのGitHubページ・・・デフォルトの辞書より固有名詞に強いです。
MeCabのデフォルト辞書を変更する【Mac】・・・mecabのデフォルト辞書を指定する際に参考にしました。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y \
  sudo \
  wget \
  vim \
  mecab \
  libmecab-dev \
  mecab-ipadic-utf8 \
  git \
  make \
  curl \
  xz-utils \
  file

WORKDIR /opt

RUN wget https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh && \
  sh Anaconda3-2020.07-Linux-x86_64.sh -b -p /opt/anaconda3 && \
  rm -f Anaconda3-2020.07-Linux-x86_64.sh
ENV PATH /opt/anaconda3/bin:$PATH

RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git ; exit 0
RUN cd mecab-ipadic-neologd && \
  ./bin/install-mecab-ipadic-neologd -n -y && \
  echo "dicdir=/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd">/etc/mecabrc
RUN conda update -n base -c defaults conda

RUN pip install --upgrade pip && \
  pip install mecab-python3 \
  Janome \
  jaconv \
  tinysegmenter==0.3 \
  gensim \
  unidic-lite \
  japanize-matplotlib

RUN conda install -c conda-forge \
  newspaper3k && \
  conda install beautifulsoup4 \
  lxml \
  html5lib \
  requests

WORKDIR /work

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerイメージとオレオレ証明書組み込みレシピ

SSL 自己署名証明書と Docker レシピ その1

今年も AdventCalendar の季節ですね  日立グループ からも元気に参加します!
OSSソリューションセンタ 神山 が先陣を切らせて頂きたく。

とある社内インフラ屋の困りごと

私はとある社内システムの設計、構築、運用、etc …ゆりかごから墓場まで面倒を見ています。
最近はコンテナが大好物です。

そんな私をたまに苦しめるのが、会社やチーム内独自の 自己署名証明書 (self-signed certificate、通称 オレオレ証明書) という存在です。理想を言えば、然るべき認証局に署名してもらうべきです。
しかし、イントラネットや開発中の環境だと、どうしてもそれが難しいことがあります。

特に Docker や Kubernetes を使い始めると、この”オレオレ証明書”の扱いが非常に面倒になっています (新しいイメージ使おうと思うとすぐに証明書エラー…)。巷では、「sslVerify = false」みたいな設定がはびこるわけですがセキュリティ上リスクが大きいです。

そこで今回は、(Docker) コンテナ利用を前提に、オレオレ証明書をうまく扱うための方法を書き並べてみました。

コンテナでオレオレ証明書を使う

コンテナでオレオレ証明書を正しく使う方法ですが…

  • イメージビルド時に証明書もインストールする
  • 実行時に証明書をマウントする

このような方法があるかと思います。今回は、それぞれ見ていきます。

イメージビルド時に証明書もインストールする

いくつかのOSについて、ビルド時に 証明書を入れていきます。

Dockerfile
self-signed.cert

上記のようなファイル構成を想定しています。
self-signed.cert がオレオレ認証局のCA証明書です。 PEM形式を想定しています。DER系式など、異なる形式の場合は事前に変換が必要です(参考)。このファイルをコンテナ内に登録し、コンテナ内部でこの証明書を”信用できる”証明書として登録していきます。

今回はそれぞれベースイメージや公式イメージを元にしました。
執筆時点(2020年11月)で安定版のタグを利用しています。

Ubuntu (Debian)

FROM ubuntu:20.04

COPY self-signed.cert /usr/local/share/ca-certificates/extra/self-signed.crt
RUN apt-get update -y && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* && update-ca-certificates

執筆時点のca-certificatesは、20201027ubuntu0.20.04.1 でした。

  1. 所定の場所(/usr/local/share/ca-certificates/extra/)に証明書を配置
  2. ca-certificates パッケージをインストール
  3. update-ca-certificates を実行

これで完了です。上記の例では、ごみファイルを残さないように、ということで最後 /var/lib/apt/lists 以下を削除しています。
debian(debian:10) でも同様の手順となります。

Alpine Linux

FROM alpine:3.12

COPY self-signed.cert /usr/local/share/ca-certificates/self-signed.cert
RUN apk add --no-cache ca-certificates && update-ca-certificates

執筆時点のca-certificatesは、ca-certificates-20191127-r4 でした。シンプルに、

  1. 所定の場所(/usr/local/share/ca-certificates/)に証明書を配置
  2. ca-certificates パッケージをインストール
  3. update-ca-certificates を実行

でOKです。

CentOS

FROM centos:7

COPY self-signed.cert /usr/share/pki/ca-trust-source/anchors/self-signed.crt
RUN yum install -y ca-certificates && update-ca-trust && yum clean all

centos:latest (執筆時点では centos:8 )は、dnfコマンドがうまく動かなかったので、妥協して centos:7 としました。執筆時点のca-certificatesは、ca-certificates-2020.2.41-70.0.el7_8.noarch でした。

こちらも、

  1. 所定の場所(/usr/share/pki/ca-trust-source/anchors/)に証明書を配置
  2. ca-certificates パッケージをインストール
  3. update-ca-trust を実行

でOKです。

Java

FROM openjdk:15

COPY self-signed.cert /tmp/self-signed.cert
RUN keytool -import -trustcacerts \
     -file /tmp/self-signed.cert \
     -noprompt -storepass changeit \
     -cacerts \
     -alias self-signed

執筆時点では OpenJDK:15 (openjdk version "15.0.1" 2020-10-20) でした。
基本的な流れは

  1. 適当な場所に証明書を配置
  2. keytool コマンドで取り込み
    • それぞれのオプションの説明はほかに譲ります
    • OpenJDK14 あたりから、-keystore で cacerts キーストアの場所を指定するのは warning 扱いになりました。 -cacerts だけで済むのでこちらの方が楽ですね
    • -alias オプションでわかりやすい名前を付けると良いです

処理によってはOS側の証明書を参照してくれますが、過去に Java VM 側でも証明書を覚えておかないとうまく動かないことがあったので載せてみました。

実行時に証明書をマウントする

イメージを自前でビルドするとバージョン管理が面倒になることがあります。そういう場合は、実行時にマウントするという手があります。ここは Debian/Ubuntu の場合について書きます。

Debian/Ubuntu

まずは、update-ca-certificates コマンドの結果出力されるファイルを保存します。本記事のイメージビルド時に証明書をインストールする方法でイメージ をビルド(ここではイメージ名を certs )します。

そして、

docker build -t certs .
docker create --name certs certs
docker cp certs:/etc/ssl/certs/ca-certificates.crt certs.crt
docker rm certs

コンテナからファイルを取り出します。既に動作させてるUbuntu環境からファイルをコピーしても良いのですが、上記のように極力クリーンな環境からコピーしたほうが間違いが少ないです。こうすることで、後々Ubuntuのバージョンがあがり、ca-certificates.crt の形式が変わった場合も、同じ手順で更新できます。

ここまで出来たら、後は

docker run -v `pwd`/certs.crt:/etc/ssl/certs/ca-certificates.crt -it ubuntu bash

このように、同ディレクトリにマウントしてコンテナを起動することで、オレオレ証明書を認識した状態でコンテナを立ち上げることができます。上記では Ubuntu を起動していますが、Ubuntuベースのイメージであれば、同じパスにマウントすることで、期待通りに動作します。

さいごに

今回は、OSのベースイメージ毎に、SSL証明書の登録の仕方をまとめてみました。

実際は、JenkinsやRedmineなどのイメージに対して証明書を埋め込みたいケースもあるかと思います。そういったケースにどう対応するか…は その2 として公開したいと思います。

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

【Docker】基本のDocker Instructionの紹介

また少しDocker担当から離れていきそうなので備忘録もかねて記述していきたいと思います。
今回は簡単にFROM, RUN, CMDのご紹介です。

FROM

DockerfileはFROMを記述して、ベースとなるイメージを決めます。
ex.ubuntuの最新バージョンのイメージを指定する場合

FROM ubuntu:latest

慣れるまでは自分が必要とするツールが揃っているものを指定するのもいいと思います。慣れてきたらOSのみで欲しいツールを入れていくことを検討するといいと思います。

RUN

このコマンドを使うことでサーバーに必要なものを好きなようにカスタマイズすることが可能です。

ex.イメージOS上にtest1.txt,test2.txtというファイルを作成する

Dockerfile
RUN touch test1.txt
RUN touch test2.txt

RUNコマンドを複数行と実行することでイメージOS上の環境を整えていくことが可能ですが、RUNごとにレイヤーが作られます。
レイヤーが増えるとイメージが大きくなるので注意が必要です。

レイヤーを少なくする工夫

レイヤーを作るコマンドRUN, COPY, ADDを複数使う必要がある場合は&&でコマンドをつなげて記述する。1行が長くなるとDockerfileが見辛くなるので(バックスラッシュ)で改行をする。

Dockerfile
RUN apt-get update
RUN apt-get install aaa
RUN apt-get install bbb
RUN apt-get install ccc

Dockerfile
RUN apt-get update && apt-get install aaa bbb ccc

↓インストールのパッケージが増えると見辛くなるので改行で整えます。

Dockerfile
RUN apt-get update && apt-get install \
aaa \
bbb \
ccc```

インタラクティブに実行許可のyを入力する必要があるのでyesを意味する-yを入れるとインストールがスムーズに実行されます。

```docker:Dockerfile
RUN apt-get update && apt-get install \
aaa \
bbb \
ccc

キャッシュを有効利用する

apt-getなどでツールをインストールする記述をする時に一つ一つaaa,bbbがうまくインストールされたのでつなげてcccを記述して試す...と実行結果を得るためにネットワークへのアクセスが毎回発生してしまいます。

aaa bbb cccのツールをインストールしたい場合
docker:Dockerfile
RUN apt-get install \
aaa \
bbb

これがうまくいったので続けてcccを記述するとキャッシュが利用されずに全てをネットワーク上から取得する事になる。

Dockerfile
RUN apt-get install \
aaa \
bbb \
ccc

↓まずは違うRUNで記述します。

Dockerfile
RUN apt-get install \
aaa \
bbb
RUN apt-get ccc

というように後から追記するものはまず分けてうまく動作するかを試します。うまくいけば1行で記述するようにすることで記述から実行の一連の時間のロスをなくすことができます。

CMD

・Dockerfileの最後に記述することで、コンテナのデフォルトで実行されるコマンドの指定をすることができます。
CMD ["コマンド", "パラメータ1", "パラメータ2", "パラメータ3"]
ex.バッシュを起動する

FROM ...
RUN ...
CMD ["bin/bash"]

おしまい

上記紹介したコマンド:FROM, RUN, CMDで簡単なウェブサーバーなどの環境を作ろうと思えば作れるようになると思います。Docker、便利なんでぜひお試しください。

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

コロナ禍を乗り切るSlackアプリを開発してコミュニケーション向上

作ったもの

Slackのテキストメッセージの代わりに漫画でコミュニケーションする「comawari」というSlackアプリです。

image.png

Slack上でモーダルを開いてどの画像にセリフを乗せるか選んで投稿できます。
image.png

2020年11月現在、以下のサイトから画像データを利用させて頂いています。
ブラックジャックによろしく
ジブリ

仕組み

SlackのOAuth認証を経て、Slash CommandsとInteractivityという仕組みを利用して漫画を投稿します。

OAuth

リダイレクトURLで渡されたcodeをSlackAPIに問い合わせるとアクセストークンを取得できるので安全なストレージに保存します。
image.png
リダイレクトURLはSlackアプリ管理画面で指定できます。

Slash Commands

Slashコマンドが実行されると叩かれるcomawariのAPIがモーダルを開くSlackのAPIを叩きます。
image.png

投稿

ユーザがモーダルで送信ボタンをクリックするとSlack管理画面のInteractivityで指定したAPIが叩かれます。送信したユーザのアクセストークンを利用し、ユーザに成り代わり漫画を表示する投稿を行います。
image.png

プログラム

comawariサーバはGo言語で書かれています。

API

Ginというフレームワークを利用してAPIを構築しています。
https://github.com/gin-gonic/gin
軽量で使いやすい印象です。

Slack連携

Ginで受け取ったリクエストデータからgolang標準ライブラリのhttpでSlackAPIにリクエストを送っています。
例えば、アクセストークンを取得する箇所はこんな感じです。

// 送られてきたコードをアクセストークンに変換
values := url.Values{}
values.Set("code", code)
values.Add("client_id", SlackClientID)
values.Add("client_secret", SlackClientSecret)

req, err := http.NewRequest(
    "POST",
    "https://slack.com/api/oauth.v2.access",
    strings.NewReader(values.Encode()),
)

画像描画

このサービスのキモの画像描画もgolang標準ライブラリのimageを使って描画しています。
文字の描画は比較的簡単にできるのですが縦書きにする機能はありませんので文字を一文字ずつ分解してX,Y座標指定で描画するようにしています。

こちらの画像はリアルタイム描画ですがGCPの低スペックVirtualMachineでも100msを切るスピードで描画できます。
image.png
ブラックジャックによろしく / 佐藤秀峰

元画像データ

漫画の元となる元画像はフリーで利用しても良い画像を選びテキストエリアを定義したJSONと一緒にgithubに保存しています。
comawari立ち上げ時にgithubからCloneしてgolangオンメモリに配置して利用しています。
その内、リポジトリをオープンにして自由にプルリクで画像を追加できるようにしたいです。

インフラ

サーバはGCPのComputeEngine(n1-standard-1)を利用して、Dockerでcomawariサービスを立ち上げています。
Dockerfileはこんなです。

FROM golang:1.15.2

ENV TZ Asia/Tokyo

RUN go get github.com/cespare/reflex

WORKDIR /root
RUN mkdir /root/.ssh
COPY ssh /root/.ssh/
RUN chmod 600 /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts

WORKDIR /data
RUN git clone git@github.com:rspepe/comawari-data.git

WORKDIR /go/src/github.com/rspepe/comawari
COPY src .

EXPOSE 80 443

CMD ["/usr/local/go/bin/go", "run", "/go/src/github.com/rspepe/comawari/main.go"]

サーバは立ち上げて数週間ですので無料枠で稼働しています。無料枠が終わってもポケットマネーで何とかなりそうですが仮にトラフィックが増えてきて費用が捻出できなくなったら困っちゃいます。

ローカル開発

Slackからローカルマシンをコールしてもらうためngrokを利用しています。
利用方法については別の方の記事を参考にいたしました。
https://qiita.com/mininobu/items/b45dbc70faedf30f484e

Slack審査

Slackアプリとして公開するためにはAppleStoreと同じように審査が必要です。
ランディングページを作ってプライバシーポリシー宣言やユーザサポートを考えなきゃいけなかったりとなかなか大変でした。

指摘事項

OAuthで要求するSlackパーミッション多すぎ

サービス実現に不要なパーミッションを要求パーミッションから外す。

アクセストークンをユーザが消せるように

/deauth_coma コマンドを新設し、実行するとアクセストークンを削除するように対応。メールでの対応だとなりすまして認証解除の恐れがあるため。

ユーザサポート

/support_coma コマンドを新設し、メッセージを私に送られる機構を構築。メールでの連絡だとスパム扱いになって見過ごす可能性があるため。

残った課題

費用

楽しいサービスが作れたのでなるべく維持していきたいのですがサーバ運用費が高くなると維持が難しくなっていきそうです。そうなった場合、マネタイズも考えないといけません。Dockerコンテナで動いているのでDockerが動く安い環境であればどこへでも持っていけます。

括弧対応

「」や【】みたいな括弧に対応していません。漫画のコマにはなかなか出てこないので対応しなくても良さそうですがなんか良い対応方法がないか検討しています。

フォント

アラビア語とか中国語とかの言語には対応しておらず文字が豆腐になってしまいます。フリーのフォントを探していろいろな使い方ができるように改善したい。

国外輸出

日本語だけの対応ですがせっかくSlackが全世界で使われているので海外の方にも使っていただきたいところです。版権的に難しそうですがアイアンマンとかできればいいのに。

感想

このサービスは数年くらい前からやりたかったことなので実現できて凄い達成感。
以前、チャレンジしたときはHTMLとJSで画像の上にテキストを縦書きにした程度でした。
Slackという優れたコミュニケーションツールとgolangの開発力を地道に上げたことが功を奏しました。
少しずつ改善を続けてもっと良いものができると信じ、開発を続けます。

謝辞

このサービスを作るにあたり二次利用を許可してくださった佐藤秀峰さん(本記事公開時点では未事後報告)、常識の範囲での利用を許可して頂いたスタジオジブリさんには感謝しかありません。
本当にありがとうございます。

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

Docker コンテナの活用シーン

はじめに :whale:

Docker コンテナを初めて使ってから2年くらい経ちました:baby:色々な活用シーンを見た気もするし、誤った使い方をしているのではと気にかかる時もあります。

Docker コンテナを使い始めた人に伝える目的だったり、新しい活用知識が得られる期待もあって"Docker コンテナの活用シーン"を晒します。

1. ソースコードと実行環境を含んだアプリケーションの配布用途

(アプリケーション配布者側)

  • Dockerfile を用意する
  • ソースコード・実行ファイル、実行環境を含めてコンテナイメージをビルドする
  • コンテナイメージをレジストリに置く

(アプリケーション利用者側)

  • レジストリからコンテナイメージを取得する
    • (もしくは Dockerfile からコンテナイメージをビルドする)
  • コンテナイメージを利用する

2. 開発時の実行環境配布用途

  • 成果物がソースコードのみ(ライブラリ等)の場合に開発時の実行環境を用意する
  • 配布者はコンテナイメージをレジストリに置くことまでする必要はない
    • (Dockerfile を用意しておく)

3. DevContainer(開発環境)配布用途、リモート開発環境用途

4. どうなってもいいサンドボックス用途

  • 使い捨ての環境としてコンテナを使う
    • ubuntuを調べる際は docker run -it --rm ubuntu:18.04 bash してます

5. "CLI アプリケーションの中身がDockerコンテナ"な用途

$ curl "<ソース置き場>" > hoge_command
$ chmod +x hoge_command
$ mv hoge_command /usr/local/bin/hoge_command

hoge_command が shell script になっており、script の中でexec docker run fuga_container している。

実例: https://github.com/COLORFULBOARD/bq_profile/blob/master/bq_profile

手軽にCLIアプリケーションを配布する際に便利な気がします

6. "CLIアプリを一時利用"な用途

CLIアプリ(コマンド)を install せずに利用する目的で Docker コンテナを使う事ができます

  • git を install せずにgitを利用する
    • docker run --name repo alpine/git clone https://github.com/docker/getting-started.git
    • docker cp repo:/git/getting-started/ .
  • 出自: Docker Desktop for Mac のチュートリアル

以上です。
他にもこんな使い方したら便利だよという情報があれば教えてください。

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

UbuntuにDockerをインストールし、tlsを使ったリモート接続の設定を行う

UbuntuにDockerをインストールし、tlsを使ったリモート接続の設定を行う

こちらでも同じ記事を書いています

1.Dockerのインストール

UbuntuにDockerをインストールするためには以下のコマンドを実行します
面倒がないようにコピペ一発で全て行うようにしてあります

sudo apt -y install apt-transport-https ca-certificates software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt install -y docker-ce

2.Dockerの起動設定

OS起動時に自動起動させ、その場でも起動させます

sudo systemctl enable docker
sudo systemctl start docker

3.動作確認

デフォルトではDockerへの接続にroot権限が必要です

sudo docker ps

4.一般ユーザでDockerを使えるようにする

以下のコマンド実行後、ログインし直すと使えるようになります

sudo echo usermod -aG docker `logname`

確認

docker ps

5.tlsによる接続

ここからが面倒な部分になります
オレオレ証明書を作成しサーバとクライアントに配る必要があるのですが、これをやるのに一手間二手間かかります
余りに面倒なので、コマンド一発で終わるように、途中の入力を全てスキップするスクリプトを作成しました

5.1 証明書の作成

コマンドの説明はこちらを確認してください
https://github.com/SoraKumo001/docker-tls

リモートからで接続するための証明書を作成します

curl -s https://raw.githubusercontent.com/SoraKumo001/docker-tls/master/docker-tls.sh | \
sudo bash

接続の際にホスト名を正確に設定したい場合は以下のようにドメイン名やIPを指定します

curl -s https://raw.githubusercontent.com/SoraKumo001/docker-tls/master/docker-tls.sh | \
sudo bash -s DNS:host.example.com,IP:10.1.1.1

 5.1.1 生成されるファイル

  • プライベートキー
    /etc/docker/certs/private-key.pem

  • Dockerデーモン用ファイル
    /etc/docker/certs/ca.pem
    /etc/docker/certs/server-key.pem
    /etc/docker/certs/server-cert.pem

  • クライアント用ファイル
    ~/.docker/ca.pem
    ~/.docker/cert.pem
    ~/.docker/key.pem

 WindowsやMacの各環境でリモート接続する場合は、クライアント用ファイルをユーザディレクトリの.dockerフォルダにコピーします

 5.1.2 プライベートキーに関して

 証明書の自動生成スクリプトはプライベートキーを使い回すように作ってあります
 そのため証明書を再発行しても、クライアントの証明書は配り直す必要がありません
 また、既存のプライベートキーを他のサーバの同じ位置にコピーした状態で証明書を作成すると、同じクライアント用ファイルで複数のサーバに接続可能になります

 完全な作り直しが必要な場合は、プライベートキーを手動で消してください

5.2 サービスの設定変更

  • ファイルの書き換え
    /lib/systemd/system/docker.serviceExecStartを以下のように書き換えます
    この設定によって、tlsによるTCP接続を受け入れるようになります ちなみに外部公開サーバをtlsを使わずにTCP接続を受け入れる設定になっていると、いつの間にかビットコインの製造工場と化す可能性があるので気をつけてください
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H tcp://0.0.0.0 -H fd:// --containerd=/run/containerd/containerd.sock
  • 手動で編集するのが面倒な場合
    以下のコマンドを貼り付ければ書き換えが完了します
sudo sed -i "s/^ExecStart=.*/ExecStart=\/usr\/bin\/dockerd \
--tlsverify --tlscacert=\/etc\/docker\/certs\/ca.pem \
--tlscert=\/etc\/docker\/certs\/server-cert.pem \
--tlskey=\/etc\/docker\/certs\/server-key.pem \
-H tcp:\/\/0.0.0.0 -H fd:\/\/ \
--containerd=\/run\/containerd\/containerd.sock/" \
/lib/systemd/system/docker.service

5.3 サービスの更新

sudo systemctl daemon-reload && sudo systemctl restart docker

5.4 tlsによる接続確認

ここまでのサービス設定で-Hを使ってアドレス指定で接続する場合はtls接続が必須になっています
そのため--tlsを指定しないと接続できません
--tlsverifyにした場合は、接続時にドメイン名を検証するようになります

docker --tls -H localhost ps
docker --tlsverify -H localhost ps

5.5 リモートでのDockerイメージの転送

Dockerのコマンドには、Dockerイメージをパイプで受け渡す機能があるので、以下のようにするとDockerHubを経由しなくてもリモートでイメージを転送できます

docker save イメージ名(複数指定可能) | docker --tls -H サーバ名 load

ローカルで作成したイメージやCI/CDでビルドしたものを転送する場合に便利です
小規模なものならこれで簡単にデプロイが可能です

5.6 docker-composeから接続する場合

証明書作成時に指定したホスト名と一致しないと接続できないので注意してください

docker-compose --tlsverify -H ホスト名:2375 以下通常コマンド

6.まとめ

 証明書の発行させしてしまえば、リモートで簡単にDockerを操作することが出来るようになります
 あとはコンテナを送りつけて動かせば大体何でも出来るようになります
 ただし、パプリックなリポジトリに証明書を入れて公開するようなミスには気をつけてください
 公開は後悔を生みます

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

Docker勉強メモ

Dockerを初めて使うことになったので勉強や調べたことの備忘録的なもの。
調べたことや学んだことがあったら随時追記してきます。

Dockerコマンドメモ

docker container run Dockerイメージ名 実行コマンド
①            ②              ③

①コンテナを作成実行
②もとになるdcokerイメージ
③コンテナ内で実行するコマンド

バージョンの確認

docker version

実行状況確認

docker system info

ディスク利用状況

docker system df

イメージのダウンロード(Nginx)

docker pull nginx

イメージを使ってNginxを起動

docker container run --name webserber -d -p 80:80 nginx

※webserberは任意

サーバの状態を確認

docker container ps

コンテナの詳細確認

docker container status webserber

※webserberは任意

サーバの停止

docker stop webserber

※webserberは任意

サーバを起動

docker start webserber

※webserberは任意

docker hubからnginxのイメージを検索

docker search nginx

イメージの削除

docker image rm イメージ名

コンテナの作成

docker container create 

※作成するのみ

コンテナの作成/起動

docker container run 

対話的実行

docker container run -it --name "test1" centos /bin/cal

バックグラウンド実行

docker container run -d centos /bin/ping localhost

※-dがバックグラウンド実行

ポートのマッピング

docker container run -d -p 8080:80 nginx

不要なイメージの削除(noneの奴)

docker rmi $(docker images -f dangling=true -q)

コンテナに入る

docker exec -i -t コンテナ名 bash

ファイル指定してビルド

docker build -f Dockerfileのパス -t イメージ名 .

キャッシュを利用しない

docker build -f Dockerfileのパス -t イメージ名 . --no-cache
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker環境のgRPC/goでハローワールド

はじめに

goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
Quick start – gRPC

goもgRPCもよくわかってない。

環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
grpc/go - Docker Hub

Docker

こんな感じで立ち上げた。Dockerよくわからん 。

docker pull grpc/go
docker run --name grpc-go -it grpc/go /bin/bash 

Quick Start

Quick Startにそって順番に実行していく。

下記コマンドを実行すると、

$ go run greeter_server/main.go

こんな感じのエラーが出る。

cannot find package "golang.org/x/net/http2"

とか

undefined: "github.com/golang/protobuf/proto".ProtoPackageIsVersion4

必要そうなのを入れたり、下記コマンドで入れ直したりした。

go get golang.org/x/sys/unix
go get golang.org/x/net/http2
go get google.golang.org/genproto/googleapis/rpc/status
go get -u github.com/golang/protobuf/proto

最後のやつはコピペもとを真似して-uをつけたけど、よくわかってない。
updateっぽいけど。

go - The Go Programming Language

The -u flag instructs get to update modules providing dependencies of packages named on the command line to use newer minor or patch releases when available. Continuing the previous example, 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, but C does not provide any packages needed to build packages in A (not including tests), then C will not be updated.

上記エラーが出た時に、下記コマンドうったりして、消して入れ直したりしてたから、バージョンとかがよくわからなくなった。
そのうち、わかるようになりたい。rmしたけど、そういえばバイナリファイルは消してない。どうなったんやろう?上書きされたんかな?

rm -rf /go/src/github.com/golang/protobuf/proto
rm -rf /go/src/google.golang.org/grpc/
git clone https://github.com/grpc/grpc-go

エラー出た時、こことかを参考にした。
Go Frequently Asked Questions  |  Protocol Buffers  |  Google Developers

上記対応で、最初の、serverとclientの方は動いた。
その後、SayHelloAgainをすると、undefinedと言われた。

$ go run greeter_client/main.go 
# command-line-arguments
greeter_client/main.go:59:12: c.SayHelloAgain undefined (type helloworld.GreeterClient has no field or method SayHelloAgain)

main.goにあるpb "google.golang.org/grpc/examples/helloworld/helloworld"が怪しかったので、パスを辿って見てみると、/go/src/google.golang.org/grpc/examples/helloworld/helloworldhelloworld.protoの古いやつがあった。

どうするのが良いのかよくわからんかったけど、修正後の~/grpc-go/examples/helloworld/helloworldを上記パスに上書きコピーした。
再度、serverとclientを実行すると期待通り動いた。
とりあえず、よかった。hello world できた。

環境

最終的に動いた時の環境はこんな感じ。
go getで入れたバージョンの確認方法がよくわからん 。
GOPATHとかはdocker pullしたイメージでデフォルトで入ってた。
.bashrcは空っぽでも動いてる。

# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/go"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build743505095=/tmp/go-build -gno-record-gcc-switches"
# go version
go version go1.10.4 linux/amd64
# protoc --version
libprotoc 3.6.0

最後に

ハローワールド的なことできた。よくわからんことだらけなので、ちょっとずつ調べながら学んでこう。

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

docker経由でMinecraft資源(Spigot)サーバーを立てる(2)

どうせ創るのは豆腐ハウスだけどな!

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

関連記事:
docker経由でMinecraft資源(Spigot)サーバーを立てる

------------------- ↓ 余談はここから ↓-------------------

Minecraftサーバーを建てて実際に運用してみると、
調整事項がいっぱいある。

通常ワールドの難易度、
資源サーバーの天候やモンスターの出現状態、
クリエイティブなら時間状態など。

複数人参加を考えるなら、
コマンド実行権限、行動範囲領域、
そのサーバーは採取可能にするのか、
荒し対策はするのかなどなど。

今回はインストール後の調整事項を列挙していこう。


------------------- ↓ 本題はここから ↓-------------------

複数ワールド

通常ワールド

configを変更していなければデフォルトの難易度はEASY。
好みの問題かもしれないが難易度はNORMALにしておきたい。

設定項目 設定値 詳細
difficulty normal まぁ、normalで
$ docker exec -i mc mcon-cli
> mv modify set difficulty normal world
§aSuccess!§f Property §bdifficulty§f was set to §anormal

資源サーバーの設置

資源サーバーは基本的にリセットするもの。
リセットすると取ったモノは元に戻り、造ったモノは消える。
となるとポータルとか苦労して造っても消えてしまう。
なんかいい方法はないかな。
(まだ答えは出てない)

あと、竹とか雪、海など特定のバイオームがスポーン地帯から近い方がいいので、
シード値も設定しておきたい

設定内容は

設定項目 設定値 詳細
weather false 天候は晴れのままにしたい
monsters false モンスターは沸かない方がいい
hunger false 空腹はなしの方向
doDaylightCycle false 時間は固定にしたい

こんな感じかしら

$ docker exec -i mc mcon-cli
> mv create asset NORMAL -s 3116934447057457676
Starting creation of world 'asset'...
Complete!

> mv modify set weather false asset
§aSuccess!§f Property §bweather§f was set to §afalse

> mv modify set hunger false asset
§aSuccess!§f Property §bhunger§f was set to §afalse

> mv modify set monsters false asset
§aSuccess!§f Property §bmonsters§f was set to §afalse

> mvrule doDaylightCycle false asset
§aSuccess!§f Gamerule §bdoDaylightCycle§f was set to §afalse§f.

農場サーバーの設置

各種農場、トラップでアイテムを増殖させたいのだが、
通常ワールドにそれがあるとつまらないのと、
mobやエンティティが増えるとサーバーが重くなるので、
ワールドごと別にしたい。
そこでファームサーバーを用意する
(人がいなければ時間が止まるのでそこが悩みどころ)

制作はクリエイティブモードで運用はサバイバルモード。

設定内容は

設定項目 設定値 詳細
gamemode creative クリエイティブモードにする
difficulty hard 湧きモンスは多種多様の方がいい
weather false 天候は晴れのままにしたい
hunger false 空腹はなしの方向
doDaylightCycle false 時間は固定にしたい

こんな感じかしら

$ docker exec -i mc mcon-cli
> mv create farm normal
> mv modify set gamemode creative farm
> mv modify set difficulty hard farm
> mv modify set weather false farm
> mv modify set hunger false farm
> mvrule doDaylightCycle false farm

実験サーバーの設置

サバイバルで設置する建物や回路を実験するためのサーバーが欲しい。
ローカルでやってもいいけど、
せっかくなので実験サーバーも用意する。

$ docker exec -i mc mcon-cli
> mv create test NORMAL -t FLAT
Starting creation of world 'test'...
Complete!

サーバーインポート

実験サーバーや農場サーバーは新規のワールドごとに作り直すのが面倒なので、
創ったサーバーのワールド情報をインポートする

$ cp -R ~/minecraft_data/old_world/test ~/minecraft_data/new_world/
$ docker exec -i mc mcon-cli
> mvimport test NORMAL
Starting import of world 'test '...
§aComplete!

行動範囲制限

ご存じの通り遠くに移動すればするほどサーバーのサイズが大きくなる。
これを使って荒らすやつとかもいるようで。
(よー知らんけど)

それはさておき、
無駄にサイズがでかくなるとか、
重くなるとかは避けたいので、
範囲制限だけ付けて様子を見ておく。

以前はプラグインで設置していたようだが、
今は標準コマンドがあるらしい。

$ docker exec -i mc rcon-cli
> lp user Dozo permission set minecraft.command.* true

マイクラ上で以下のコマンドを実行。
とりあえず1万ブロックにしとくか

/worldborder set 10000

どのくらいが妥当なのかよーわからん (・ω・)

ワールドポータル作成

ワールド間の移動はデフォルトではコマンド入力。
ユーザーがログイン状態の時にコマンドを入力することで行き来できる。
ただ、ユーザー側にコマンド権限を与えるか、
サーバー管理者が都度入力するのは現実的ではないので、
権限を渡さずにユーザーに移動を任せたい。

そんな時に使うのが Multiverse-Portals

権限を持っているユーザーが実際にMinecraft上でネザーゲートのような構造物を建築。
特定のアイテム(デフォルトでは木の斧)でポータルを設定する。

前提としてポータルを作成するユーザーにMultiverse-Portalsの権限を付与しておく

$ docker exec -i mc rcon-cli
> lp user Dozo permission set multiverse.* true

資源ワールドをasset, 通常ワールドをworld、ゲートをそれぞれgate_ワールド名とすると。

  1. 通常ワールドにてネザーゲートのような形の構造物を作成(素材はなんでもいいが壊されにくい物で)
  2. 「/mvp wand」と入力し、木の斧を入手。
  3. 木の斧を装備してゲートの角にあたるブロックを左クリック
  4. 対角線上反対側のブロックを右クリック
  5. 「/mvp create gate_world」でポータルと認識される
  6. 資源ワールドに移動して1~4を実行
  7. 「/mvp create gate_asset p:gate_world」で通常ワールドと繋がったポータルと認識される
  8. 「/mvp select gate_world」と入力
  9. 「/mvp modify dest p:gate_world」と入力

(なるほど。わからん。 (・ω・))

行き先は必ずしもゲートにする必要はなく、
ワールド指定すればスポーン地点に移動するし、
座標を指定することもできるようだ。

ワールドを経由すればファストトラベル(ショートカット)も作れそうだな。
やっぱりマリオの土管風に造る感じだろうか。

権限を持っているユーザーは木の斧で木を切れなくなるので注意
権限が外れると使えるようになる。

クリエイティブモードだとブロックを破壊するので、
サバイバルモードに切り替えておく。
(スペクテイターモードとかの方がいいのかな?)

参考:
https://w.atwiki.jp/minecraftdevip/pages/31.html

ワールド間移動時のインベントリ維持

ワールド移動すると気がつくが、
手持ちの荷物がリセットされている。
これはポータル越しに移動してもそうなっている。

荷物を保持して行き来できなければ資源サーバの意味がない。
そんな時に使うのが Multiverse-Inventories
手持ちの荷物を保持したまま行き来することができる

プラグインを設置した段階で、
defaultという名称の設定がされていてるので、
追加のサーバーも加えておく。

> mvinv addworld asset default

※一度ワールドに行ってから設定した方がいい


------------------- ↓ 後書はここから ↓-------------------

Paperサーバー

今回使用したdocker image(itzg/minecraft-server, 多分公式)では利用できるサーバーを選択できる

それぞれどのような特性があるのかよく知らない。

今回使用したのはサーバーはSpigotだが、
これの派生で軽量化されたPaperに切り替えた。
一応Bukkit/SpigotのMod、プラグイン類はそのまま適用できるみたい。

$ docker run -d -v ~/minecraft_data:/data -p 25565:25565 -e TYPE=PAPER -e EULA=TRUE --name mcp itzg/minecraft-server

ちなみに全ワールド(ディレクトリまるごと)そのまま移行してみたが、
問題なく動いてるようだ。

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

よく使うdocker-composeコマンド

よく使うdocker-composeコマンドまとめ

・ボリュームを削除して、停止。

docker-compose down -v

・キャッシュなしでビルド

docker-compose build --no-cache

・バックグラウンドで起動

docker-compose up -d

・コンテナに接続

docker-compose exec #{container} bash
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む