0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dockerの基本操作

Posted at

Linux

ターミナル:ユーザーがコマンドを入力、実行結果を表示、あくまで画面担当

シェル:仲介役・命令解釈、Linuxに伝える

Linux:受け取った命令を実行する

echo "Hell" > tmp # ファイルに追加する
cat tmp # 内容を表示
less tmp # 内容を全画面で表示・ファイルが長い時に使う

04 Dockerを使ってみよう

イメージ:コンテナに必要なものを記載した雛形

↓ 作成

コンテナ:OSの実行環境

↓ 起動

実行

デーモンにタスクを伝える。

Dockerデーモンはバックグラウンドで起動しており、クライアントから受け取ったコマンド通りに、イメージやコンテナを作成・実行するアプリケーション。デーモンの流れは以下の通り。

  1. DockerレジストリからDockerイメージを取得
  2. イメージからコンテナを起動
  3. コンテナを実行

05 Dockerを使ってみる

~/Docker 以下

main.rb #アプリケーションコード

require "webrick"

server = WEBrick::HTTPServer.new(
	DocumentRoot: './',
	BindAddredd: '0.0.0.0',
	Port: 8000
)
server.mount_proc('/') do |req, res|
	res.body = "hello"
end

server.start

Dockerfile こいつがDockerイメージを担う

FROM ruby;2.7

RUN /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]
# イメージを作るコマンド、イメージをビルドする
# -tオプション、タグ付け、.(今いるディレクトリ)に対して"sample/webrick:latest"というタグをつける。
# タグ名の構成 名前空間:ver情報
docker image build -t sample/webrick:latest .

# 今存在しているイメージの存在
docker image ls

# dockerのコマンド確認
docker --help

# docker imageのコマンド確認 
docker image --help

# イメージの作成と起動
# -pオプション、ポート指定 ローカルポート:ドッカーポート(今回はこっちは8000番じゃなきゃいけない)
# --name コンテナの名前をつけている。"付けたい名前 対象のイメージ" の順番
docker container run -p 8000:8000 --name webrick sample/webrick:latest
# コンテナの停止
ctrlC
docker container stop webrick

# コンテナの起動状態の確認
docker container ls
# 停止しているコンテナを含めた起動状態の確認
docker container ls -a

# コンテナの削除
docker container rm webrick
# "-d" バックグラウンドで実行
docker container run -d -p 8000:8000 --name webrick sample/webrick:latest

# コンテナのログを確認する
docker container logs webrick

# コンテナ内で別のコマンドを実行したい
# "コンテナ名 実行内容"
docker container exec webrick ruby -v

# 現在しようしていないイメージやコンテナを削除する。
docker system prune -a

06 Dockerfile

ベースのイメージを指定して、ベースイメージに対してコマンドを羅列する。

FROM ruby:2.7 # ベースイメージを指定する

WORKDIR /var/www # ワークディレクトリは、この後の作業をどこでやるか指定する。なかった場合は作成される。

COPY ./src /var/www # "./src"というソースコードをdockerのワークディレクトリにコピー

CMD ["/bin/bash"] # 一度dockerコンテナ内に入る。bashはシェルの一種。
# イメージを作成
docker image build -t sample/sinatra:latest .
# コンテナを作成・起動
# -itオプション、インティラクティブにコマンドを実行する。インティラクティブモード
# -v ボリュームをマウント。ローカル修正 = コンテナも修正される
# 最後にコンテナを作成するイメージ名を起動。
docker container run -it -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest

# sinatraをインストールしたい
# "vendor/bundle"を作成、その下にライブラリを作成。
bundle config --local set path 'vendor/bundle'

app.rbを./src内に作成

require 'sinatra'

configure do
	set :bind, '0.0.0.0' # dockerコンテナ内にバインドしておくことで、ローカルからのどんな通信でも反応するように設定。
end

get '/' do
	"Hello world!!"
end
# bundle execはgemファイルを使った処理を扱い際の枕詞
bundle exec ruby app.rb
# -> webrickというwebサーバーを立ち上げる。
# 4567でサーバーへアクセス。
FROM ruby:2.7 

WORKDIR /var/www 

COPY ./src /var/www 

RUN bundle config --local set path "vendor/bundle"
RUN bundle install

# RUN bundle config --local set path "vendor/bundle" \
# && bundle install
# これは同義。

CMD ["bundle", "exec", "ruby", "app.rb"]
docker image build
docker container run -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest

07 Docker Compose を用いたRails環境構築

# イメージのビルド
docker-compose build
# コンテナの作成・起動
docker-compose up -d
# コンテナの停止・削除
docker-compose down
# コンテナの一覧を表示
docker-compose ps
# コンテナ操作のログを表示
docker-compose lgs
# コンテナを作成してコマンドを実行
docker-compose run "サービス名" "コマンド"
# 起動中のコンテナにコマンドを実行
docker-compose exec "サービス名" "コマンド"

./Dockerfile

FROM ruby:2.7
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | 
apt-key add - \
	&& echo "deb https://dl.yarnpkg.com/debian/ stable main"
	| tee /etc/apt/sources.list.d/yarn.list
	&& apt-get update -qq \
	&& apt-get install -y nodejs yarn # nodejsとyarnをapt-getでinstallしている。上では、nodejsとyarnをインストールするためのアップデート関連をしている。
WORKDIR /app # 作業ディレクトリを設定
COPY ./src /app # 作業ディレクトリへrubyアプリをコピー
RUN bundle config --local set path 'vendor/bundle' \ # ライブラリのインストール先を指定
	&& bundle install # gemfileをインストール

./docker-compose.yml

version: '3'
services:
	db: # dbはmysql
		image: mysql:8.0
		command:
			--default-authentication-plugin=mysql_native_password # mysqlの認証関連
		volumes :
			- ./src/db/mysql_data:/var/lib/mysql # ローカルのボリュームをコンテナに同期
		environment:
			MYSQL_ROOT_PASSWORD: password # 環境変数の設定
	web:
		build: . # 今のディレクトリにあるDockerfileを参照する
		command: bundle exec rails s -p 3000 -b '0.0.0.0' # rails serverを起動。ポートはどこでもおっけい。
		volumes :
			- ./src:/app # ソース共有
		ports:
			- "3000:3000" # ローカルの3000ポートをdocker側の3000ポートに接続
		depends_on:  # 依存関係を示す
			- db  # webはdbに依存している。IPアドレスを指定しなくても、繋いでくれる。

./src/Gemfile

source "https://rubygems.org"

gem "rails", "~> 6.1.0"
# dockerイメージを作成
docker-comopse run rails new . --force --databese=mysql
# ファイルが変更された場合は、もう一度ビルドする
docker-compose build

config/database.yaml

# docker-compose記載の内容に準じて、接続先情報を変更する。
default: &default
	adapter: mysql2
	encoding: utf8mb4
	pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 ) %>
	username: root
	password: password
	host: db
docker-compose run web rails db:create

コンテナを起動

これらが終わった後に起動する。

docker-compose up

追加の操作

# コンテナを削除
docker-compose down

dockerで本番環境

./Dockerfile

FROM ruby:2.7

ENV

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | 
apt-key add - \
	&& echo "deb https://dl.yarnpkg.com/debian/ stable main"
	| tee /etc/apt/sources.list.d/yarn.list
	&& apt-get update -qq \
	&& apt-get install -y nodejs yarn # nodejsとyarnをapt-getでinstallしている。上では、nodejsとyarnをインストールするためのアップデート関連をしている。
WORKDIR /app # 作業ディレクトリを設定
COPY ./src /app # 作業ディレクトリへrubyアプリをコピー
RUN bundle config --local set path 'vendor/bundle' \ # ライブラリのインストール先を指定
	&& bundle install # gemfileをインストール

COPY start.sh /start.sh #コピー
RUN chmod 744 /start.sh #権限を付与
CMD ["sh", "/start.sh"] #ファイルを実行

start.sh 一部の条件分岐を追加したい場合。

# !/bin/sh
if [ "$(RAILS_ENV)" = "prodction" ]
then 
	bundle exec rails assets:precompile # 本番環境の設定
fi

bundle exec rails s -p $(PORT:-3000] -b 0.0.0.
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?