- 投稿日:2020-10-14T23:52:47+09:00
DockerでWordPressの開発環境をサクッと構築する
TL;DR
https://github.com/qpSHiNqp/docker-wordpress-dev
これcloneして
docker-compose up
すると、一瞬でWordPress環境立ち上がるよ目次
- dockerでWordPress環境を構築するまで
- テーマ作るときに、コンテンツ部分に適用されるスタイルをよしなにいい感じにする(ついでに書いてるだけ)
dockerでWordPress環境を構築するまで
経緯
たまたまちょいとWordPressいじる必要が生じた。開発環境を整えるために今までは、ローカルにMySQLサーバ立てて、DB作って、ユーザーと権限周り作って整えて、PHP環境作って、Webサーバ環境作って、繋いで、動作確認して... っていういわゆるMAMP的なのを頑張ってやってたんですが、今どきそんなこと普通しないだろ、ということでdockerで環境構築すべく、ちょっと調べた。
構築方法
調べたところ、
wordpress
っていうdocker imageもあるし、当然のことながらmysql
もdocker imageあるので、docker-compose.yml
いい感じに作ればいじゃんという話になり、作った。作り方についても、
wordpress
のDocker HubのDescriptionに丁寧に書いてあったので、参考情報として記載しておく。
ページ中頃の、「... via docker stack deploy or docker-compose」というセクションほぼそのまんま。今回はテーマとかプラグインを作りたかったので、
wp-content/themes
とwp-content/plugins
をマウントするようにdocker-compose.yml
を作成。
※最新のものはGitHubを参照してください。version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html - ./wp-content/themes:/var/www/html/wp-content/themes - ./wp-content/plugins:/var/www/html/wp-content/plugins db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db:これで、
docker-compose up
してhttp://localhost:8080
開くともうすぐに WordPressのセットアップ画面が開くので、そのまま進めば管理画面にいける。テーマ作るときに、コンテンツ部分に適用されるスタイルをよしなにいい感じにする(ついでに書いてるだけ)
ここから先、本当についでに書いただけなので、自分の備忘録程度にしか使えないと思います。
自作テーマ作るときに、レイアウトとか、見た目とかをstyle.cssで制御すると思うんだけど、WordPressってWYSIWYGエディタを備えたCMSなので、コンテンツ部分のレイアウトはWordPress備え付けのものを生かしてあげる必要がある。
備え付けのstyleは、CSS « WordPress Codexの「WordPress Generated Classes」セクションに書いてあるもの。これを自作テーマの最下部にコピペしてあげることで、WYSIWYGで編集時に指定したレイアウトを実際の表示に反映することができた。
当初、自作style.cssで定義したスタイルがコンテンツ部分の要素にまで適用されていたことでWYSIWYGと見た目がずれてしまうという問題が発生してしまっていたが、おそらく下記のようにマークアップの責任分界をするとだいたい上手くいくような気がする。
- テンプレ/テーマ側では、コンテンツをwrapするブロック要素のレイアウトだけHTML+CSSで制御してあげて、
<?php the_content(); ?>
とかで埋め込むコンテンツ本体のレイアウトに影響しないようなstyle.css
にしてあげる<h1>
(か、若しくは<h2>
)が投稿タイトルの表示を担当するなら、これはテンプレ側で表示を制御してあげたほうがいい- 文字色とかフォントとか、レイアウト以外の見た目に関するスタイルは style.css で定義して、コンテンツにも適用させるようにつくる(厳密に言うとフォントが違うとレイアウトも違ってくるとも言えるけど)
要は、WordPressのWYSIWYGが吐くHTMLなんて予想不可能なので、コンテンツ本文のブロックレイアウティングを自作cssで制御するのはたぶん無理。むしろテーマ作る側は、コンテンツ本文のブロックレイアウティングを制御せず放任してあげるようなクラス/セレクタ設計が必要な気がします。
カラーパレット機能とかサポートするように作っても良かったが、今回はそんなにWordPressの機能をフルサポートするような汎用的なテーマを作る必要がなかったので、最小限の機能サポートだけで実装した。
- 投稿日:2020-10-14T20:49:15+09:00
【0からDockerに挑戦】④Dockerを使ってnginx・puma・rails6.0・mysqlの開発環境を構築する
背景
未経験から自社開発系企業の就職を目指します。
良質なポートフォリオ作成のためDockerを勉強することにしました。知識レベルとしては、Ruby on railsを使って簡単なアプリケーション開発、gitを使ったバージョン管理、herokuを使ってデプロイできるレベルです。またDockerを学ぶ上で必要とされるlinuxやネットワーク関連の勉強はほぼしていないです。
自分の忘備録かつ、同じくらいのレベルでこれからDockerに挑戦してみようと思っている方に向けて少しでも役に立てればと思います。
最終目標
・Dockerを使って0からRuby on Rails環境(nginx・puma)が構築できるようになること。
以前①〜③でrails6.0とmysqlを使ってDockerの環境を構築したのですが、今後のAWSEC2でデプロイする予定なので、webサーバーとアプリケーション・サーバーを別々にしたほうが良いと考えました。以前までのファイル構成や知識をベースとしています。【前回までの記事】
【0からDockerに挑戦】①Dockerの概要と用語
【0からDockerに挑戦】②DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる (part1)
【0からDockerに挑戦】③DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる (part2)前回までで基本的なDockerの知識を抑えていたので、スムーズにいくかなと思ったら、大量のエラーに出会い死にかけました。(結局1日半費やしました笑)
Dockerを使ってnginx・puma・rails6.0・mysqlの開発環境を構築する
今回の環境と条件
・Docker・Docker-composeを使って環境構築をする。
・railsのバージョンは6
・rubyのバージョンは2.6
・データベースはmysql
・webサーバーにnginxを使用。
・アプリケーション・サーバーはpumaを使用。手順
今回は下記手順で実施したいと思います。
①ローカルPC上に必要なディレクトリ・ファイルをつくる
②ファイルに必要な記述を書く
③docker-composeをビルド・実行させる && rails newをする
④必要なファイルの編集・エラーの修正
⑤データベース作成・サーバー起動途中で遭遇したエラーについても説明します。また今回、自分が作りたい環境と同じ構成だったこともあり下記記事を参照しました。とてもわかりやすかったです。ファイルの中身は違いますが、構成とかは真似させて頂いています。
【参照記事】
@eightyさんの記事です。
[Docker + Rails + Puma + Nginx + MySQL]①ローカルPC上に必要なディレクトリ・ファイルをつくる
今回はデスクトップ上にディレクトリをつくりました。構成は下記になります。
Desktop/
├ webapp/
├ containers
└ nginx
└ Dockerfile
└ nginx.conf
├ enviroment
└ db.env
├ Dockerfile
├ docker-compose.yml
├ Gemfile
├ Gemfile.lock今回はコンテナを3つ作ります。1つがDB用、2つ目がwebサーバー用、3つ目がappサーバー用(rails)です。なのでDockerfileを2つ用意する必要があります(前回はrailsとdbでDockerfileが1つでした)。またpumaはrails標準装備ですが、nginxはrails標準装備ではないので別途設定が必要です。
そして補足ですが、railsで使うアプリケーションサーバはpumaかuniconが使われることが多いです。この2つの違いはマルチプロセスとマルチスレッドという通信処理の仕方です。(※詳しくはPumaの本当の力を引き出すの記事をみてください)。処理速度に関してはpumaのほうが優れていることが多く、rails5以降標準搭載されているpumaを使うのが良いかと思います。
②ファイルに必要な記述を書く
1つ1つファイルの説明をします。ただGemfileの記述は前回同様なので省きます。Gemfile.lockも空でよいので説明省きます。
Dockerfile(ruby用)
DockerfileFROM ruby:2.6.6 RUN apt-get update && apt-get install -y lsb-release \ build-essential \ libpq-dev \ nodejs &&\ curl -o- -L https://yarnpkg.com/install.sh | bash \ && apt remove -y libmariadb-dev-compat libmariadb-dev RUN wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-common_8.0.18-1debian10_amd64.deb \ https://dev.mysql.com/get/Downloads/MySQL-8.0/libmysqlclient21_8.0.18-1debian10_amd64.deb \ https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client-core_8.0.18-1debian10_amd64.deb \ https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client_8.0.18-1debian10_amd64.deb \ https://dev.mysql.com/get/Downloads/MySQL-8.0/libmysqlclient-dev_8.0.18-1debian10_amd64.deb RUN dpkg -i mysql-common_8.0.18-1debian10_amd64.deb \ libmysqlclient21_8.0.18-1debian10_amd64.deb \ mysql-community-client-core_8.0.18-1debian10_amd64.deb \ mysql-community-client_8.0.18-1debian10_amd64.deb \ libmysqlclient-dev_8.0.18-1debian10_amd64.deb RUN mkdir /webapp WORKDIR /webapp ADD Gemfile /webapp/Gemfile ADD Gemfile.lock /webapp/Gemfile.lock RUN bundle install RUN mkdir -p tmp/sockets特に前回と比べて変更があった2点を説明します。
1つ目は「apt-get install -y lsb-release \・・・」「apt remove -y libmariadb-dev-compat libmariadb-dev」「RUN wget」「RUN dpkg」のところは、mysqlのエラー対策です。ここで結構苦戦したのですが、mysqlはバージョンによって認証に使われるプラグインが異なるそうです。そのバージョンによる認証エラーを回避するために上記の記述が必要です。(※参考:LinuxベースのDockerからMySQL 8.0に接続するための記述)
もちろんdocker-compose.ymlでmysqlのバージョン変更したり、その他設定で変更できるかもしれませんが、自分の場合うまくいかず、この方法で解決しました。こちらもし他に良い設定があったら変更するかもしれないです。2つ目は、最後の「RUN mkdir -p tmp/sockets」の箇所です。これはソケット通信に必要なファイルです。ソケット通信とは複数のプロセスをネットワークでつなぐときに使う通信です。今回はnginxとpumaをつなぐためにソケット通信を使います。
Dockerfile(nginx用)・nginx.conf
container/nginx/DockerfileFROM nginx RUN rm -f /etc/nginx/conf.d/* ADD nginx.conf /etc/nginx/conf.d/webapp.conf CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.confcontainer/nginx/nginx.confupstream webapp { server unix:///webapp/tmp/sockets/puma.sock; } server { listen 80; server_name example.com localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; root /webapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @webapp; keepalive_timeout 5; location @webapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://webapp; } }上記2つは、@eightyさんの[Docker + Rails + Puma + Nginx + MySQL]の記事をコピペさせていただきました。。。。
ただ内容は、自分のために解説したいです。1つ目はnginxのDockerfileです。FROMでnginxのイメージを呼びます。nginxのイメージで自動的にnginxの設定ファイルができるのですが、今回は自分でファイルを作り、それを反映させたいので、RUN以下で一回ファイルを消し、ADDで自分の作ったファイルをコンテナ内に反映させます。CMDでビルドが完了したらnginxを起動するように指示しています。
2つ目がeginxの設定ファイルです。upstream以下でnginxからpumaにソケット通信を送ることを指定しています。server以下でポート、IPを指定(今回はlocalhost)、ログをどこに残すか、ドキュメントルート(公開するHTMLや画像の設置場所)の指定、エラーページの際の対応が記してあります。「location @webapp」でリバースプロキシの設定をしています。リバースプロキシとは、webサーバーとインターネットの中間に立ち、webサーバーのアクセスをコントロールするものです
docker-compose.yml
version: '3' services: app: build: context: . env_file: - ./environments/db.env command: bundle exec puma -C config/puma.rb volumes: - .:/webapp - public-data:/webapp/public - tmp-data:/webapp/tmp - log-data:/webapp/log depends_on: - db db: image: mysql:8.0 env_file: - ./environments/db.env volumes: - db-data:/var/lib/mysql web: build: context: containers/nginx volumes: - public-data:/webapp/public - tmp-data:/webapp/tmp ports: - 80:80 depends_on: - app volumes: public-data: tmp-data: log-data: db-data:こちらも前回との変更点を説明します。serviceが3つに分岐しました(前回は2つ)。dbとweb(webサーバー用)とapp(アプリケーション用)の3つです。dbに関しては前回と変更ほぼないので説明省略します。appとwebに関しては前回1つにまとめていたのを、今回2つに分けた感じです。以下説明です。
・appとweb: env_fileでuserとpasswordが書いてあるファイルの場所を指定しています。webサーバーと同じ環境変数を使うので、ファイルを別途作りそこを指定しました。
・web: buildするのはeginx用のDockerfileなので指定の仕方注意です。
・web: depend_onもwebサーバーはアプリケーションサーバと関係を構築するので、指定の仕方注意です。
・app: commandでpumaを実行させています
volumes関連に関しては「ホストファイル:コンテナファイル」という順序で関連付けられています。
③docker-composeを実行 && rails newをする
ファイルがそろったら「docker-compose」と「rails new」をしましょう。
コマンド指定で一気にやってもいいですし、コンテナを起動して中に入り込んでからrails newをしても大丈夫です。
ただ1点注意が必要です。コンテナの指定はwebではなく、appです。(※railsがあるのがアプリケーションサーバなので当たり前といえば当たり前なのですが、rails+dbだけのコンテナ構築に慣れていると、webコンテナに入ってしまう恐れがあります。私だけかもですが、、、)。ターミナル$ docker-compose up -d $ docker-compose exec app bash root@35356af5# rails new④必要なファイルの編集
database.ymlとpuma.rbの編集、そしてmysqlの設定をしておきましょう。
database.yml・ ・ (省略) default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USER') { 'root' } %> password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> host: db development: <<: *default database: webapp_development test: <<: *default database: webapp_test ・ここは前回とほぼ同じなので問題ないと思います。
puma.rbhreads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i threads threads_count, threads_count environment ENV.fetch("RAILS_ENV") { "development" } plugin :tmp_restart app_root = File.expand_path("../..", __FILE__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", trueここは基本どのサイトみてもコピペで問題ないとのことです。
ただ1点注意が必要です。上記の記述では削除していますが、「por ENV.fetch("PORT") { 3000 }」と記載してあることが多いのです。間違っていないのですが、rails sした際にalready existエラーが出る場合はここの記述消しましょう。rails sのデフォルトが3000ポートで、ここで指定したpuma起動のポートと同じになります。そのためrails sするとすでに起動しているpumaが邪魔をして、エラーがでる恐れがあります。※自分はここで悩みました。他の設定が悪いのか、rails sの起動の仕方が悪いなど、もしかすると他の原因も考えられます。今回は上記の記述削除で対応できました。またrails sの起動時に別ポートで指定するやり方でも対応できました。
ターミナルdocker-compose exec db mysql -u root -p -e"cat grant_user.sql"
db/grant_user.sqlGRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%'; FLUSH PRIVILEGES;上記をターミナルで入力し、mysqlに権限を付与しましょう。意味はgrant_user.sqlに設定したファイルを開き、そのファイルに書かれている内容をroot権限(コンテナ内はデフォルトでルート権限)で許可するといった意味です。入力するとパスワードを求められますがmysqlのrootuserのパスワードを入力すると認証されます。(※ここもコピペです。)
⑤データベース作成・サーバー起動
ここまでくればあとは「rails db:create」「rails s」をコンテナで実行すれば終了です。
※railsのサーバーを起動すると、「puma.sockets already exist」といったエラーが出る可能性がありますが、その場合はtmp/sockets/にあるpuma.socketを削除すれば問題ないです。感想・まとめ
ここまで淡々と書いてきましたが、やっているときはたくさんのエラーに出会いました。エラーについて調べてるうちにネットワークやサーバーの知識も増えていき結果的に良かったです。そして最終的にみるとほとんどコピペですね笑。ただ大まかな流れと書いてあるコードの8割は理解できたので少し、進歩したかなと思います。
最初は自分の力だけでなんとかしようとしていましたが、未経験で知識のない自分がゼロからやるっていうのも少し無駄なことの気がしたので、初挑戦のことはコピペでもいいのでまず動かしてみるというところを意識したいです。
参考になった教材
「米国AI開発者がゼロから教えるDocker講座」
https://www.udemy.com/course/aidocker/
→初心者がDockerを学ぶならこれ!!!めちゃくちゃわかりやすい!!!linuxの基礎からDockerでの環境構築を網羅しています。今回の環境構築もこの教材をベースにしています(もちろんrailsのバージョンとかdbなど自分なりに変えているので同じではないです)もしDocker全然わかないという人はこの講座をぜひ買ってみてください。「いまさらだけどDockerに入門したので分かりやすくまとめてみた」
https://qiita.com/gold-kou/items/44860fbda1a34a001fc1
→すごく細かく網羅しています。リファラル的によくみさせていただいてます。「Docker/Kubernetes 実践コンテナ開発入門 --著 山田 明憲」
→実践的な書籍、あまりにも初学者だと少しむずかしいかも。→ 基礎覚え得たあとに見返したら非常に良かったです!「たった1日で基本が身に付く! Docker/Kubernetes超入門 --著」
→初学者が書籍で学びたい場合はこれがとっかかりやすい。
- 投稿日:2020-10-14T18:50:31+09:00
【入門】Vagrant+VirtualBoxをWindow10で構築する
初めてWindow10でVagrantの環境構築を行いました。
色々な入門記事を参考にCentOS7をVagrantとVirtualBoxを使って、構築します。初めての経験だったので、予期しないエラーが多く発生して大変でした…。
後学の方が簡単にできるようになると幸いです。
環境
Window10
Vagrant2.2.10
VirtualBox5.2.44Vagrant の練習ファイル作成手順
Hyper-V を無効にする
Docker を使ったことがある Window10 のユーザーは、まず Hyper-V をオフにします。
絶対にOFFにしてください!!!!!
bcdedit /set hypervisorlaunchtype off この操作を正しく終了しました。VirtualBox インストール
最新版をインストールしょう。インストーラはこちらから入手し、実行します。
vagrant インストール
最新バージョン(64bi)をインストール。インストーラはこちらから入手し、実行します。
インストール後、OS の再起動が必要です。再起動後、コマンドプロンプトを起動し、バージョンを確認します。
vagrant -v Vagrant 2.2.7コマンドプロンプトで plugin をインストールしておきます。
必要に応じて Chef をインストールしてくれるオムニバスプラグインと、ホスト・ゲスト間の共有フォルダ構成のため VirtualboxGuestAddition ツールを導入します。(ないとエラーが出る)
複製用に vagrant-hostmanager もインストールします。vagrant plugin install vagrant-omnibus vagrant plugin install vagrant-vbguest vagrant plugin install vagrant-hostmanagerアンインストールしたいときは、
vagrant plugin uninstall vagrant-omnibus vagrant plugin uninstall vagrant-vbguest vagrant plugin uninstall vagrant-hostmanagerインストールされている pluigin の表示
vagrant plugin list
CentOS7 box の追加
vagrant は box と呼ばれるイメージファイルと構成ファイルを使って管理します。CentOS 7.7 の box を vagrantcloud.comからダウンロードし、virtualbox 用として追加します。
これはコマンドプロンプトでいけます。
不安なぐらい処理時間が長いので早くも休憩です。
> vagrant box add bento/centos-7.7 --provider virtualbox ==> box: Loading metadata for box 'bento/centos-7.7' box: URL: https://vagrantcloud.com/bento/centos-7.7 ==> box: Adding box 'bento/centos-7.7' (v202002.04.0) for provider: virtualbox box: Downloading: https://vagrantcloud.com/bento/boxes/centos-7.7/versions/202002.04.0/providers/virtualbox.box box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com box: Progress: 100% (Rate: 457k/s, Estimated time remaining: --:--:--) ==> box: Successfully added box 'bento/centos-7.7' (v202002.04.0) for 'virtualbox'!vagrant 管理用フォルダの作成と初期化
vagrant を管理したい場所のファイルを作成して、プロジェクトの初期化を行う
vagrant init bento/centos-7.7
10MB 程度の Vagrantfile が作成される。
仮想マシンが起動するとログファイルや管理情報が保存される。仮想マシンを起動
vagrant up コマンドで仮想マシンを起動します。
vagrant up
仮想マシンに接続
vagrant ssh
これで、練習のファイルに接続することが出来ます!!
再度 Docker を使いたいとき
設定を Auto に戻す
bcdedit /set hypervisorlaunchtype auto
作成日 2020/10/14
参考文献
- 投稿日:2020-10-14T18:50:31+09:00
【入門】Vagrant+VirtualBoxの仮想環境をWindow10上に構築する【環境構築】
初めてWindow10でVagrantの環境構築を行いました。
色々な入門記事を参考にCentOS7をVagrantとVirtualBoxを使って、構築します。初めての経験だったので、予期しないエラーが多く発生して大変でした…。
後学の方が簡単に環境構築できるように、役に立つと幸いです。
環境
Window10
Vagrant2.2.10
VirtualBox5.2.44Vagrant の練習ファイル作成手順
Hyper-V を無効にする
Docker を使ったことがある Window10 のユーザーは、まず Hyper-V をオフにします。
絶対にOFFにしてください!!!!!
bcdedit /set hypervisorlaunchtype off この操作を正しく終了しました。VirtualBox インストール
僕は、5系の最新版をインストールしました。インストーラはこちらから入手し、実行します。
vagrant インストール
執筆時点の最新バージョン2.2.10をダウンロードしました。基本は最新バージョン(64bit)をインストールしましょう。インストーラはこちらから入手し、実行します。
インストール後、OS の再起動が必要です。再起動後、コマンドプロンプトを起動し、バージョンを確認します。
vagrant -v Vagrant 2.2.7コマンドプロンプトで plugin をインストールしておきます。
必要に応じて Chef をインストールしてくれるオムニバスプラグインと、ホスト・ゲスト間の共有フォルダ構成のため VirtualboxGuestAddition ツールを導入します。(ないとエラーが出る)
複製用に vagrant-hostmanager もインストールします。vagrant plugin install vagrant-omnibus vagrant plugin install vagrant-vbguest vagrant plugin install vagrant-hostmanagerアンインストールしたいときは、
vagrant plugin uninstall vagrant-omnibus vagrant plugin uninstall vagrant-vbguest vagrant plugin uninstall vagrant-hostmanagerインストールされている pluigin の表示
vagrant plugin listCentOS7 box の追加
vagrant は box と呼ばれるイメージファイルと構成ファイルを使って管理します。CentOS 7.7 の box を vagrantcloud.comからダウンロードし、virtualbox 用として追加します。
これはコマンドプロンプトでいけます。
不安なぐらい処理時間が長いので早くも休憩です。
> vagrant box add bento/centos-7.7 --provider virtualbox ==> box: Loading metadata for box 'bento/centos-7.7' box: URL: https://vagrantcloud.com/bento/centos-7.7 ==> box: Adding box 'bento/centos-7.7' (v202002.04.0) for provider: virtualbox box: Downloading: https://vagrantcloud.com/bento/boxes/centos-7.7/versions/202002.04.0/providers/virtualbox.box box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com box: Progress: 100% (Rate: 457k/s, Estimated time remaining: --:--:--) ==> box: Successfully added box 'bento/centos-7.7' (v202002.04.0) for 'virtualbox'!vagrant 管理用フォルダの作成と初期化
vagrant を管理したい場所のファイルを作成して、プロジェクトの初期化を行います。
vagrant init bento/centos-7.710MB 程度の Vagrantfile が作成される。
仮想マシンが起動するとログファイルや管理情報が保存される。仮想マシンを起動
vagrant up コマンドで仮想マシンを起動します。
vagrant up仮想マシンに接続
vagrant sshこれで、練習用に作成した仮想マシンに接続することが出来ます!!
再度 Docker を使いたいとき
設定を Auto に戻す
bcdedit /set hypervisorlaunchtype auto作成日 2020/10/14
参考文献
- 投稿日:2020-10-14T18:36:34+09:00
Dockerを使ってpytorchでcuda11.0を使用する
2020年10月14日現在では、pytorch公式にはcuda11.0向けのインストール方法が掲載されていません。
そこで、Dockerを使用したcuda11.0向けのpytorchの環境構築の手順を説明します。前提条件
前提としてDockerとnvidiaドライバーがインストールされているものとします。
これらのインストールは他の記事などを参照してください。$ nvidia-smi上記のコマンドで、cudaのバージョンが11.0になっていることも合わせて確認してください。
Pytorchのコンテナをダウンロードする
nvidiaのサイトにアクセスしてユーザー情報を登録後、Pytorchの画面を開いてください。
$ sudo docker pull nvcr.io/nvidia/pytorch:20.09-py3pull commandに上記のコマンドがあるのでこれをコピーしてターミナルで実行します。
$ sudo docker imagesこのコマンドでインストールできたかを確認してください。
nvcr.io/nvidia/pytorch 20.09-py3
というimageがあれば成功です。Pytorchがcudaを使えるか確認する
先ほどのimageを一覧表示するコマンドを実行して、pytorchのIMAGE IDを確認してコピーして下記コマンドを実行します。
$ sudo docker run -it --gpus all [IMAGE ID] bashその後、bashで
$ python >> import torch >> print(torch.cuda.is_available())これでtrueが返ってきたら成功です。
bashはcontrol + dで抜けれます。(Linux)コンテナを作成してファイルをマウントする
一度、bashから抜けてください。
$ sudo docker ps -a上記のコマンドで先ほどbashを実行した際に作成されたcontainerが確認できます。これのCONTAINER IDを使用します。
$ sudo docker inspect [CONTAINER ID]control + fでWorkingDirを探します。
さらに、自分が作業を行いたいPC上のフォルダのパスをコマンドで確認します。$ pwdその後、先ほどのnvidiaのサイトにoverviewで説明されているようにコンテナを作成します。
$ sudo docker run --gpus all -it --rm -v [作業を行いたいフォルダのパス]:[workingDir] nvcr.io/nvidia/pytorch:20.09-py3私のケースだと
$ sudo docker run --gpus all -it --rm -v /home/myname/Desktop/hoge:/workspace nvcr.io/nvidia/pytorch:20.09-py3その後、containerが立ち上がることが確認できるはずです。
最後に
タイポなどがある可能性があるので気をつけてください。
公式がインストール方法を掲載してくれるまでの繋ぎになれば幸いです。
- 投稿日:2020-10-14T11:01:28+09:00
docke チュートリアル(メモ)
docker hub からdocker imageをpullしてきましょう
取得コマンド
docker image pull削除
docker image rm
*hello文などの場合削除はできないのでその時は強制削除コマンド -f で実行してくだい生成・移動
docker container run生成のみ
docker container create起動のみ
docker container start
停止
docker container stop削除
docker container rmここで第一につまずくポイントはimageが削除できなかったりcontainerが削除できなかった場合は
-fで強制的に削除を行っていくかimage container のOSなどのバージョン(名前:xx.x)
などの入力漏れがないのか確認を行ってください。コンテナとしてOSを起動する(←めんどくさいんで今後主流になってくんじゃね?)
docker run -it os名(タグ)docker 基本コマンド集
コマンド 説明 docker run コンテナを起動・作成 docker start 存在するコンテナを起動 docker stop コンテナを停止 docker kill コンテナを強制終了 docker ps コンテナを一覧表示 docker rm コンテナを削除 docker attach コンテナの標準入出力に接続 docker exec 起動中のコンテナでコマンドを実行 docker pull docker hub からイメージをダウンロード docker push docker hub にアップロード docker image イメージを一覧表示
- 投稿日:2020-10-14T10:24:59+09:00
Docker 操作メモ
使用環境
VirtulBox : 6.1
ホスト OS :Ubuntu 18.04
Docer : docker-ce 19.03.13
※ docker のホスト OS は VirtualBox 上で動かしている仮想環境イメージの実行
CentOS を特権を付けて起動する場合。
$ sudo docker run -itd --privileged --name PROCESS_NAME IMAGE_NAME /sbin/init $ sudo docker run -itd --privileged -p 8080:80 --name PROCESS_NAME IMAGE_NAME /sbin/init ↑ポートを指定する場合はこんな感じ※docker グループに実行するユーザを入れていれば sudo は必要ない。
コンテナのステータス確認
ストリームさせる
$ sudo docker stats centos8ストリームさせない
$ sudo docker stats centos8 --no-stream起動した後でメモリリミットを設定する
いろいろ躓いたが以下を実行することで成功。
$ sudo docker update -m 1G --memory-swap -1 CONTAINER_ID以下躓いたことなど
初めは以下のコマンドを実行したがエラーとなってしまった。
$ sudo docker update -m 1G CONTAINER_ID Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.grub の swap 設定を変更することで解決。
$ sudo vi /etc/default/grub $ sudo update-grub grub.cfg をアップデートしてホスト OS を再起動。再起動後に再度実行したところ以下のエラーとなった。
$ docker update -m 1G 917f3986a06b Error response from daemon: Cannot update container 917f3986a06bb9f99b095af4f3e5334ce125f596f9926db2733bdb4d20868b47: Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same timeそこで、「--memory-swap -1」オプションを設定し実行したところ成功。
以下のようにメモリに負荷をかけたところ 1G の制限が掛かっていることが確認できる。
$ docker exec -it centos8 /bin/bash # /dev/null < `yes`$ docker stats centos8 --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 917f3986a06b centos8 106.50% 1GiB / 1GiB 100.00% 15.4kB / 10.4kB 52.3MB / 4.1kB 229
- 投稿日:2020-10-14T08:22:58+09:00
Docker, java, vscodeの開発環境を構築
前回の記事
初心者がdocker for macをインストールしてphp7.0の動作環境を用意する
この記事
前回はphp7.0の動作環境を用意しました。
今回はjavaを用意してみます。
目標はdocker + java + vscode。参考記事
Visual Studio CodeのRemote DevelopmentとDockerで快適な開発環境をゲット
Remote Development
Remote Developmentの拡張機能をインストール
Microsoftが公開してるテストプロジェクトのクローンを用意
gitgit clone https://github.com/Microsoft/vscode-remote-try-javaテストプロジェクトを開く
Visual Studio Codeの左下の緑のボタンをクリック>Remote-Containers: Open Folder in Container>gitのクローンフォルダを選択
dockerでコンテナが起動しているか確認
ビルドしてプロジェクトが動作するか確認
まとめ
前回の記事の方法よりRemote Developmentを使用するのが簡単ですね。
javaのバージョンも選択できるみたい。
ありがとう、Microsoft!!
- 投稿日:2020-10-14T01:00:06+09:00
*小技* Dockerコンテナに簡単に入っちゃう?
以下はLaravelプロジェクトをDockerを使って
nginx
,Laravel
,mysql
の3つコンテナで立ち上げたときの様子。92d7dbcf85dd sample_web "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 0.0.0.0:8000->80/tcp nginx 389ce68b90fb sample_laravel "docker-php-entrypoi…" 6 seconds ago Up 4 seconds 9000/tcp laravel 4c920ce5990f mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysqlここから
sample_laravel
に入りたいときどう言うコマンドを叩きますか?(1) $ docker exec -it laravel shとか
(2) $ docker exec -it 389ce68b90fb shを叩いている人も割と多いと思います。
(1)ではコンテナ名が
laravel
みたいな短い場合はまだ良いですがコンテナ構成が複雑になるとそれに従ってコンテナ名も複雑になってしまう。(2)では長い上に法則性もなくもはやタイポしろと言っているようなものですね(笑)
コピペするにしてもキーボードから手を離すのが煩わしい?
そんな皆さまは以下のコマンドでコンテナに入っちゃいましょう!
(3) $ docker exec -it 3 shたったこれだけです!遥かに楽!
これはが何をしているかと言うと(2) $ docker exec -it 3(89ce68b90fb) shの
(89ce68b90fb)
を省略。つまり、コンテナIDを指定して
docker exec
を行う際にはコンテナを識別できれば
全桁入力する必要がないのです。
まあ上記は極端な例ですが(笑)今回は3から始まるコンテナIDが割り振られたコンテナが他にないため
(3)でも問題ありませんでしたが実際はもっと多くのコンテナが立ち上がるかもしれないので
上位3桁くらいを入力したほうがスムーズに入れるのではないでしょうか!以上知ってたら便利なDockerコンテナに入る小技でした!?
- 投稿日:2020-10-14T00:55:22+09:00
Goで簡単Webアプリ
Goの目覚め
低レイヤーの知識を身につけて、さいつよ自給自足エンジニアになるぞ!
...と意気込みC言語を学んでみたものの面白さが見出せなかった自身へ送る。ペルソナ
Webアプリを作りたいなら、現状NodeやRailsで十分と思ってる。
デスクトップアプリなら、Electronで。
ターミナルアプリとか、OSの機能を使うぜ系でGoとか使ってみたいなぁと思ってる方 (最近流行りのDockerやGitHub CLIもGo製だし、使えれば遊べそう)。本記事の目的
Goを学ぼうかどうか判断するために、簡単なWebアプリを作ってみます (アクセスしたら、Hello Worldと表示するだけ)。
開発環境
Goを信用して良いのか分からなかったので、環境を汚さないために、Dockerでやります。
面白かったら、デバッカーとかで内部まで見たいので、ローカルで環境構築します。ディレクトリ構成は以下のようにしました。
compileFileディレクトリ内にgoファイルを置いて、ビルドしていきます。compileFile (ディレクトリ) Dockerfile docker-compose.yml# Dockerfile FROM golang:latest RUN mkdir -p /go/srcdocker-compose.ymlversion: '3' services: go: build: . ports: - "8080:8080" volumes: - ./compileFile:/go/src working_dir: /go/srcコンテナ内に入って、goのコマンドを確かめてみます。
--service-portsを指定しないと、8080ポート同士を繋げることはできないので、注意です。
docker ps
でちゃんとポートフォワードできていることを確認しておきます。$ docker-compose run --service-ports go /bin/bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af4f9c066ecd golean_go "/bin/bash" 7 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp golean_go_run_a79a836040abひとまず、
go
と打ってみて、使えるコマンドを確認します。Go is a tool for managing Go source code. Usage: go <command> [arguments] The commands are: bug start a bug report build compile packages and dependencies clean remove object files and cached files doc show documentation for package or symbol env print Go environment information fix update packages to use new APIs fmt gofmt (reformat) package sources generate generate Go files by processing source get add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packages Use "go help <command>" for more information about a command. Additional help topics: buildconstraint build constraints buildmode build modes c calling between Go and C cache build and test caching environment environment variables filetype file types go.mod the go.mod file gopath GOPATH environment variable gopath-get legacy GOPATH go get goproxy module proxy protocol importpath import path syntax modules modules, module versions, and more module-get module-aware go get module-auth module authentication using go.sum module-private module configuration for non-public modules packages package lists and patterns testflag testing flags testfunc testing functions Use "go help <topic>" for more information about that topic.
go build
go run
go fmt
は近いうちに使いそうです。プロジェクト作成
馴染みが深いWebアプリからGoを理解していこうと思いました。
サンプルコードとか見ながら、Hello Worldをブラウザ上に表示するプログラムを書きます。server/main.gopackage main import "io" import "net/http" func mainHandler(w http.ResponseWriter, req *http.Request) { io.WriteString(w, `Hello World!!!`) } func main(){ http.HandleFunc("/main", mainHandler) http.ListenAndServe(":8080", nil) }1コマンドで整形できるので、整形後ビルドします!
ちなみに、ビルド時にリンターも働いているのか、改行の位置や使ってないパッケージがあると怒られます。ビルドすると、goファイルのあるディレクトリ名の実行ファイルが作られました。
$ go fmt $ go build$ ls server main.go $ ./serverhttp://localhost:8080/main にアクセスすると、Hello Worldを確認できました!
ちなみに、Macで動かしたい場合は、以下でMac用にコンパイルできます。
$ GOOS=darwin GOARCH=amd64 go buildnet/httpパッケージ
わかりやすいところから見ていきます。
これでサーバーを立てられるようです。
第一引数がポートの指定、第二引数でHandlerを選択できるようで、nilの場合デフォルトのDefaultServeMuxが使われるようです。http.ListenAndServe(":8080", nil)DefaultServeMuxって何?
ドキュメントを読み進めると、以下の記述にあたります。
HandleFunc registers the handler function for the given pattern in the DefaultServeMux. The documentation for ServeMux explains how patterns are matched.HandleFuncでURLのパターンに対応するハンドラーをDefaultServerMuxに登録できる...みたいなことが書いてあります。ルーティング的な何かと思っておきましょうか。
なので、以下は/mainにアクセスしたら、mainHandlerの処理を実行と読めます。
http.HandleFunc("/main", mainHandler)ioパッケージの方は何してるか分かるので、置いておきます。
総括
GoをWeb開発で使いたい!という気持ちにはなりませんが、少なくともCよりは楽しいと感じました!
ターミナルアプリとか何か作りたいですね。
当面はGoの使い方を学ぶために、フレームワークとか使って、簡単なWebアプリから作ってみようかなと思いました。
- 投稿日:2020-10-14T00:55:22+09:00
Goのnet/httpパッケージでHello WorldするだけのWebアプリ
Goの目覚め
低レイヤーの知識を身につけて、さいつよ自給自足エンジニアになるぞ!
...と意気込みC言語を学んでみたものの面白さが見出せなかった自身へ送る。ペルソナ
Webアプリを作りたいなら、現状NodeやRailsで十分と思ってる。
デスクトップアプリなら、Electronで。
ターミナルアプリとか、OSの機能を使うぜ系でGoとか使ってみたいなぁと思ってる方 (最近流行りのDockerやGitHub CLIもGo製だし、使えれば遊べそう)。本記事の目的
Goを学ぼうかどうか判断するために、簡単なWebアプリを作ってみます (アクセスしたら、Hello Worldと表示するだけ)。
開発環境
Goを信用して良いのか分からなかったので、環境を汚さないために、Dockerでやります。
面白かったら、デバッカーとかで内部まで見たいので、ローカルで環境構築します。ディレクトリ構成は以下のようにしました。
compileFileディレクトリ内にgoファイルを置いて、ビルドしていきます。compileFile (ディレクトリ) Dockerfile docker-compose.yml# Dockerfile FROM golang:latest RUN mkdir -p /go/srcdocker-compose.ymlversion: '3' services: go: build: . ports: - "8080:8080" volumes: - ./compileFile:/go/src working_dir: /go/srcコンテナ内に入って、goのコマンドを確かめてみます。
--service-portsを指定しないと、8080ポート同士を繋げることはできないので、注意です。
docker ps
でちゃんとポートフォワードできていることを確認しておきます。$ docker-compose run --service-ports go /bin/bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af4f9c066ecd golean_go "/bin/bash" 7 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp golean_go_run_a79a836040abひとまず、
go
と打ってみて、使えるコマンドを確認します。Go is a tool for managing Go source code. Usage: go <command> [arguments] The commands are: bug start a bug report build compile packages and dependencies clean remove object files and cached files doc show documentation for package or symbol env print Go environment information fix update packages to use new APIs fmt gofmt (reformat) package sources generate generate Go files by processing source get add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packages Use "go help <command>" for more information about a command. Additional help topics: buildconstraint build constraints buildmode build modes c calling between Go and C cache build and test caching environment environment variables filetype file types go.mod the go.mod file gopath GOPATH environment variable gopath-get legacy GOPATH go get goproxy module proxy protocol importpath import path syntax modules modules, module versions, and more module-get module-aware go get module-auth module authentication using go.sum module-private module configuration for non-public modules packages package lists and patterns testflag testing flags testfunc testing functions Use "go help <topic>" for more information about that topic.
go build
go run
go fmt
は近いうちに使いそうです。プロジェクト作成
馴染みが深いWebアプリからGoを理解していこうと思いました。
サンプルコードとか見ながら、Hello Worldをブラウザ上に表示するプログラムを書きます。server/main.gopackage main import "io" import "net/http" func mainHandler(w http.ResponseWriter, req *http.Request) { io.WriteString(w, `Hello World!!!`) } func main(){ http.HandleFunc("/main", mainHandler) http.ListenAndServe(":8080", nil) }1コマンドで整形できるので、整形後ビルドします!
ちなみに、ビルド時にリンターも働いているのか、改行の位置や使ってないパッケージがあると怒られます。ビルドすると、goファイルのあるディレクトリ名の実行ファイルが作られました。
$ go fmt $ go build$ ls server main.go $ ./serverhttp://localhost:8080/main にアクセスすると、Hello Worldを確認できました!
ちなみに、Macで動かしたい場合は、以下でMac用にコンパイルできます。
$ GOOS=darwin GOARCH=amd64 go buildnet/httpパッケージ
わかりやすいところから見ていきます。
これでサーバーを立てられるようです。
第一引数がポートの指定、第二引数でHandlerを選択できるようで、nilの場合デフォルトのDefaultServeMuxが使われるようです。http.ListenAndServe(":8080", nil)DefaultServeMuxって何?
ドキュメントを読み進めると、以下の記述にあたります。
HandleFunc registers the handler function for the given pattern in the DefaultServeMux. The documentation for ServeMux explains how patterns are matched.HandleFuncでURLのパターンに対応するハンドラーをDefaultServerMuxに登録できる...みたいなことが書いてあります。ルーティング的な何かと思っておきましょうか。
なので、以下は/mainにアクセスしたら、mainHandlerの処理を実行と読めます。
http.HandleFunc("/main", mainHandler)ioパッケージの方は何してるか分かるので、置いておきます。
総括
GoをWeb開発で使いたい!という気持ちにはなりませんが、少なくともCよりは楽しいと感じました!
ターミナルアプリとか何か作りたいですね。
当面はGoの使い方を学ぶために、フレームワークとか使って、簡単なWebアプリから作ってみようかなと思いました。
- 投稿日:2020-10-14T00:54:37+09:00
Unity開発環境をdocker上に構築する
概要
- ホスト側のGUIでdocker上のUnityEditorを起動する方法を紹介します
- UbuntuのUnity導入手順が面倒だったのでdockerfileにまとめました
- ほとんど前回の投稿と同じ内容です
- 簡単に使える dockerfile がなかったので作って公開しました → chikuta-dockerfiles
検証環境
今回検証した環境は以下になります。
Hardware
cpu - AMD Ryzen 9 3900X
gpu - Geforce RTX 2060 super
ram - 32GSoftware
os - ubuntu 20.04.1
kernel - Linux define 5.4.0-48-generic
docker - 19.03.13
nvidia-driver - 450.66
cuda version - 11.0
nvidia-smi
の出力を添付しておきます。$ nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.66 Driver Version: 450.66 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 GeForce RTX 206... Off | 00000000:0E:00.0 On | N/A | | 38% 40C P8 11W / 175W | 916MiB / 7979MiB | 1% Default | | | | N/A | +-------------------------------+----------------------+----------------------+環境整備
最初にnvidia-container-runtimeをインストールします。
# apt 関連設定 $ curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add - $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) $ curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list # nvidia-container-runtimeインストール $ sudo apt update $ sudo apt install nvidia-container-runtime # docker service の再起動 $ sudo systemctl restart docker.service次に docker group に自身の UID を登録します。docker を使っている人はやっていると思いますが念の為。
$ sudo usermod -a -G docker `id -un` $ sudo systemctl restart docker.service実行方法
次にdockerイメージのビルドを行います。
$ git clone https://github.com/chikuta/chikuta-dockerfiles.git $ cd chikuta-dockerfiles $ ./docker/ros-bionic-melodic-unity/build-docker-image.bash次に以下のコマンドを実行することでビルドしたイメージのコンテナを起動できます。スクリプトの中身はxhost周りの処理とdockerの引数をラッピングしたものです。必要に応じて編集をすれば自分の環境を作れるで積極的にカスタマイズしましょう。
$ cd chikuta-dockerfiles $ ./docker/ros-bionic-melodic-unity/run-docker-container.bashスクリプトを実行すると青色のterminatorが立ち上がります。これは dockerコンテナ上で動いているターミナルアプリケーションになるため、ここで実行したコマンドは全てdockerコンテナ上で処理されます。
次にUnityHubを立ち上げてみます。cd /opt/unity ./UnityHub.AppImage
必要な環境をインストールした後にUnityEditorを立ち上げてみましょう。
画像は適当なFree Island Collection
をAsset Storeから取得して表示したものになります。次はROS連携あたりを書いていきます。
参考
- https://waldeinsamkeit.hatenablog.jp/entry/2019/08/17/002854
- https://nvidia.github.io/nvidia-container-runtime/
- https://medium.com/@benjamin.botto/opengl-and-cuda-applications-in-docker-af0eece000f1
- https://qiita.com/chikuta/items/a62cd1d8d945f9b826b1
- https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/