Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Dockerのことが多分わかるハンズオン
Yoshiki Kobayashi
June 13, 2020
Programming
15
8.1k
Dockerのことが多分わかるハンズオン
Yoshiki Kobayashi
June 13, 2020
Tweet
Share
More Decks by Yoshiki Kobayashi
See All by Yoshiki Kobayashi
エンジニアとして生きていくために在学中に多分やっておいた方が良いこと
yoshi0202
1
280
ターミナル操作が多分早くなるtmuxのすゝめ
yoshi0202
0
260
サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン
yoshi0202
0
590
サーバ構築の勘所が多分わかるハンズオン
yoshi0202
0
250
sessionとcookieが多分わかる資料
yoshi0202
9
10k
Other Decks in Programming
See All in Programming
ipa-medit: Memory search and patch tool for IPA without Jailbreaking/ipa-medit-bh2022-europe
tkmru
0
130
[2023년 1월 세미나] 데이터 분석가 되면 어떤 일을 하나요?
datarian
0
590
ちょうぜつ改め21世紀ふつうのソフトウェア設計
tanakahisateru
7
6.4k
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
130
Circuit⚡
monaapk
0
200
Spring BootとKubernetesで実現する今どきのDevOps入門
xblood
0
340
OSC大阪 パスワード認証は人類には早すぎる ~ IDaaSを使ったソーシャルログインのすすめ ~
authyasan
7
1.4k
T3 Stack and TypeScript ecosystem
quramy
3
740
OIDC仕様に準拠した Makuake ID連携基盤構築の裏側
ymtdzzz
0
520
なぜRubyコミュニティにコミットするのか?
luccafort
0
310
Swift Expression Macros: a practical introduction
kishikawakatsumi
2
720
フロントエンドで学んだことをデータ分析で使ってみた話
daichi_igarashi
0
180
Featured
See All Featured
BBQ
matthewcrist
75
8.1k
Testing 201, or: Great Expectations
jmmastey
25
5.7k
Scaling GitHub
holman
453
140k
Git: the NoSQL Database
bkeepers
PRO
419
60k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.8k
Build your cross-platform service in a week with App Engine
jlugia
221
17k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
351
21k
Done Done
chrislema
178
14k
Optimizing for Happiness
mojombo
365
64k
Keith and Marios Guide to Fast Websites
keithpitt
407
21k
A Tale of Four Properties
chriscoyier
149
21k
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 … ?