<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kazuhiro Miyajima</title>
    <description>The latest articles on DEV Community by Kazuhiro Miyajima (@miyajima).</description>
    <link>https://dev.to/miyajima</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F115207%2F06ef6544-3d02-4ccc-b294-8e14b200af19.jpeg</url>
      <title>DEV Community: Kazuhiro Miyajima</title>
      <link>https://dev.to/miyajima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miyajima"/>
    <language>en</language>
    <item>
      <title>GCE + VSCode + docker-composeでリモート開発環境を構築する</title>
      <dc:creator>Kazuhiro Miyajima</dc:creator>
      <pubDate>Mon, 09 Sep 2019 09:24:29 +0000</pubDate>
      <link>https://dev.to/seattleconsulting/gce-docker-compose-3em</link>
      <guid>https://dev.to/seattleconsulting/gce-docker-compose-3em</guid>
      <description>&lt;p&gt;これを書いているのは2019年の9月ですが、今年はあまり暑くなくて過ごしやすい夏でしたね。&lt;br&gt;
とはいえ残暑の方が厳しい可能性もあるので、できればローカルのMacでDockerを立ち上げることで余計な熱源は減らしたいですよね。&lt;br&gt;
そこでGCE(Goodle Compute Engine)にインスタンスを立てて、VSCodeで繋いで、ローカルMacでの開発と遜色ない環境を構築する方法を紹介します。&lt;br&gt;
（Windowsも基本は同じ手順でイケると思いますが、手元にないので）&lt;/p&gt;

&lt;p&gt;Macが熱くならない以外にも、以下のメリットがあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ブラウザとターミナルとエディタ、ネットワークさえあれば開発できる&lt;/li&gt;
&lt;li&gt;強いマシンを買う必要がない=エコ&lt;/li&gt;
&lt;li&gt;ネットワークが速い（dockerイメージのpullやnode modulesのインストールなどで体感できる）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;p&gt;以下の手順で設定します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;事前準備&lt;/li&gt;
&lt;li&gt;GCEインスタンス作成＆起動&lt;/li&gt;
&lt;li&gt;GCEインスタンス上で、個別プロジェクトのdocker-compose実行&lt;/li&gt;
&lt;li&gt;Visual Studio Code Insiders &amp;amp; Extensionsで開発&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  事前準備
&lt;/h2&gt;

&lt;p&gt;GCPアカウントの作成・設定は、この辺りを参考に適宜お願いします。&lt;br&gt;
&lt;a href="https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja"&gt;https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;アカウント作成後、適当なGCPプロジェクトを作成または選択してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  GCEでインスタンス作成＆起動
&lt;/h2&gt;

&lt;p&gt;この後の手順は、基本的にはこのチュートリアルの通り。&lt;br&gt;
&lt;a href="https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os"&gt;https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作成したプロジェクトでVMインスタンスを作成します。&lt;br&gt;
ブートディスクはDebian9のまま、&lt;br&gt;
リージョン、インスタンスサイズはお好みで。最初のビルド時はn1-standardくらいが良いと思います。&lt;br&gt;
あと、複数プロジェクトを同インスタンス内で使いたい場合は、storageが10GBだと足りなくなる可能性が高いので増やした方がよいやも。&lt;/p&gt;

&lt;h2&gt;
  
  
  GCEインスタンス上で、個別プロジェクトのdocker-compose実行
&lt;/h2&gt;

&lt;h3&gt;
  
  
  git, docker. docker-composeインストール
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;VMインスタンス一覧でSSHボタンクリックでブラウザターミナル起動
git&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt install git&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;docker, docker-composeのインストールはこの辺を参考に。&lt;br&gt;
&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-9"&gt;https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;docker&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apt-cache policy docker-ce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt install docker-ce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo systemctl status docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker --version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo usermod -aG docker ${USER}&lt;/code&gt; # sudo なしでdockerコマンド実行できるようにgroupに追加&lt;/li&gt;
&lt;li&gt;SSHログインし直す&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;docker-compose&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-&lt;/code&gt;uname -s&lt;code&gt;-&lt;/code&gt;uname -m&lt;code&gt;-o /usr/local/bin/docker-compose&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/docker-compose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose --version&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  個別プロジェクトのソースコードをGitHubからcloneした後、docker-compose upを実行
&lt;/h3&gt;

&lt;p&gt;前準備として、このVMインスタンスからGitHubに接続できるように設定します。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ブラウザターミナルで &lt;code&gt;ssh-keygen&lt;/code&gt; 実行。ファイル名はデフォルトのid_rsaでOK。パスフレーズを入れて忘れないようにする&lt;/li&gt;
&lt;li&gt;GitHubのSettings &amp;gt; SSH and PGP Keysページに上記で作った公開鍵（~/.ssh/id_rsa.pubの中身）を登録&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;これでVMインスタンス上でcloneできるはずです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;mkdir /home/&amp;lt;username&amp;gt;/projects&lt;/code&gt; （ディレクトリ名は何でも良いです）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd projects&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git clone &amp;lt;githubなどのclone先URL&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd &amp;lt;cloneしたプロジェクト&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ポートを開ける（Optional）
&lt;/h3&gt;

&lt;p&gt;ここまでで、ポート80でリクエストを受けられるようなdocker-compose環境であれば、&lt;br&gt;
VMインスタンス一覧画面の外部IPリンクをクリックすればブラウザで実行結果を確認できます。&lt;br&gt;
80以外のポートを開けたい場合は、以下を追加で実施してください。&lt;br&gt;
SPAの開発環境であれば、2つくらいは開けたくなると思います。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GCPのVPCネットワーク &amp;gt; ファイヤーウォールルールをクリック&lt;/li&gt;
&lt;li&gt;ファイヤーウォールを作成をクリック&lt;/li&gt;
&lt;li&gt;名前とターゲットタグに &lt;code&gt;http-8080&lt;/code&gt; 、プロトコルとポートに許可したいポートを指定（例：tcp:8080,3000,3100）&lt;/li&gt;
&lt;li&gt;VMインスタンスの編集画面で、ネットワークタグに &lt;code&gt;http-8080&lt;/code&gt; を追加&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;これで &lt;code&gt;http://&amp;lt;外部IP&amp;gt;:&amp;lt;ポート&amp;gt;/&lt;/code&gt; にブラウザで接続できると思います。&lt;br&gt;
SPAなどの場合、通信先IPの指定も忘れずに。&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Studio Code Insiders &amp;amp; Extensionsで開発
&lt;/h2&gt;

&lt;p&gt;Visual Studio Code Insidersをインストールします。&lt;br&gt;
2019年8月現在、Visual Studio Code（以下VSCode）正式版ではRemote SSHなどが動作しないのでInsiders版をローカルPCにインストールします。&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/?dv=osx&amp;amp;build=insiders"&gt;https://code.visualstudio.com/docs/?dv=osx&amp;amp;build=insiders&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Remote Developmentをインストール
&lt;/h3&gt;

&lt;p&gt;以下のExtension全部入りのExtensionであるRemote Developmentをインストールします。&lt;br&gt;
VSCode Insiders版のExtensionタブで「Remote Development」で検索してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote Containers&lt;/li&gt;
&lt;li&gt;Remote SSH&lt;/li&gt;
&lt;li&gt;Remote WSL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VMインスタンス側の接続設定
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;VMインスタンス編集画面で、SSH認証鍵欄にローカルMacの公開鍵を追加して保存
（またはVMインスタンス内のauthorized_keys に公開鍵を追加）&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ローカル側の接続設定
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;ローカルMacの~/.ssh/config を編集
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host &amp;lt;ホスト名&amp;gt;
  Hostname &amp;lt;立ち上げたVMインスタンスの外部IP&amp;gt;
  User &amp;lt;GCPユーザー名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;VSCode のRemote SSHタブ上に、上記で追加した&amp;lt;ホスト名&amp;gt;が出てくるのでダブルクリック&lt;/li&gt;
&lt;li&gt;接続完了&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;接続できない場合は、以下を疑ってみてください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~/.ssh/config のユーザー名がGCPユーザー名ではない、または外部IPが違う&lt;/li&gt;
&lt;li&gt;ssh初回接続をVSCodeで実施してしまうと、ローカルMacのknown_hostsに追加するところで止まってしまうので、ターミナルなどで一度ssh接続してみる&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  余談
&lt;/h2&gt;

&lt;p&gt;本当は、GCEのContainer-Optimized OS(COS)を使ってリモート環境を構築し始めたんですが、VSCodeのRemote Serverインストールでコケたのでやめました。&lt;br&gt;
Container-Optimized OS の機能と利点はこちら。&lt;br&gt;
&lt;a href="https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits?hl=ja"&gt;https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits?hl=ja&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;また、Cloud Shellのコードエディタで開発できるようにしようかと思いましたが、VMインスタンスからCloud Shell上にソースコードを同期する必要があるため、面倒なのでやめました。&lt;br&gt;
素直にVSCodeでソースを書きましょう。&lt;/p&gt;

&lt;p&gt;では、良いリモート開発ライフを。&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>gce</category>
      <category>docker</category>
      <category>dockercompose</category>
    </item>
  </channel>
</rss>
