- 投稿日:2020-11-04T22:21:12+09:00
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
- 投稿日:2020-11-04T21:07:49+09:00
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/_/nodeDockerfileFROM node:15.0.1-alpine3.10docker-compose.ymlの作成
https://docs.docker.com/compose/compose-file/ からテンプレートを取得し、ゴニョゴニョします。
#docker-compose.ymlの作成 vi Docker-compose.ymldocker-compose.ymlversion: "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 typescriptfront/my-app配下に、Reactのプロジェクトが作成されたことを確認できたら、
再度Dockerfileと、docker-compose.ymlファイルを修正し、コンテナを立ち上げます!DockerfileFROM node:15.0.1-alpine3.10 #下2行を追記! COPY ./front /front WORKDIR /frontdocker-compose.ymlversion: "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/coreinstallできたら、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.tsximport React from "react"; import { Button } from "@material-ui/core"; const WrapButton = () => { return ( <> <Button variant="contained" color="secondary"> Hello World! </Button> </> ); }; export default WrapButton;App.tsximport 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;ちょっと不格好ですが、Buttonコンポーネントが表示できていることが確認できましたね!(メールの通知は気にしないでください・・笑)
ひとまず開発環境が整ったので、ここから好きなようにゴニョゴニョしていきましょう!
- 投稿日:2020-11-04T20:13:56+09:00
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の作成
1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
EC2インスタンスの作成
Ubuntu 18.04を選択
ステップ2でt2.microを選択
ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
ステップ7 で起動をクリック。
SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。この間で、mykey.pemの認証をしましょう。
ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.htmlしばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。
ターミナルを開いて
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-composeexitでrootから抜け出す
Laradocをgit cloneする。
git clone https://github.com/Laradock/laradock.git
$ 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=secretLaravelで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で固定にしてもいいですが、今回はしません。)いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。
EC2再起動したときの注意事項
1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。sudo su cd laradock/ docker-compose up -d nginx mysql phpmyadmin2)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も勉強しようとおもいます。
なにか、みなさまの参考になれば幸いです。
以上
- 投稿日:2020-11-04T20:13:56+09:00
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の作成
1個のパブリックサブネットを持つVPCを作成します。
プライベートなサブネットを作りたいときは下のパブリックとプライベートサブネットを持つVPCを作ります。
このとき、IPv4 CIDRブロックは10.0.0.0/16
パブリックサブネットのIpv4 10.0.0.0/24にしておきましょう。
EC2インスタンスの作成
Ubuntu 18.04を選択
ステップ2でt2.microを選択
ステップ3 インスタンスの詳細の設定では先程作成したVPCを選択.自動割当パブリックIPも無効から有効にしましょう。
ステップ6 セキュリティグループ設定ではHTTPの80ポートを使用するので、ルールの追加で追加する。
ステップ7 で起動をクリック。
SSH接続するための、キーペア(mykey.pem)はダウンロードしておきましょう。この間で、mykey.pemの認証をしましょう。
ダウンロードフォルダに移動して下記のコマンド実行しましょう
そうしたら認証が変わります。
chmod 400 mykey.pem
詳しくはawsの認証ページに書いてあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.htmlしばらくしたらインスタンスがrunnningになるので、EC2ダッシュボード⇒実行中のインスタンスをクリック⇒作成したインスタンスIDをクリック
右上にある接続をクリック
SSH接続する場合は下にあるところ(コピーされたコマンドをクリック)したらいいです。
ターミナルを開いて
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-composeexitでrootから抜け出す
Laradocをgit cloneする。
git clone https://github.com/Laradock/laradock.git
$ 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=secretLaravelで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で固定にしてもいいですが、今回はしません。)いけますね。疑い深いんで、ローカルじゃなくグローバルになってるか確認するために、iphoneで動くか確認してもいけてます。
EC2再起動したときの注意事項
1)EC2再起動するたびにdocker-compose再起動しましょう。
EC2停止すると再起動するらしいとのことなので、
EC2起動のたびdocker-compose立ち上げないといけないので、
下記のコマンド実行します。sudo su cd laradock/ docker-compose up -d nginx mysql phpmyadmin2)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も勉強しようとおもいます。
なにか、みなさまの参考になれば幸いです。
以上
- 投稿日:2020-11-04T18:40:51+09:00
【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.confDockerfile設定
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/apache2apacheコンテナの起動
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 apacheHTTPS接続が可能になっていればOK
https://localhost
※ ドメイン名は適宜変更
- 投稿日:2020-11-04T18:32:43+09:00
さわって学ぶクラウドインフラ 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を用いたコンテナ運用
- 投稿日:2020-11-04T17:10:04+09:00
【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: trueDockerfile設定
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/apache2jenkins
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
※ ドメイン名は適宜変更
- 投稿日:2020-11-04T16:35:51+09:00
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 dockersudo なしに docker コマンドを実行可能にするのであれば、次のように対象のユーザーを docker グループへ追加
$ sudo usermod -aG docker $USER3.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-smiNvidia DriverとCUDA Versionが表示されれば完了。
- 投稿日:2020-11-04T15:31:09+09:00
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 zshoh-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-autosuggestionsVimなどのテキストエディターで~/.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 nvmZshをリロード:
source ~/.zshrc
NodeJS
WSLを開きます。
特定バージョンをインストールnvm install x.x.x
or 最新版
nvm install node
Docker (Docker Desktop WSL 2 backend)
要件は前述のWSL、WSL2のマニュアルに従えば満たしてるはずなので、
最新版のインストーラーをダウンロード、インストール途中でWSL2のチェックボックスを入れるだけで完成。もし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じゃないと動きません。
- 投稿日:2020-11-04T13:23:06+09:00
Dockerを監視のための ""監視ツール"" をご紹介
データは、あらゆる形態において、非常に強力で有用なものとなります。収集されたデータは、いつでも驚くべき洞察を提供し、最適化、障害認識/許容度、および新機能の開発のための意思決定の際に役立つものです。これらのデータは、ビジネス、ソフトウェアアプリケーションのセット、またはコンテナから由来するものである可能性があります。
コンテナは最新のソフトウェアアーキテクチャの不可欠な部分になり、データベース、アプリケーションの一部、さらにはアプリケーション全体を、ホストサーバーから独立した自己完結型の環境でホストできるようになりました。そのため、コンテナを適切に監視することは、コンテナがホストするアプリケーションを正常で効率的に保つために絶対に不可欠です。
現在、Dockerはコンテナーの世界で支配的な勢力であり、2018年に本番環境にあるすべてのコンテナーの83%以上を占めています。その人気により、Dockerコンテナーの監視は、さまざまなツールが存在するため、選択の問題に帰着することがあります。そこから選択し、それぞれに長所と短所があります。
多くのユースケースの場合、MetricFireはDockerコンテナを監視するための優れたオプションとなります。 MetricFireは、Graphite、Prometheus、Grafanaのホストバージョンを提供するプラットフォームです。 これらのオープンソースツールに基づいて構築されたMetricFireは、高度にカスタマイズ可能で、DevOpsおよびSREコミュニティ全体でよく知られているアジャイルツールを提供します。 しかも、お値段もお手頃です。ここでMetricFireの無料デモを予約し、今日からDockerコンテナーの監視を開始するために必要なことや質問等ございましたらご相談ください。
この記事の目的は、人気のあるDocker監視ツールの詳細を、ユースケースを用いて最適なツールを決定するのに役立つ方法と一緒に提供することです。
MetricFire
オープンソースのPrometheus、Graphite、Grafana上に構築されたMetricFireは、デフォルトのダッシュボードとプラグインをすぐに利用できる状態でDockerコンテナーをすぐに監視する準備ができています。 MetricFireは基本的に、オープンソースプロジェクトのホストバージョンを提供するサービスであるため、MetricFireはオープンソースプロジェクトが行えることは基本すべて実行できます。 これには、コミュニティ全体で開発されたすべての適応とプラグインが含まれています。
MetricFireは、cAdvisor、Prometheus、Kubernetesと統合されており、Dockerコンテナーを監視するための究極のツールになっています。 オープンソースツールの背後にいるフォロワーの大規模なコミュニティの結果として、MetricFireの背後にあるテクノロジーも絶えず開発され進化しています。
つまり、Docker監視ツールとしてMetricFireを選択した場合、DockerとKubernetesが急速に開発されるため、監視テクノロジーが時代遅れになることを心配する必要はありません。
MetricFireには14日間の無料トライアルがありますので、まずは無料デモを予約して、ユースケースについてご相談ください。
Docker CLI(docker stats)
docker自体が提供する監視ツールであるdockerstatsコマンドを見てみましょう。 ターミナルでこのコマンドを実行すると、コンテナを実行するためのライブデータストリームが返され、コンテナのリソース消費をカバーする基本的なメトリックが提供されます。
これらのメトリックには、存在するさまざまな実行中のコンテナーのコンテナーID、CPU、メモリー、およびネットワークの使用状況が含まれます。 実行中のすべてのコンテナーではなく、単一のコンテナーのメトリックをリストする場合は、コマンドの最後にそのコンテナーのコンテナーIDを追加するだけです。次に例を示します。
上記の例では、コンテナーIDがfb649db2dc20のコンテナーのみのメトリックをフェッチしています。 --no-streamオプションを使用してストリーミング統計を無効にし、最初の結果のみがプルされるようにします。
そのフラグなしでこのコマンドを実行すると、プロセスを手動で停止するまで、これらのメトリックが継続的にポーリングおよび表示されます。 このコマンドの他の便利なフラグは、dockerのドキュメントにあります。
ただし、docker statsコマンドは、いかなる形式のデータ視覚化もサポートしていません。ターミナルに生データとしてメトリックを表示するだけです。 そのため、コンテナの状態とステータスを一目で確認するのに役立ちますが、詳細な監視または視覚的な監視ダッシュボードが必要な状況ではあまり価値がありません。 優れた視覚化による長期的な監視には、Grafanaをお勧めします。
cAdvisor
cAdvisorは、Googleが管理するオープンソースのコンテナ監視ツールです。 Docker、または文字通り他のタイプのコンテナーのサポートが組み込まれているため、cAdvisorを使用して、事実上すべてのタイプの実行中のコンテナーに関するデータを収集できます。 これは、実行中のコンテナーに関する情報を収集、処理、集約、およびエクスポートする単一の実行デーモンで構成されています。
この情報は、組み込みのユーザーインターフェイスからエクスポートして表示することも、より大きな監視プラットフォームにエクスポートして分析と視覚化を行うこともできます。 ただし、cAdvisorは、監視するコンテナーで大量のメトリックを収集しますが、メモリやCPU使用率など、コンテナーのパフォーマンスの特定の側面に関する一般的なデータのみを表示するため、Webユーザーインターフェイスはかなり制限されています。 以下にcAdvisorダッシュボードの例を示します。
cAdvisorが収集する詳細なメトリックにアクセスするために、ストレージプラグインを使用して、これらのメトリックをより大きな監視システムまたはストレージシステムにエクスポートし、そこから処理することができます。 cAdvisorを使用してDockerコンテナーを監視する方法の詳細については、この記事を確認してください。 また、cAdvisorをMetricFireと統合することも検討してください。これにより、両方の長所が得られます。
Prometheus
Prometheusは、非常に人気のあるオープンソースの監視および警告システムです。 プッシュベースのメカニズムを使用してメトリックを収集するほとんどの監視ツール(監視対象のコンテナー上のエージェントがメトリックを収集して送信する)とは異なり、Prometheusはプルベースのメカニズム(ポーリング)を使用します。
プルベースのシステムでは、コンテナー/サーバーがメトリックエンドポイントをPrometheusに公開し、Prometheusが構成可能な間隔でこれらのエンドポイントからメトリックデータを取得します。
次に、Prometheusはこのデータを処理および集約して、組み込みの式ブラウザーを使用してデータを表示したり、Grafanaなどの視覚化ツールで洞察に満ちたダッシュボードを構築したりできるようにします。
Prometheusは、ポーリングメカニズムと組み合わせて、多種多様なクライアント側の統合を可能にする、大量のクライアントライブラリを提供しています。
基本的に、メトリックをPrometheusに取り込むために必要なのは、アプリケーションコードに適切なクライアントライブラリを使用して、アプリケーションのインスタンスでHTTPエンドポイントを使用してこれらのメトリックを定義および公開することです(クライアントライブラリを使用して作成されたメトリックはカスタムメトリックと呼ばれます)。
Redis DBメトリックをPrometheusにインポートする例を含む、完全なチュートリアルをここで見ることができます。 Prometheusはこれらのメトリックをスクレイプし、エクスプレッションブラウザまたはGrafanaなどのビジュアライザを使用してそれらを視覚化できます。 Prometheus ExpressionBrowserの例は以下にあります。
これらのクライアントライブラリを使用して、適切なライブラリを組み込み、公開したいカスタムメトリックを公開することで、Dockerコンテナ内で実行されているアプリケーションを監視できますが、これらのライブラリを使用して、次のようなDockerコンテナのメトリクスを取得することはできません。コンテナのCPUまたはメモリ使用量など。
これは、Dockerコンテナのメトリックを直接Prometheusにエクスポートするコンテナエクスポータを使用して可能でした。ただし、コンテナーエクスポーターメソッドは非推奨になり、cAdvisorを使用してコンテナーメトリックを監視し、前述のようにそれらをPrometheusに公開するようになりました。
Prometheusを選択すると、多くの構成とメンテナンスを行う必要があるというトレードオフが伴います。簡単ですぐに使用できるPrometheusインスタンスを優先して、これらの構成とメンテナンスのボトルネックをスキップしたい場合は、MetricFireが提供するPrometheusのマネージドツールHosted Prometheusの無料デモにサインアップしてチームと直接話し合ってください。
まとめ
コンテナ化されたアーキテクチャとDockerの一般的な人気を考えると、他にもいくつかの監視オプションがあります。 これらには、Datadog、Sysdig、SolarWinds、NewRelic、SignalFxなどがあります。
それぞれ長所と短所があり、アーキテクチャも異なります。エージェントベースのものとクラウドホスト型のものがあります。 非常に多くのオプションから選択するのは難しい場合がありますが、どちらを選択するかは、ユースケースまたは最終目標に大きく依存します。
決定の手助けが必要な場合は、デモを予約してMetricFireに連絡してください。 私たちはモニタリングの専門家であり、あなたに最適なモニタリング設定に向けてあなたを導くためにいます。 ハッピーモニタリング!
- 投稿日:2020-11-04T13:08:30+09:00
Linux Mint20でMJ4(麻雀ゲーム)をする
Linux Mint20でWineでMJ4を実行しようとしたら、すっとできなかったので、対応方法を記載する。
MJ4とは
SEGAの麻雀ゲーム
スマホアプリ・Windowsアプリ・アーケード版はあるけど、Linux版はない。実施してみたこと
Linux Mint20のWine上で実行
⇛ゲームをしていると、ちょいちょいアプリが落ちる
⇛NGVirtualBox上にUbuntu入れてWine上で実行
⇛画面の描画が重たい。そもそも立ち上げるのがめんどくさい
⇛NGDocker上のUbuntuにWine入れて実行
⇛問題なしそのため、Docker上のUbuntuにWine入れて実行する形で、MJ4を楽しみます。
実行までの手順
概要
- コマンドからGUIアプリ起動可能なUbuntuのDockerイメージを作成
- 上記にWineを導入したDockerイメージを作成
- 上記にdotnet35spを導入したDockerイメージを作成
- 上記に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_winedotnet35spを導入した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/wineMJ4をインストールしたDockerコンテナを作成
sabocla6/wineからコンテナを作成します。
sudo docker run -it --shm-size=2G --privileged --network host -e DISPLAY=$DISPLAY -v $HOME/.Xauthority:/root/.Xauthority sabocla6/wineMJ4のインストーラを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が立ち上がります。
- 投稿日:2020-11-04T11:35:13+09:00
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"]
- 投稿日:2020-11-04T11:26:37+09:00
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
でした。
- 所定の場所(/usr/local/share/ca-certificates/extra/)に証明書を配置
- ca-certificates パッケージをインストール
- 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
でした。シンプルに、
- 所定の場所(/usr/local/share/ca-certificates/)に証明書を配置
- ca-certificates パッケージをインストール
- 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 allcentos:latest (執筆時点では centos:8 )は、dnfコマンドがうまく動かなかったので、妥協して centos:7 としました。執筆時点の
ca-certificates
は、ca-certificates-2020.2.41-70.0.el7_8.noarch
でした。こちらも、
- 所定の場所(/usr/share/pki/ca-trust-source/anchors/)に証明書を配置
- ca-certificates パッケージをインストール
- 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) でした。
基本的な流れは
- 適当な場所に証明書を配置
- 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 として公開したいと思います。
- 投稿日:2020-11-04T10:47:00+09:00
【Docker】基本のDocker Instructionの紹介
また少しDocker担当から離れていきそうなので備忘録もかねて記述していきたいと思います。
今回は簡単にFROM, RUN, CMDのご紹介です。FROM
DockerfileはFROMを記述して、ベースとなるイメージを決めます。
ex.ubuntuの最新バージョンのイメージを指定する場合FROM ubuntu:latest慣れるまでは自分が必要とするツールが揃っているものを指定するのもいいと思います。慣れてきたらOSのみで欲しいツールを入れていくことを検討するといいと思います。
RUN
このコマンドを使うことでサーバーに必要なものを好きなようにカスタマイズすることが可能です。
ex.イメージOS上にtest1.txt,test2.txtというファイルを作成する
DockerfileRUN touch test1.txt RUN touch test2.txt
RUN
コマンドを複数行と実行することでイメージOS上の環境を整えていくことが可能ですが、RUN
ごとにレイヤーが作られます。
レイヤーが増えるとイメージが大きくなるので注意が必要です。レイヤーを少なくする工夫
レイヤーを作るコマンドRUN, COPY, ADDを複数使う必要がある場合は&&でコマンドをつなげて記述する。1行が長くなるとDockerfileが見辛くなるので(バックスラッシュ)で改行をする。
DockerfileRUN apt-get update RUN apt-get install aaa RUN apt-get install bbb RUN apt-get install ccc↓
DockerfileRUN apt-get update && apt-get install aaa bbb ccc↓インストールのパッケージが増えると見辛くなるので改行で整えます。
DockerfileRUN 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を記述するとキャッシュが利用されずに全てをネットワーク上から取得する事になる。DockerfileRUN apt-get install \ aaa \ bbb \ ccc↓まずは違うRUNで記述します。
DockerfileRUN 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、便利なんでぜひお試しください。
- 投稿日:2020-11-04T09:35:56+09:00
コロナ禍を乗り切るSlackアプリを開発してコミュニケーション向上
作ったもの
Slackのテキストメッセージの代わりに漫画でコミュニケーションする「comawari」というSlackアプリです。
Slack上でモーダルを開いてどの画像にセリフを乗せるか選んで投稿できます。
2020年11月現在、以下のサイトから画像データを利用させて頂いています。
ブラックジャックによろしく
ジブリ仕組み
SlackのOAuth認証を経て、Slash CommandsとInteractivityという仕組みを利用して漫画を投稿します。
OAuth
リダイレクトURLで渡されたcodeをSlackAPIに問い合わせるとアクセストークンを取得できるので安全なストレージに保存します。
リダイレクトURLはSlackアプリ管理画面で指定できます。Slash Commands
Slashコマンドが実行されると叩かれるcomawariのAPIがモーダルを開くSlackのAPIを叩きます。
投稿
ユーザがモーダルで送信ボタンをクリックするとSlack管理画面のInteractivityで指定したAPIが叩かれます。送信したユーザのアクセストークンを利用し、ユーザに成り代わり漫画を表示する投稿を行います。
プログラム
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を切るスピードで描画できます。
ブラックジャックによろしく / 佐藤秀峰元画像データ
漫画の元となる元画像はフリーで利用しても良い画像を選びテキストエリアを定義した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/b45dbc70faedf30f484eSlack審査
Slackアプリとして公開するためにはAppleStoreと同じように審査が必要です。
ランディングページを作ってプライバシーポリシー宣言やユーザサポートを考えなきゃいけなかったりとなかなか大変でした。指摘事項
OAuthで要求するSlackパーミッション多すぎ
サービス実現に不要なパーミッションを要求パーミッションから外す。
アクセストークンをユーザが消せるように
/deauth_coma コマンドを新設し、実行するとアクセストークンを削除するように対応。メールでの対応だとなりすまして認証解除の恐れがあるため。
ユーザサポート
/support_coma コマンドを新設し、メッセージを私に送られる機構を構築。メールでの連絡だとスパム扱いになって見過ごす可能性があるため。
残った課題
費用
楽しいサービスが作れたのでなるべく維持していきたいのですがサーバ運用費が高くなると維持が難しくなっていきそうです。そうなった場合、マネタイズも考えないといけません。Dockerコンテナで動いているのでDockerが動く安い環境であればどこへでも持っていけます。
括弧対応
「」や【】みたいな括弧に対応していません。漫画のコマにはなかなか出てこないので対応しなくても良さそうですがなんか良い対応方法がないか検討しています。
フォント
アラビア語とか中国語とかの言語には対応しておらず文字が豆腐になってしまいます。フリーのフォントを探していろいろな使い方ができるように改善したい。
国外輸出
日本語だけの対応ですがせっかくSlackが全世界で使われているので海外の方にも使っていただきたいところです。版権的に難しそうですがアイアンマンとかできればいいのに。
感想
このサービスは数年くらい前からやりたかったことなので実現できて凄い達成感。
以前、チャレンジしたときはHTMLとJSで画像の上にテキストを縦書きにした程度でした。
Slackという優れたコミュニケーションツールとgolangの開発力を地道に上げたことが功を奏しました。
少しずつ改善を続けてもっと良いものができると信じ、開発を続けます。謝辞
このサービスを作るにあたり二次利用を許可してくださった佐藤秀峰さん(本記事公開時点では未事後報告)、常識の範囲での利用を許可して頂いたスタジオジブリさんには感謝しかありません。
本当にありがとうございます。
- 投稿日:2020-11-04T09:02:03+09:00
Docker コンテナの活用シーン
はじめに
![]()
Docker コンテナを初めて使ってから2年くらい経ちました
色々な活用シーンを見た気もするし、誤った使い方をしているのではと気にかかる時もあります。
Docker コンテナを使い始めた人に伝える目的だったり、新しい活用知識が得られる期待もあって"Docker コンテナの活用シーン"を晒します。
1. ソースコードと実行環境を含んだアプリケーションの配布用途
(アプリケーション配布者側)
- Dockerfile を用意する
- ソースコード・実行ファイル、実行環境を含めてコンテナイメージをビルドする
- コンテナイメージをレジストリに置く
(アプリケーション利用者側)
- レジストリからコンテナイメージを取得する
- (もしくは Dockerfile からコンテナイメージをビルドする)
- コンテナイメージを利用する
2. 開発時の実行環境配布用途
- 成果物がソースコードのみ(ライブラリ等)の場合に開発時の実行環境を用意する
- 配布者はコンテナイメージをレジストリに置くことまでする必要はない
- (Dockerfile を用意しておく)
3. DevContainer(開発環境)配布用途、リモート開発環境用途
- "2. 開発時の実行環境配布用途"がプログラムの実行環境を用意するのに、対しこちらは開発環境をコンテナに入れる
- githubのcodespacesに開発環境をdeployする事ができるらしい
- 筆者はまだ触っておらず、codespacesがGAになるまで待っています
- 〜開発環境は全てコンテナの中へ〜VS Code Dev Container Guidebooに詳しく書かれています
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_commandhoge_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 のチュートリアル
以上です。
他にもこんな使い方したら便利だよという情報があれば教えてください。
- 投稿日:2020-11-04T08:54:54+09:00
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-ce2.Dockerの起動設定
OS起動時に自動起動させ、その場でも起動させます
sudo systemctl enable docker sudo systemctl start docker3.動作確認
デフォルトではDockerへの接続にroot権限が必要です
sudo docker ps
4.一般ユーザでDockerを使えるようにする
以下のコマンド実行後、ログインし直すと使えるようになります
sudo echo usermod -aG docker `logname`確認
docker ps5.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.15.1.1 生成されるファイル
プライベートキー
/etc/docker/certs/private-key.pemDockerデーモン用ファイル
/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.pemWindowsやMacの各環境でリモート接続する場合は、クライアント用ファイルをユーザディレクトリの.dockerフォルダにコピーします
5.1.2 プライベートキーに関して
証明書の自動生成スクリプトはプライベートキーを使い回すように作ってあります
そのため証明書を再発行しても、クライアントの証明書は配り直す必要がありません
また、既存のプライベートキーを他のサーバの同じ位置にコピーした状態で証明書を作成すると、同じクライアント用ファイルで複数のサーバに接続可能になります完全な作り直しが必要な場合は、プライベートキーを手動で消してください
5.2 サービスの設定変更
- ファイルの書き換え
/lib/systemd/system/docker.service のExecStartを以下のように書き換えます
この設定によって、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.service5.3 サービスの更新
sudo systemctl daemon-reload && sudo systemctl restart docker5.4 tlsによる接続確認
ここまでのサービス設定で-Hを使ってアドレス指定で接続する場合はtls接続が必須になっています
そのため--tlsを指定しないと接続できません
--tlsverifyにした場合は、接続時にドメイン名を検証するようになりますdocker --tls -H localhost psdocker --tlsverify -H localhost ps5.5 リモートでのDockerイメージの転送
Dockerのコマンドには、Dockerイメージをパイプで受け渡す機能があるので、以下のようにするとDockerHubを経由しなくてもリモートでイメージを転送できます
docker save イメージ名(複数指定可能) | docker --tls -H サーバ名 loadローカルで作成したイメージやCI/CDでビルドしたものを転送する場合に便利です
小規模なものならこれで簡単にデプロイが可能です5.6 docker-composeから接続する場合
証明書作成時に指定したホスト名と一致しないと接続できないので注意してください
docker-compose --tlsverify -H ホスト名:2375 以下通常コマンド6.まとめ
証明書の発行させしてしまえば、リモートで簡単にDockerを操作することが出来るようになります
あとはコンテナを送りつけて動かせば大体何でも出来るようになります
ただし、パプリックなリポジトリに証明書を入れて公開するようなミスには気をつけてください
公開は後悔を生みます
- 投稿日:2020-11-04T08:42:51+09:00
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
- 投稿日:2020-11-04T08:42:23+09:00
Docker環境のgRPC/goでハローワールド
はじめに
goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
Quick start – gRPCgoもgRPCもよくわかってない。
環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
grpc/go - Docker HubDocker
こんな感じで立ち上げた。Dockerよくわからん 。
docker pull grpc/go docker run --name grpc-go -it grpc/go /bin/bashQuick 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/helloworld
にhelloworld.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最後に
ハローワールド的なことできた。よくわからんことだらけなので、ちょっとずつ調べながら学んでこう。
- 投稿日:2020-11-04T07:59:41+09:00
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_ワールド名とすると。
- 通常ワールドにてネザーゲートのような形の構造物を作成(素材はなんでもいいが壊されにくい物で)
- 「/mvp wand」と入力し、木の斧を入手。
- 木の斧を装備してゲートの角にあたるブロックを左クリック
- 対角線上反対側のブロックを右クリック
- 「/mvp create gate_world」でポータルと認識される
- 資源ワールドに移動して1~4を実行
- 「/mvp create gate_asset p:gate_world」で通常ワールドと繋がったポータルと認識される
- 「/mvp select gate_world」と入力
- 「/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ちなみに全ワールド(ディレクトリまるごと)そのまま移行してみたが、
問題なく動いてるようだ。