20210802のdockerに関する記事は11件です。

AWSのEC2にDockerをインストールする方法

はじめに 昨日はローカルの開発環境(Windows)でDockerを使う記事を書いたので、本日はクラウド上(EC2)にDockerを導入する方法について記事にしたいと思います。 Amazon Linux2へのDockerのインストール # yumを最新にする sudo yum update -y # dockerのインストールする sudo yum install -y docker docker -v sudo systemctl start docker sudo usermod -aG docker ec2-user # 自動起動を有効化する sudo systemctl enable docker # 自動起動の設定確認する sudo systemctl is-enabled docker # インストールが終わったらEC2を再起動するために終了する exit UbuntuへのDockerEngineのインストール # 古いバージョンをアンインストールする sudo apt-get remove docker docker-engine [docker.io](http://docker.io/) containerd runc # 最新にする sudo apt-get update # リポジトリを利用してインストールするための準備をする sudo -y apt-get install apt-transport-https ca-certificates curl gnupg lsb-release # GPGキーを追加する(ファイルが改ざんされていないことを確認するために使われる鍵ファイル) curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # リポジトリ追加する echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Engineをインストールする sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # ubuntuユーザーでdockerを使えるようにする sudo gpasswd -a ubuntu docker # インストールが終わったらEC2を再起動するために終了する exit # 導入確認する docker --version 関連サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

技術書「Rubyソースコード完全解説」 と 「docker で ruby」構築

今まで買ってよかった技術書を紹介しよう! https://qiita.com/official-events/d409f91fc8b9b44cefb4 の企画に参加する記事です。 Docker上のみでシステムを作るときの構成 https://qiita.com/official-events/339b6440dbd578f4f66f 参加記事です。 協賛企画 bookmeterで協賛企画をはじめました。 今まで買ってよかった技術書を紹介しよう! https://bookmeter.com/events/8648 技術書は、紹介してもなかなか反応がなく、嫌気が指すかもしれません。 amazonに1万冊感想を書くという目標を立てたとき、技術書ばかりを書いていて、 反応がほとんどなく、底なし沼に石を投げているような感覚に襲われたことがあります。 そこで5つの手を打ちました。 1つは、芥川賞、直木賞を読むことにより、文学の投稿をするようにしました。 芥川賞、直木賞を読む コミュニティ https://bookmeter.com/communities/332458 芥川賞、直木賞を読む イベント https://bookmeter.com/events/786 2つめは、オフライン行事に参加することでした。 2013年4/10 【第19回 名古屋de朝活読書会】 https://bookmeter.com/events/150 3つ目は、オンライン行事に参加することでした。 新潮文庫夏の100冊2014を読破しよう! https://bookmeter.com/events/1399 100冊まとめては結構捗る。 4つ目は、オンライン行事を主催することでした。 第1回お茶(緑茶・紅茶・烏龍茶)を飲みながら読書会 https://bookmeter.com/events/1310 5つ目は、絵本に焦点を絞ったことでした。 【読メ絵本部】 https://bookmeter.com/communities/334325 これは、小坂井大輔さんが主催されていた朝活読書会で絵本の紹介があったときに、 かこさとし が、技術士だということを知ったのに衝撃を受けて、かこさとしの 絵本の全部読み(紙芝居以外は完読)しようとしたことによります。 Rubyソースコード完全解説 https://bookmeter.com/books/32780 Rubyソースコード完全解説(html版) https://i.loveruby.net/ja/rhg/book/ ご紹介に基づいて拝見しました。 ruby / ruby @ gitnub https://github.com/ruby/ruby bash $ docker run -it gcc /bin/bash How to compile and install If you want to use Microsoft Visual C++ to compile Ruby, read win32/README.win32 instead of this document. Run ./autogen.sh to generate configure, when you build the source checked out from the Git repository. Run ./configure, which will generate config.h and Makefile. Some C compiler flags may be added by default depending on your environment. Specify optflags=.. and warnflags=.. as necessary to override them. Edit include/ruby/defines.h if you need. Usually this step will not be needed. Optional: Remove comment mark(#) before the module names from ext/Setup. This step is only necessary if you want to link modules statically. If you don't want to compile dynamic extensions (probably on architectures which do not allow dynamic loading), remove comment mark from the line "#option nodynamic" in ext/Setup. Usually this step will not be needed. Run make. On Mac, set RUBY_CODESIGN environment variable with a signing identity. It uses the identity to sign ruby binary. See also codesign(1). Optionally, run 'make check' to check whether the compiled Ruby interpreter works well. If you see the message "check succeeded", your Ruby works as it should (hopefully). Run 'make install'. This command will create the following directories and install files into them. ${DESTDIR}${prefix}/bin ${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY} ${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM} ${DESTDIR}${prefix}/lib ${DESTDIR}${prefix}/lib/ruby ${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY} ${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM} ${DESTDIR}${prefix}/lib/ruby/site_ruby ${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY} ${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM} ${DESTDIR}${prefix}/lib/ruby/vendor_ruby ${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY} ${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM} ${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY} ${DESTDIR}${prefix}/share/man/man1 ${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system If Ruby's API version is 'x.y.z', the ${MAJOR} is 'x', the ${MINOR} is 'y', and the ${TEENY} is 'z'. NOTE: teeny of the API version may be different from one of Ruby's program version You may have to be a super user to install Ruby. If you fail to compile Ruby, please send the detailed error report with the error log and machine/OS type, to help others. Some extension libraries may not get compiled because of lack of necessary external libraries and/or headers, then you will need to run 'make distclean-ext' to remove old configuration after installing them in such case. bash # git clone https://github.com/ruby/ruby.git Cloning into 'ruby'... remote: Enumerating objects: 507408, done. remote: Counting objects: 100% (1352/1352), done. remote: Compressing objects: 100% (788/788), done. remote: Total 507408 (delta 595), reused 1220 (delta 541), pack-reused 506056 Receiving objects: 100% (507408/507408), 244.97 MiB | 4.30 MiB/s, done. Resolving deltas: 100% (388985/388985), done. # cd ruby # ./autogen.sh # ./configure checking for ruby... false configure: error: cannot run /bin/bash tool/config.sub いまここ。 参考資料(reference) 人生で影響を受けた本100冊。Youtube(3) https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e 情報工学の専門家に読んで欲しい月刊「技術士」の記事544 https://qiita.com/kaizen_nagoya/items/29ea1465cc228de17ca6 技術士が書いた本・冊子類(IT業界・製造業向け)200+3 https://qiita.com/kaizen_nagoya/items/774665826e8a91ad4bd7 新人の方によく展開している有益な情報 https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1 第11回 TOPPERS活用アイデア・アプリケーション開発コンテスト https://qiita.com/kaizen_nagoya/items/91162a9b258a2a06f5e0 TOPPERSに関連する書籍なら、この部門への投稿の表題を変えて、コンテストに応募するのも手かも。 あなたもdocker, 私もdocker https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8 開発環境を豊かにする開発事例 過去・現在・未来 https://qiita.com/kaizen_nagoya/items/d9bf0c2c671fe7f1c749 Microsoftとの歴史 Cコンパイラを中心に https://qiita.com/kaizen_nagoya/items/d7c0cc257e99de0573cf Qiitaエンジニアフェスタ_ブラウザ選手権 https://qiita.com/kaizen_nagoya/items/98c4c7f911aa47465087 Qiitaエンジニアフェスタ_StaticWebApps に参加するまで https://qiita.com/kaizen_nagoya/items/1a1f53926325d872821f TOPPERS ソースを積み上げよう https://qiita.com/kaizen_nagoya/items/65c15aed086f2da0928d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rustとactix_webでWebアプリケーションを作ってみる

はじめに 犬が歩くサイトをRustで作ろうとしましたが、 時間が足りずTODOとストップウォッチのサイトを作ってしまいました。 なぜかフロントエンドのフレームワークを入れずにやってしまったので、構成など後で直すかもしれません。 成果物 デプロイする余力がなかったため、画面キャプチャです。 TODOアプリ 実践Rustプログラミング入門(Amazonへ飛びます)を参考にしました。 SQLiteから、Selectした結果の表示、Insert, Deleteの実行ができます。 ストップウォッチ 秒単位でカウントアップします。htmlとjsだけで実装しておりRustである必要はないです。 RustのWebサーバでindex.thml以外のhtmlを動かしたかったのでこちらを参考に作成しました(リンク先ソースをそのまま使うとバグがあります)。 ソース あとで更新する可能性があるので執筆時点のソースも貼っておきます。 執筆時点のtag 構成など簡単に 開発環境 Docker(VSCodeのRemote - Container)を利用しました。 構成 本当はwebとdbのコンテナを分けたかったのですが、 今回は同じコンテナ内でSQLiteでtodo.dbを使っています。 web |- src |- main.rc |- static/js |- stopwatch.js |- templates |- index.html |- stopwatch.html |- Cargo.toml |- todo.db その他、開発に必要なものを全部含めてしまっていますが、サービスとしては以上 main.rc main.rcの目ぼしいところ抜粋して説明します。 文法含めた学習ノートは、wikiに書くようにしました。 github wikiへ飛びます deriveマクロは、structやenumへの修飾を可能にするマクロです。 #[derive(MACRO_NAME)]アトリビュートを型の前に記述することで実装を自動的に導出します。 実装されるものは、引数に指定したこちらのトレイト use serde::Deserialize;で取り込んでいます。 htmlから渡されるPOSTリクエストのパラメータをパース(Deserialize) するために記載されています。 #[derive(Deserialize)] struct AddParams { text: String, } #[derive(Deserialize)] struct DeleteParams { id: u32, } template(html)に渡すデータを構造体で定義しておきます。 TODOアプリなので、TODOごとのid、TODOの内容としてtextを定義しています。 main.rc抜粋 struct TodoEntry { id: u32, text: String, } htmlごとにテンプレートを定義していきます。#[derive(Template)]として定義します。 index.htmlのテンプレートとして、entriesとして、先ほど定義した構造体をセットします。 main.rc抜粋 #[derive(Template)] #[template(path = "index.html")] struct IndexTemplate { entries: Vec<TodoEntry>, } postで/addが呼ばれたときの挙動を定義します。 今回は、index.htmlからaddボタンが押されたとき(<form action="/add" method="post">)に呼んでいます。 main.rc抜粋 #[post("/add")] async fn add_todo( } こちらは、http://127.0.0.1:8080/とhttp://127.0.0.1:8080/stopwatchで呼ばれたときの挙動。 それぞれTODOアプリとストップウォッチアプリになります。 main.rc抜粋 #[get("/")] (略) #[get("/stopwatch")] (略) webサーバの定義。 .serviceに先ほどasyncで定義した非同期関数をサービスとして追加しています。追加しないと読み込まれません。 fs::Files::newはjs, css, imgなどを格納したフォルダを追加しています。 1つ目の/staticはmount_pathなのでhttp://127.0.0.1:8080/staticに当たります。 2つ目の./staticはserver_fromなのでweb/src/static配下を指定していることになります。 main.rc抜粋 #[actix_web::main] async fn main() -> Result<(), actix_web::Error> { (略) HttpServer::new(move || { App::new() .service(index) .service(stopwatch) .service(add_todo) .service(delete_todo) .service(fs::Files::new("/static", "./static").show_files_listing()) .data(pool.clone()) }) .bind("0.0.0.0:8080")? .run() .await?; Ok(()) } Cargo.toml actix-rt = "1.1.1"は、actix-rt = "2.2.0"が最新ですが、最新はactix-web = "3.3.2"と互換性なく動きませんでした。 actix-files = "0.5.0"は、jsのような静的ファイルを扱うため。 askama = "0.10.5"は、テンプレートエンジンを扱うため。 Cargo.toml抜粋 [dependencies] # 2.2.0 is incompatible versions of actix crates. # actix-rt = "2.2.0" actix-rt = "1.1.1" actix-web = "3.3.2" actix-files = "0.5.0" askama = "0.10.5" rusqlite = { version = "0.25.3", features=["bundled"] } r2d2 = "0.8.9" r2d2_sqlite = "0.18.0" thiserror = "1.0.26" serde = { version = "1.0.126", features = ["derive"] } stopwatch.html main.rcから渡されたデータはentriesですが、{% for entry in entries %}のような形で呼べます。 なお、実際のソースでは、html/jsのみで動くサービスなのでこの部分は、参照不要としてコメントアウトしています。 バックエンドからの戻りを必要としないhtmlをRust側でテンプレート定義しているのでこの部分がないと参照なしとして警告が出ます。本来どのhtmlでも画面タイトルなど最低限の参照を作るか、static同様htmlの静的ファイルの取り扱いを決めるなどした方がいいと思いますが、決め切れなかったので暫定対応です。 参照は、index.html(TODOアプリ)で利用していますので、必要に応じて参照してください。 <script src="../static/js/stopwatch.js"></script>は、静的ファイルとして追加したサービスを読み込んでいます。 stopwatch.html抜粋 <div> {% for entry in entries %} <div> <div>id: {{ entry.id }}, text: {{ entry.text }}</div> <form action="/delete" method="post"> <input type="hidden" name="id" value="{{ entry.id }}"> <button>delete</button> </form> </div> {% endfor %} </div> <script src="../static/js/stopwatch.js"></script> おわりに 次は犬を歩かせたいですが、VSCode+dockerの環境も作っていたこともあり、Webで動かすだけで想像以上に時間をとられてしまいました。 あとこの環境はビルドにものすごく時間がかかります。 こちらのサイトを参考にして、VSCode設定の見直しやキャッシュ対応をし、 初回以降はキャッシュを使っていますがそれでも遅いです。 targetをマウントから外すべきかもしれませんが、コンテナを何度も作り直している段階だったので残しました。 とはいえ、修正後のビルドは毎回必要ですし、 犬が歩くだけのサイトに関して言えば、フロントエンドまでRustにする必要がないですね。 Rustでフロントエンドの実装の情報が少なく何もかも時間がかかりました。 疲れてデプロイもできませんでした。次回はせめてフロントエンドのフレームワークを使おうと思います。ありがとうございました。 以下は今後読んでみたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PLCNextへDocker(balena-engine)を導入するまで

はじめに PHOENIX CONTACT社製PLCNextへdocker(balena-engine)を導入するまでの手順です。 IoTのエッジコンピューティングできる機器を模索しており、今回のPLCNextにてエッジ処理を Node-redにて実現する事を想定しています。 balena-engineが推奨らしく、コマンドはdockerコマンドと同じっぽいです。 PLCNextの基本設定は省略します。 前提 sshが使えること(windowsならputtyやteratermなど) PLCnext firmware 2020.6 であること PLCNextのIPアドレス設定が済み、インターネット接続が可能なこと ssh接続ができる状態であること PLCNextのsu -になれること 時刻が正しいこと 時刻がずれていると、docker hubよりイメージをダウンロードする際にx509証明書の有効期限が切れていると言われ、docker pullができません。 balena-engineのインストール 参考:PLCnext Technology compatible container runtimes - Docker, Moby, balenaEngine 参考:Installation of Balena Engine ssh接続 ssh admin@192.168.xxx.xxx Warning: This device is for authorized use only! This device is for the use of authorized users only. Individuals using it and all user actions on this device may be, monitored, recorded, copied and audited. Unauthorized use, without authority, or in excess of authority, is prohibited. By continuing to use this device you indicate your awareness of and consent to these terms of use. Warnung: Dieses Gerät ist nur für den autorisierten Gebrauch! Dieses Gerät darf nur von autorisierten Benutzern verwendet werden. Personen, die es verwenden, und alle Benutzeraktionen auf diesem Gerät können, überwacht, aufgezeichnet, kopiert, und auditiert werden. Die unautorisierte Verwendung ist nicht erlaubt. Durch die weitere Verwendung dieses Geräts erklären admin:b0e95e76@192.168.xxx.xxx's password: {パスワード入力} パスワードを聞かれるので、{機器のデフォルトパスワード}と入力 balena-engin関連のディレクトリをgitより cloneする SSL認証エラーが出る場合があるので、gitの設定を変更しておく。 root@axcf2152:git config --global http.sslVerify false .gitconfigの内容が下記となっていればOK root@axcf2152:~# cat .gitconfig [http] sslVerify = false 関連ファイルをclone # Download the Project root@axcf2152:git clone https://github.com/PLCnext/Docker_GettingStarted.git balena-engineをインストール # Execute Setup.sh in archive root@axcf2152:cd Docker_GettingStarted # setup.shに実行権限付与 root@axcf2152:~/Docker_GettingStarted# chmod +x setup.sh セットアップ用のshell実行 # セットアップ実行 root@axcf2152:~/Docker_GettingStarted#./setup.sh Install balenaEngine(recommend): 1 Install Docker: 2 Version xx.xx.xx (let empty for default balenaEngine 18.9.7, Docker 19.03.8): 再起動する shutdown -r now 開発においては、firewallは不要なので削除する update-rc.d -f firewall remove balena-engineの起動 root@axcf2152:~# /etc/init.d/balena start balena-engineの終了 root@axcf2152:~# /etc/init.d/balena stop pullしたdockerイメージの確認 root@axcf2152:~# balena-engine images Result: CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS               NAMES 稼働中のコンテナの確認 root@axcf2152:~# balena-engine ps CONTAINER ID       IMAGE               COMMAND                 CREATED             STATUS                       PORTS                   NAMES b86e0eb602c7       nodered/node-red    "npm --no-update-not…"   About an hour ago   Up About an hour (healthy)   0.0.0.0:1880->1880/tcp   mynodered balena-engine pull nodered/node-red balena-engine run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red https://docs.docker.com/engine/reference/commandline/cli/ 基本的なコマンドはdockerコマンドと同じなので、以下を参照のこと Running under Docker nodered/node-red balena-engineでもdocker-hubからdockerイメージをpullできる。作成したFLOWsデータは、dockerコンテナが停止すると消えてしまうので、ホストのディレクトリと関連づけしておく必要あり。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerコンテナ内でmysqlコマンドが使えなかったときの話

はじめに Docker環境で開発中に、コンテナ内で「rails g model ~」や「rails db:migrate」により、テーブルを作成したので、作成したテーブルなどを確認するために、MySQLを起動させようとしたところ、以下のとおり、起動しませんでした。 $ mysql -u root -p bash: mysql: command not found あれ、MySQL入っているはずなのに、なぜだろう? 開発環境 ・Ruby on Rails 6.1.4 ・MySQL 8.0.25 ・Docker 20.10.7 ・docker-compose 1.29.2 原因と対応 私はrailsコマンドを使用するために、Dockerをバックグラウンドで起動させた後、次のコマンドによりコンテナに入って作業をしていました。 $ docker-compose exec web bash そうです、webコンテナ(=railsのコンテナ)の中で、mysqlコマンドを実行しようとしていたのです。 気を取り直して、webコンテナからexitし、以下のコマンドを実行します。 $ docker-compose exec db bash これでdbコンテナ(MySQLのコンテナ)に入ることができ、無事、mysqlコマンドが実行できるようになりました。 もちろん、コンテナに入らずに直接、次のコマンドを入力してもOKです。 (これなら、コマンドにコンテナ名が入っているので、最初から気がついていたような気もしますが…) $ docker-compose exec db mysql -u root -p おわりに 原因がわかれば何とも単純な話ですが、エラーが出るとあれこれ調べて、よくわからない方向へ行ってしまい、いつの間にか時間ばかりが過ぎているというのは、初心者あるあるかと思います。 同じことをやらかしてしまった人が、この記事にたどり着いてくれれば、嬉しく思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Dockerイメージを使用したLambda + APIGatewayでREST APIを構築

2020年12月から、LambdaはDcokerイメージを使用して作成できるようになりました。 そこで、DcokerイメージからLambdaを作成します。 また、作成したLambdaをもとにAPIGatewayをトリガーとしたREST APIの構築方法を説明します。 ターゲット AWSのコンテナ関連サービスについて学びたい サーバーレスでAPIを構築したい Docker,Lambda,APIGatewayについて学びたい 前提条件 Dcokerを利用する環境がある(Docker Desktopがインストールされている) AWSマネジメントコンソール、AWS CLIの両方が利用できる環境がある ECRリポジトリの作成 Lambdaを作成するコンテナイメージはECRリポジトリから取得します。 そのため、API用のコンテナイメージを格納するECRリポジトリを作成します。 マネジメントコンソールのホームから、「ecr」を検索してリポジトリを開きます。 「private」タブを選択して、「リポジトリを作成」を押下します。 一般設定で可視性設定の「プライベート」を選択します。 リポジトリ名は任意で指定します。 「リポジトリを作成」を押下します。 作成されたことを確認します。 後ほど使用するため、URIを保存します。 Lambdaのコンテナイメージ作成 フォルダ構成 lambda-test │ .env │ docker-compose.yml │ └─api script.py Dockerfile requirements.txt LambdaのDockerイメージを作成します。 Lambda関数スクリプト作成 lambda-test │ └─api script.py Pythonを使用してLambda関数に使用するスクリプトを作成します。 実行されると、{"A": "hoge", "B": "fuga", "C": "piyo"}のようにJSON形式のデータを返すようにしています。 各項目は、プロキシ統合のための Lambda 関数の出力形式に沿って設定しています。 script.py import json def lambda_handler(event, context): return { "isBase64Encoded": False, "statusCode": 200, "body": json.dumps({ "A": "hoge", "B": "fuga", "C": "piyo" }) } Lambda用のイメージがAWS公式から公開されていますので、そちらを利用します。 Python依存パッケージ管理 lambda-test │ └─api requirements.txt Pythonのpipというパッケージ管理ツールで、依存パッケージを管理します。 requirements.txtに依存パッケージを指定することで、一括インストールが可能です。 今回に関しては依存パッケージがありませんので、空ファイルを作成します。 requirements.txt コンテナイメージの設計 lambda-test │ └─api Dockerfile Dockerでは、既存のコンテナイメージをpullするだけではなく、コンテナイメージをカスタマイズすることができます。 カスタマイズ内容はDockerfileで定義します。今回はAWS公式から提供されているLambda - Python用コンテナイメージpublic.ecr.aws/lambda/python:3.8をベースに作成します。 Dockerfile # Lambda - Python用コンテナイメージを使用 FROM public.ecr.aws/lambda/python:3.8 # Pythonのパッケージマネージャを最新化 RUN pip install --upgrade pip # api配下をコンテナイメージにコピー COPY . ./ # requirements.txtで記述した依存パッケージを一括インストール RUN pip install -r requirements.txt # コンテナ起動時の実行関数を定義 CMD ["script.lambda_handler"] 環境変数を定義 lambda-test │ .env 環境依存の変数を.envに定義します。 このファイルに定義した変数は、docker-compose.ymlで使用することができます。 <ECRリポジトリのイメージURI>はECRの作成の際に控えたURIに置き換えてください。 .env IMAGE_TAG=<ECRリポジトリのイメージURI> コンテナイメージをECRリポジトリにプッシュ 以下からログインコマンドを確認します。 リポジトリ名を押下してください。 「プッシュコマンドを表示」を押下します。 コマンドの1.をコピーします。 コピーしたコマンドを使用して、AWS CLIでECRにログインしてください。 ※ログインには、$ aws configureでAWS CLIへのアカウント設定が必要です。 ECRリポジトリにログイン $ aws ecr get-login-password --region <リージョン> | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com lambda-test(docker-compose.ymlのあるフォルダ)まで移動しします。 フォルダ移動 $ cd <BASE_DIR>\lambda-test コンテナイメージをビルドします。 コンテナイメージのビルド $ docker-compose build --no-cache 作成したコンテナイメージのREPOSITORYの値がECRリポジトリのURIになっていることを確認します。 コンテナイメージの確認 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com/<リポジトリ名> latest e694ba04a4e7 16 seconds ago 614MB ECRリポジトリにプッシュします。 ECRリポジトリにプッシュ $ docker-compose push マネジメントコンソールに戻り、ECRリポジトリにコンテナイメージがあることを確認します。 Lambdaを作成 ECRリポジトリのコンテナイメージから、Lambdaを作成します。 マネジメントコンソールで、「lambda」と検索して、サービスの「Lambda」を押下します。 左のナビゲーションペインから「関数」を選択して、右上の「関数の作成」を押下します。 オプションで「コンテナイメージ」を選択します。 関数名に任意の値を指定します。 「イメージを参照」を押下します。 対象のECRリポジトリからイメージタグがlatestのイメージを選択します。 「イメージを選択」を押下します。 「関数の作成」を押下してLambdaを作成します。 以下の画面に遷移すれば作成完了です。 LambdaのトリガーとしてAPIGatewayを作成 Lamndaの起動条件を設定します。 Lambdaの詳細画面の「トリガーを追加」を押下します。 トリガーの設定で「API Gateway」を選択します。 新規でAPIを作成するので、「APIを作成する」を押下します。 「REST API」を選択して、セキュリティは「APIキー」を選択します。 「作成」を押下します。 トリガーに「API Gateway」が追加されます。 動作確認 APIキーの確認 APIの実行にAPIキーを必須に設定したため、ヘッダーに指定する必要があります。 Lambdaの詳細画面の「設定」タブを押下します。 「トリガー」を選択して、API Gatewayのリンクを押下します。 API Gatewayの詳細画面で、左のAPIキーを押下します。 <Lambda名>-Keyを押下します。 APIキーの「表示」を押下すると、APIキーが確認できますので保管します。 APIのUrlを確認 APIのURLを確認します。 「ステージ」を選択します。 「default」を選択して、URLを確認します。 curlでAPIの動作確認 APIキーを設定した場合は、ヘッダーのx-api-keyに指定する必要があります。 以下のコマンドを実行します。 Windowsのコマンドプロンプトで実行する場合は、ヘッダーをダブルクォーテーションで指定してください。 APIの動作確認 $ curl -H 'x-api-key:<API_KEY>' <API_URL> 実行結果 {"A": "hoge", "B": "fuga", "C": "piyo"} おわりに REST APIをコンテナ(Dcoker)とサーバーレス(Lambda)を使用して構築してみました。 上記の技術は、スピード重視の小規模開発や、マイクロサービスにも使用できると思いますので、参考にしていただければ幸いです。 参考 API Gateway で Lambda プロキシ統合を設定する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerの「because server did not provide an image ID」エラー

エラー cannot write /var/folders/wn/20c5t0fj2qg6rv9pzdszv481km81hq/T/tmpszp7eu3d because server did not provide an image ID というエラーが出てビルドに失敗する。 対策 Dockerのメモリを増やす Docker for MacならGUIから増やせる duild時のcacheを削除する docker builder pruneコマンドで実行 参考URL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FARGATEのコンテナにdocker execする【既にECSを使用している方向け】

1.AWSCLIの更新 macOS curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / macOS以外の更新方法は 2.SSM(SessionManagerPlugin)をインストール macOS curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg" && sudo installer -pkg session-manager-plugin.pkg -target / ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin macOS以外のインストール方法は 3.既存のECSサービスのenable-excute-commandを有効にする 2021/8/2現在、AWSコンソール上からは有効にできないため、AWSCLIを使用します。 aws ecs update-service \ --cluster example-cluster \ --service example-service \ --enable-execute-command ちなみに、terraformを使用している方は、リソース「aws_ecs_service」のenable_execute_commandをtrueにするだけです。 4.AWSCLIからFARGATEのコンテナにアクセスする 以下のコマンドでコンテナにアクセスします。 aws ecs execute-command \ --region $AWS_REGION \ --cluster ecs-exec-example-cluster \ --task ef6260ed8aab49cf926667ab0c52c313 \ --container example-container \ --command "/bin/bash" \ --interactive region名、cluster名などは、適宜修正が必要です。 【補足】 An error occurred (TargetNotConnectedException) when calling the ExecuteCommand operation: The execute command failed due to an internal error. Try again later. 時間を置いて試してもエラーが解決するわけもなく、ECSのタスクロールにSSM関連の権限を与えて、タスクを再起動することで解決しました。同じエラーが出た方の助けになると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Desktop for Macの自動起動が出来ない現状の代替手段

Docker Desktop for MacがMacの起動時に自動起動1出来ず、「Fatal Error Failed to ping backend API」とエラーコンソールが表示されます。しかも、操作ボタンを選ばせる様になっていますが、クリックしても反応しません。故に終了させたくても終了させることが出来ず、ターミナルを起動してKillするか、アクティビティモニタを起動して強制終了するより他に終了出来ません。そこで以下の様に現状の代替手段を考えました。 自動起動の無効化 Docker DesktopのPreferences.../GeneralのStart Docker Desktop when you log inのチェックボックスをオフにします。また、Docker Desktop起動時にダッシュボードが表示されて欲しくない場合は、Open Docker Desktop dashboard at startupのチェックボックスもオフにします。 起動スクリプトの作成 Docker Desktopの起動スクリプトを作成します。記述内容は以下の通りです。sleep 10の部分は必須ではありません。(無くても良い) start_docker_desktop.sh #!/bin/bash sleep 10 open /Applications/Docker.app 実行権限の付与 実行権限を付与します。 chmod +x start_docker_desktop.sh Crontabに登録し、起動時に自動実行を有効化 Crontabに登録して、Mac起動時に自動実行出来る様にします。 crontab -e 以下の内容を追記します。 @reboot start_docker_desktop.shの絶対パス Reference 現状Docker DesktopのPreferences.../Generalを覗いてみると、Start Docker Desktop when you log inのチェックボックスがオフになっています。ネットで調べて見るとGitHubのIssueにも挙がっており、どうやらバグの様です。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeのportsの設定が反映されない

0. 前提 サーバ等全く起動させずコンテナを実行する。 1.現象 docker-composeにportsを指定しているが、ホスト側から指定したポートにアクセスできない。 docker-composeと起動コマンドは以下。 docker-compose.yml version: '3' services: app: build: context: docker dockerfile: Dockerfile ports: - 80:80 コンテナを実行し、bashを使えるようにする。 run docker-comopse run app bash docker-compose psでポートのフォワード状態をみるが、フォワードされていない。 docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------------- コンテナ名 bash Up 80/tcp 2.原因 「docker-compose run」で実行すると、docker-compose.yml内のportsの設定は反映されない。 3-1.対応(1):-pオプションを付けて実行。 「-p」オプションをつけることでportの開放とフォワードができる。 この場合、portsの設定は不要。 docker-compose run -p 80:80 app bash ポートの状態を確認。 docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------------- コンテナ名 bash Up 0.0.0.0:80->80/tcp,:::80->80/tcp 「-p」オプションについて:公式:docker-compose run 3-2.対応(2):「tty:true」を設定し、「up」コマンドで起動状態を維持。 docker-compose.yml version: '3' services: app: build: context: docker dockerfile: Dockerfile ports: - 80:80 tty: true コンテナを実行し起動状態を維持。 run docker-compose up ポートの状態を確認。 docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------------- コンテナ名 bash Up 0.0.0.0:80->80/tcp,:::80->80/tcp 「tty」については、以下の記事で詳しく説明されており、参考になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] pryで、矢印キーを押すと`^[[A`などと出てしまう現象の解決法

環境 macOS 10.13.6 Ruby 2.5.7 Rails 6.1.3.1 Docker 20.10.7 Docker Compose v2.0.0-beta.6 現象 pryで矢印キーを押すと、次のような記号が現れてしまうようになってしまう。 例えば、矢印キーの↑を押すと、下記のような^[[Aという文字が表示されてしまいます。 その他、矢印キーの→を押すと^[[C、矢印キーの←を押すと^[[Bが表示されます。 原因 最近私はDockerのバージョンを20.10.7にUpgradeしたのだが、それに伴ってDocker Composeのバージョンがbeta版になってしまっていた。 つまりDocker Compose V2がデフォルトで有効になっていた。 これが、今回起きた矢印キーのバグの原因だった。 対処法 Docker Compose V2を無効にすると解決します。 docker docsに記載の通り、下記のように無効にします。 DockerDesktopを使用してDockerCompose V2を無効にするには: ① Dockerメニューから、[Preferences]> [experimental features]をクリックします。 ② [Use Docker Compose V2]チェックボックスをオフにします。 CLIを使用してDockerCompose V2を無効にするには、次のコマンドを実行します。 $ docker-compose disable-v2 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む