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
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
980
サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン
yoshi0202
0
990
サーバ構築の勘所が多分わかるハンズオン
yoshi0202
0
410
sessionとcookieが多分わかる資料
yoshi0202
11
14k
Other Decks in Programming
See All in Programming
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
640
New "Type" system on PicoRuby
pocke
1
740
Vite+ Unified Toolchain for the Web
naokihaba
0
180
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.9k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
480
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
770
JavaDoc 再入門
nagise
0
310
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
AIエージェントの隔離技術の徹底比較
kawayu
0
470
スマートグラスで並列バイブコーディング
hyshu
0
100
A2UI という光を覗いてみる
satohjohn
1
120
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
YesSQL, Process and Tooling at Scale
rocio
174
15k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
Ruling the World: When Life Gets Gamed
codingconduct
0
250
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
The SEO identity crisis: Don't let AI make you average
varn
0
480
The Invisible Side of Design
smashingmag
302
52k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
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 … ?