Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dockerのことが多分わかるハンズオン
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yoshiki Kobayashi
June 13, 2020
Programming
21k
48
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dockerのことが多分わかるハンズオン
Yoshiki Kobayashi
June 13, 2020
More Decks by Yoshiki Kobayashi
See All by Yoshiki Kobayashi
エンジニアとして生きていくために在学中に多分やっておいた方が良いこと
yoshi0202
1
490
ターミナル操作が多分早くなるtmuxのすゝめ
yoshi0202
0
1k
サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン
yoshi0202
0
1k
サーバ構築の勘所が多分わかるハンズオン
yoshi0202
0
420
sessionとcookieが多分わかる資料
yoshi0202
11
14k
Other Decks in Programming
See All in Programming
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
550
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
180
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
400
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
560
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
230
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
180
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
420
AIが無かった頃の素敵な出会いの話
codmoninc
1
240
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
490
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
200
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
420
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
560
YesSQL, Process and Tooling at Scale
rocio
174
15k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
660
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
440
Transcript
Dockerのことが 多分わかるハンズオン Yoshiki Kobayashi 2020/06/28
Hello World!! 自称なんでも屋。好きなAWSのサービスはLambda。 好きな言語はJavaScriptとRuby。Nintendo Switch難民。 最近転職しました。 Name : Yoshiki Kobayashi
@yoshi0202 @codeplumdev https://code-plum.dev
モダンな技術って 憧れるよねぇ〜
溢れんばかりのモダンなロゴ
そんな中でも今日は
この人に 注目していきます
Dockerのハンズオン やるよ!!!!!
でもその前に、 Docker is 何
Dockerとは Docker(ドッカー)は、コンテナ仮想化を用いてアプリケーションを開発・配 置・実行するためのオープンソースソフトウェアあるいはオープンプラット フォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化(英語版)によりアプ リケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を 可能にする。かつその環境自体をアプリケーションと同じようにコード(イ メージ)として管理可能にする。Dockerを開発・テスト・デプロイに用いること で「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大 きく短縮できる。
by wikipedia
は?
3行でいうと 差異ない環境が 誰でも作れて かつ早い ってこと
使うとわかる。 めっちゃ便利。
今までの環境構築 • サーバを起動する • 必要なミドルウェアをインストールする(これだけでハードル高い) • エラーが出る • ミドルウェアの設定をする(都度ググる) •
エラーがでる • アプリケーションデプロイする(これもしんどい) • エラーがでる • 解決する、またエラーがでる
めんどくさい & 失敗すると環境が 汚れる
Dockerを使うと これだけで終わる docker-compose up ※誰かが頑張って初期設定しなきゃいけないよ
みんなが幸せになれる ※誰かが頑張って初期設定しなきゃいけないよ
それでは試しに dockerを使って、ローカル環境にNginxを起動してみよう! ターミナルでこれを実行! $ docker run -it --rm -p 80:80
nginx:latest その後、ブラウザで「localhost:80」にアクセスしてみよう!
こんな画面が出ましたか?
Nginxが起動できた
では次に ターミナルでCtrl + c を入力しコンテナを終了してみよう! コンテナ終了と共にブラウザからアクセスができなくなるはず。
これで跡形もなく、 Nginxは消えた…
ローカル環境が 汚くならない なぜならそもそもNginxを インストールしていないから
では早速 Dockerの基本的な使い方 の前に、、、
コンテナ is 何
コンテナとは • Dockerエンジンの上に立つ一つの箱 • 箱の中には指定したもの(さっきの例だとNginx)が入ってる • コンテナに何を入れるか、を考える
簡単に言うと マシン内の入れ物に 任意の物を入れられる 便利な箱
もちろん 箱をカスタマイズ することも可能
それではやってみよう FROM ubuntu:latest CMD echo "Hello World!" 適当な場所でDockerfileという名前でファイルを作成し、下記内容を入力 $ docker
build -t dockerhandson:latest ビルドコマンドを実行 $ docker run dockerhandson:latest Hello World! 起動コマンドを実行
それぞれの説明 FROM ubuntu:latest # FROMでベースイメージを決める。今回だと ubuntuをベースイメージで利用。 # https://hub.docker.com/_/ubuntu # 他のOSとかも色々選べるのでdockerhubを漁ってみることをおすすめ
CMD echo "Hello World!" # コンテナの一番最後で実行するコマンドを CMDで定義 # 今回だとechoコマンドを最後に実行するように定義してあげてる # なので、実行するとHello World!が出力されていた Dockerfile
それぞれの説明 $ docker build -t dockerhandson:latest docker build でビルドコマンドが実行できる -t
オプションでタグ付けが可能。 {コンテナ名}:{バージョン}って感じでタグ付けして管理する。 バージョン名は省略可能だけど、省略すると latestが自動的につけられる ビルドコマンド
それぞれの説明 $ docker run dockerhandson:latest docker run で起動できる。 ここでも{コンテナ名}:{バージョン}でコンテナを指定して起動 Dockerfileの内容に基づいてビルドされているため、コンテナの最後で
echoが実行される 起動コマンド
既存のベースイメージを利 用してカスタマイズが完了
コンテナのベストプラクティス • 1コンテナ、1プロセス • Scrap & Build(作っては壊す) • 毎回ビルドしてあげることで常に最新の状態でメン バーに共有できる
さてここでいくつかの 疑問
1コンテナ1プロセスっ てことは、 プロセス分docker run するんか?
1コンテナ1プロセス? FROM nginx:latest Nginx,MySQL,Node.jsを起動するとなると、こんな感じ? FROM mysql:latest FROM node:latest $ docker
build -t dockerhandson_nginx:latest . $ docker build -t dockerhandson_mysql:latest . $ docker build -t dockerhandson_node:latest . $ docker run dockerhandson_nginx:latest $ docker run dockerhandson_mysql:latest $ docker run dockerhandson_node:latest
いや、純粋にめんどく さいな?
docker-compose を使おう
Dockerfileとdocker-compose.yml ①Dockerfile 一つ一つのコンテナの詳細が書かれ たファイル ②docker-compose.yml 複数コンテナを管理するファイル
やってみよう version: "3.7" # dcoker-compose.ymlのバージョンを指定 services: # サービス内にコンテナ別の項目を記載していく web: image:
nginx:1.18 # nginxのイメージを指定、{ベースイメージ}:{バージョン}の形式 container_name: handson_web # ビルドされた時のコンテナ名を指定 ports: - 80:80 # ローカルの80ポートをコンテナ内にフォワーディング db: image: mysql:5.7 # mysqlのイメージを指定 container_name: handson_db # 上と同じくコンテナ名 environment: # コンテナ内に環境変数を渡す。本来はパスワードはあんまり ♂ MYSQL_ROOT_PASSWORD: pass Nginx,MySQLを起動するdocker-compose.ymlを書いてみる 記述が終わったらdocker-compose up で起動!
docker-compose up だけで複数コンテナが 起動した 楽ちん
これでDockerを使って いろんなことができ る!
あれ、、、 でも、、、
ソースコードってどう やってコンテナの中に 持っていけば良い の?
個人的によく使う パターンとしては二種 類あります
コンテナ内へのソースコード移動 ①Dockerfileに書く →本番環境での運用時におすすめ ②コンテナ起動時にマウントする →開発時にオススメ簡単
今回は②のパターンを 試すよ!
やってみよう① version: "3.7" # dcoker-compose.ymlのバージョンを指定 services: # サービス内にコンテナ別の項目を記載していく app: build:
. container_name: handson_rails ports: - 3000:3000 volumes: - ./rails:/opt/rails tty: true stdin_open: true Dockerfileを書き換える(Rails6系はwebpackerがめんどくさいので5系で許して) FROM ruby:2.6 RUN apt update && apt install -y nodejs RUN gem install rails -v 5.2 WORKDIR /opt/rails docker-compose.ymlを書き換える
やってみよう② $ pwd /opt/rails $ rails new handson コンテナビルドした後に、コンテナ内にログインする! $
docker-compose build app $ docker-compose run app bash ここでrails new すると・・・
ローカルにrails newし た時のファイルができ てる
もうちょっと書き換える コンテナ実行時にいくつかやることがあるので、スクリプトが実行されるように修正する railsのプログラムディレクトリ (今回だとrails/handson 内)に[entrypoint.sh]を作成 #!/bin/bash rm -fr tmp/pids #Railsの嫌いポイント。
rails s -b 0.0.0.0 Dockerfileもちょっと修正。コンテナビルド時に bundle installが実行されるようにする。 FROM ruby:2.6 RUN apt update && apt install -y nodejs RUN gem install rails -v '5.2' WORKDIR /opt/rails/handson COPY rails/handson/Gemfile ./Gemfile COPY rails/handson/Gemfile.lock ./Gemfile.lock RUN bundle install CMD sh entrypoint.sh
いよいよ最後 もう一回ビルドして・・・ $ docker-compose build app 起動♀ $ docker-compose up
ブラウザでlocalhost:3000にアクセスすると・・・
やったー
さっきまで何をしていたか詳細 1. rails new を実行するための仮コンテナを作って 2. そのコンテナを起動 3. rails newを実行すると
4. ローカル内に雛形ファイルが作成される 5. Railsを起動するためのコンテナに作りかえて 6. 起動!!!!
①仮コンテナの作成 各種コンテナはそもそもアプリケーションを実行する環境 なので、最初の雛形ファイルを作る実行環境用意してあげる必要がある ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用のコンテナ それぞれが
実行環境に なっているの で、プログラ ムがないと 実行できな い!
①仮コンテナの作成 Nginx、DBはすでに実行するアプリケーションが存在しているので、 Railsについては初期ファイル作成用の仮コンテナを用意してあげる (rails new 実行用) ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ
DB用のコンテナ Rails用の 仮コンテナ (railsコマンドがイン ストールされている)
②仮コンテナを起動 Railsの雛形作成用の仮コンテナを起動。 起動するときに、ローカルのボリュームをコンテナにマウントする。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ
ローカルのPC ~/hogehoge/fuga Railsの仮コンテナ /opt/hogehoge
③rails new 実行 仮のコンテナ内で、ローカルPCのボリュームがマウントされている パス内でrails newを実行する。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ
DB用のコンテナ Rails用の 仮コンテナ PC ⇆ コンテナで共 有しているパス内で rails new を実行!
④ローカルにファイルが作成 ローカルPC内とコンテナ内でデータが共有されているため、ローカルPC内に データが作られる。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ
Railsの雛形ファイル 各種 Controller Model View
⑤起動コンテナに作り替える ローカルに雛形ができ実行できる準備ができたので、プログラムが起動できるコ ンテナに作り替える。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 実行コンテナ
Railsの雛形ファイル 各種 Controller Model View プログラムが 存在するの で実行する 準備が整っ た!
⑥起動! Railsが起動する ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 実行コンテナ Railsの雛形ファイル
各種 Controller Model View
諸々のコマンドの説明 • docker-compose build [名前] ◦ docker-composeのservice別にコンテナをビルドする ◦ rails +
nuxtみたいな環境で、railsだけビルドしたい時とかに便利 • docker-compose run コンテナ名 コマンド ◦ 起動中のコンテナにログインするコマンド ◦ コンテナ内で作業するときとかに使う • docker-compose up もしくは docker-compose down ◦ docker-compose.ymlの設定内容でコンテナを起動、停止 ◦ Ctrl + cでも終了はできる ◦ ゴミが残ってしまうのでdownで消した方が良い
• コンテナ内でmigrate実行したい! ◦ docker-compose run app rails db:migrate • どんなコンテナが起動しているか確認したい!
◦ docker ps -a • コンテナ内で作業したい!(再掲、個人的にめっちゃ使う) ◦ docker-compose run app bash ユースケースごとのコマンド
本日のハンズオンはこ こまで!!!
• コンテナの概念 • dockerの基礎的な使い方、コマンド • Dockerfile、docker-compose.ymlの基本的な書き方 • あとはこれを参考にいろんなコンテナを作ってみるべし! 今日覚えたこと
• 聞く前と聞いた後で、理解度的にどうでしたか??? • よかったところ、逆に悪かったところガンガンフィードバックください! • わかりづらかったところは直接質問してもらってもOKです♂ • 定期的にこんな感じでやっていこうと考えてます • コミュニティでやりたいなぁと
• ぜひ皆さんのスライドも見たい!!!!!! • アウトプット = 最強のインプットなので、ぜひチャレンジを!!! これ聞いてハンズオンやってみて
終わり!!!!! 最後に好きな絵文字 で締めます To be continued … ?