Linuxの基礎
シェルについて知ろう
実際は、Kernelに対して命令をしたいが出来ない
Kernelの周りのShellを仲介して命令を出す
Shellを使うのに必要なアプリケーションがターミナル
ターミナルがShellに命令を出し、ShellがKernelに命令を出す
画像引用:
第 5 回 UNIX入門(3) ... シェル/応用プログラム
環境変数について知ろう
環境変数とはOSの上で動くプロセス(ターミナルやchromeのブラウザetc...)が情報を共有するための変数
Dockerを使ってみる
概要
Dockerとは、コンテナという技術を使ってそのコンテナの中で環境を構築し
コードを実行する事でそれぞれ同じ環境を使う事が出来る。
同じコンテナを立ち上げれば同じ環境を構築出来る
画像引用:
Docker - Docker (software) - JapaneseClass.jp
コンテナはDocker imageと呼ばれるものから作られる
Docker imageはDocker fileから作られる (Docker imageの設計図)
コンテナからDocker imageを作る事も出来る
DockerHubからhello-worldをpullする
DockerHubからhello-worldというimageを自分のパソコンに持って来る
手順:
- DockerHubにログイン
- Docker Imageを自分のパソコンに持ってくる(プルする)
- 保存されているかDocker imageのリストを表示する
$ docker login
$ docker pull <image>
$ docker images
Docker imageをpullする
$ docker pull hello-world
自分のパソコンにpullされているか確認する
$ docker images
library/hello-worldとは何処なのか?
https://hub.docker.com/_/hello-world
hello-worldのコンテナを作ってみる
使うコマンド:
$ docker run <image>
$ docker ps
イメージからコンテナを作る
$ docker run hello-world
何も表示されていない
=> 実は、このコマンドはアクティブなコンテナを表示するもの
Docker imageをrunするとコンテナが作られる
コンテナの中にプログラムがあり、それを実行する (今回の場合、Hello from Docker!とテキストが出力される)
exitする
UbuntuのDocker imageをrunする
$ docker run -it ubuntu bash
-it: bash起動時に必要なおまじない(オプション)
bash: コンテナ起動時に実行するプログラム
Docker imageをrunすると、コンテナが作られ何かプログラムが動く(今回はbashというプログラムを動かしている)
Ubuntuのコンテナを更新する
画像引用元:
https://www.prplbx.com/resources/blog/docker-part1/
Docker imageを更新する方法
- コンテナから直接更新する方法
- Docker fileから更新する方法
今回は、コンテナから更新する
$ touch file test
testファイルをコンテナの中に作る
=> 新しいlayerの方で、新しくtestfileというファイルが作られたという情報が入る
$ exit
コンテナから出る。
コンテナをrestartして再度コンテナを起動する
exitされたコンテナに対してrestartというコマンドを使って、コンテナを再度起動する
docker restart <container>
execというコマンドを使ってbashを再度起動する
docker exec <container> <command>
detachを使ってexitする
detach: ctrl+p+q
exit detachの違い:
exit:
コンテナを動かしているプロセスを切ってコンテナを出る
detach:
プロセスを残したままコンテナを出る
コンテナをcommitして変更内容をDocker imageする
現時点でのおさらい、、、
- dockerhubからubuntuのimageをHostに持ってくる
- ubuntuというimageからコンテナを作る
- コンテナの中にtestというファイルを作った
今回は、コンテナの中にtestというファイルを作っただけだが、
普通はJavaを入れたり、Rubyを入れて開発環境を整える
コンテナの中にtestというファイルを作り、
変更を加えたのでその新しいコンテナを他のメンバーにも使って貰う必要がある
=> コンテナをイメージに保存して他のメンバーにイメージを配る
$ docker commmit <container> <new image>
コンテナからdocker imageにする
手順:
(1) コンテナがexited状態なのでdocker restartコマンドを使ってUPにする
$ docker restart <container>
exited状態でexecコマンドを使うとエラーが発生する!!
Error response from daemon: Container 75296c3f427ff1bd5e4499c213643881a9240de29c432bd66eb6347089ab4fc7 is not running
=> docker restartでUPにする必要がある!!
(2)コンテナをdocker imageに保存する
$ docker commit 75296c3f427f ubuntu:updated
DockerHubにリポジトリを作成する
基本的には、Ubutuというイメージに対して1つのリポジトリがあるように、
自分の新しいイメージに対して1つのリポジトリを作成する
Ubuntuのイメージは1つだが、Tag別でいろいろなUbuntuのバージョンが保存される
イメージの名前は、リポジトリ名に合わせる必要がある!!
例: username/my-first-repoの時、image名は、username/my-first-repo
Docker imageを別名で保存する
source: 元の名前
target: 新しい名前
$ docker tag <source> <target>
今回の場合、、、
$ docker tag ubuntu:updated <username>/my-first-repo
元々の名前「ubuntu:latest」は本来の名前は、、、
registry-1.docker.io/library/ubuntu:latest
DockerHubにDocker imageをpushする
手順:
(1)別タグで保存したイメージを確認する
$ docker images
(2)実際に、pushする
$ docker push <image>
Dockerの動きをもう少し理解しよう
$docker runは何をしているのか
$ docker run
docker imageからコンテナを作成するコマンド
正確に言うと、、、
run = create + start
dockerのコンテナをcreateして
更に、dockerのコンテナをstartしている。
画像引用:
$ docker create image
コンテナが作られる。
docker ps -aで確認するとcreatedという状態
$ docker start
作られたコンテナをスタートする。
実際には、コンテナ内のデフォルトのプログラムを
docker statというコマンドで実行される
デフォルトで設定されたプログラムを実行するだけ!!
この後はExitedという状態になる
実際にターミナルを見てみよう!!
$ docker run hello-world
- hello-worldのイメージからコンテナを作成する
- デフォルトコマンドを実行する
$ docker ps -a
ステータスがExitedになっている!!
$ docker create hello-world
$ docker ps -a
今コンテナが作られただけの状態
=> デフォルトコマンドは実行されてない , コンテナ自体スタートしてない
$ docker start 8bbb9dfe7c08
docker ps -a
ステータスがExitedになっている!!
コマンドが実行されるのでUPでは?
docker startでは、、、
- コンテナをUpする
- デフォルトコマンドを実行する
- 直ぐに、Exitedされる!!
docker startでは、
デフォルトコマンドの実行結果を見る事が出来ない。
見る為のオプションが、
$ docker start -a
実際に試してみると、、、
$ docker start -a 9e03f0625d22
このCOMMANDがコンテナのデフォルトのコマンド,コンテナが実行された時に指定されたコマンド
コマンドの上書き
$ docker run <image>
Docker imageのデフォルトのコマンドが実行される
$ docker run <image> <command>
Docker imageのデフォルトのコマンドが上書きされて実行される
実際に試してみると、、、
$ docker run ubuntu
$ docker ps -a
bashのプログラムが実行している事が分かる。
しかし、直ぐにコンテナから出る(Exitedの状態になる)のでその出力を見る事は無い!!
=> bashを実行した状態を保持する為に-itがある。
docker run -it ubuntu
:/#
-itって何してるの?
-itが何をしているのか実際に見てみよう!!
-iを抜いて実行してみると、、、
docker run -t ubuntu bash
/#
一見何も問題無いように見えるがlsコマンドを実行すると、、、
何も返ってこない!!
コンテナにlsが反映されてない,lsが飛んでない!!
以上より、-iは、ホストからコンテナへの入力チャネルを開く役割!!
STDIN , STDOUT , STDERR この3つのチャネルを使って
Linuxのプログラムにコミュニケーションをとってる
キーボードで打ったものがSTDINというチャネルを通してプログラムに行って、このプログラムからディスプレイに結果を表示する為にSTDOUT, STDERRというチャネルを使ってる。
-i: STDINをホストからコンテナに繋げる役割
-iをしないとホストからコンテナのチャネルが開かないので
キーボードで打っても認識されない。
$ docker run -i ubuntu bash
出力結果が綺麗じゃない, プリティじゃない
=> -tは、出力結果をプリティにする
コンテナの削除
- コンテナの削除
$ docker rm <container>
- コンテナを止める
$ docker stop <container>
- コンテナ全削除(便利)
$ docker system prune
コンテナは、このように溜まってくる
一度、Exitedしたコンテナにまた再度何かする事はそんなに多くない
定期的に削除していくのが良い!!
実際に試してみると、、、
docker rm cac2debd6876
IDがcac2debd6876のコンテナを削除出来た!!
動いているコンテナを削除しようとすると、、、
docker rm 64ccf36cf6b6
Error response from daemon: You cannot remove a running container 64ccf36cf6b686cec583a171733af88d36bf86df30cbf18ed58b17acdc23390e. Stop the container before attempting removal or force remove
コンテナを止めてみると
$ docker stop 64ccf36cf6b6
docker system prune: 全ての止まってるコンテナを削除する
$ docker system prune
コンテナのファイルシステムの独立性
コンテナのファイルシステムは、ホストからのファイルシステムや他のコンテナのファイルシステムから独立している。
2つコンテナを立てて、それぞれにtest1 , test2というファイルを作ってそれぞれのコンテナから参照出来ない事を確認する
$ docker run -it ubuntu bash
$ docker run -it ubuntu bash
片方のbinファイルを編集しても、
もう片方のbinファイルに全く反映されない!!
コンテナ名を指定してrunする
コンテナに名前を付ける
$ docker run --name <name> ubuntu
どういう時に名前を付けるのか、、、
- 起動させ続けるコンテナを立てるとき
- 共有サーバを使うとき
- 他のプログラムで使用するとき
実際に試してみると、、、
$ docker run --name sample_container ubuntu
名前を付けないとどうなるのか、、、
docker run ubuntu
既に同じ名前がある時どうなるのか、、、
docker run --name sample_container ubuntu
docker: Error response from daemon: Conflict. The container name "/sample_container" is already in use by container "71d642a44c404581b1fcbc5e6cdebdc13ff251f4ed080ff04aa831cc37ea138c". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
同じ名前のコンテナを作る事は出来ない!!
detachedモードとforegroundモード
detached mode:
$ docker run -d <image>
コンテナを起動後にdetachする(バックグラウンドで動かす)
(short-term)foreground mode:
$ docker run --rm <image>
コンテナをExit後に削除する(一回きりのコンテナ)
Dockerfileとは
画像引用:
Dockerfileを使う事でDocker imageを作る事が出来る。
(Docker imageの設計図)
Docker imageだけ見ても、どういうコンテナかは分からない
Dockerfileは、テキストで書かれているのでどういうコンテナになるかは、分かるようになっている。
Dockerfileを自由に書ける => Dockerを使いこなせる!!
Dockerfileを作ってみよう!!
INSTRUCTION argumentsという形で書く!!
INSTRUCTION: dockerの命令コマンド
arguments: INSTRUCTIONに対する引数
例:
FROM scratch
Dockerfileを作ろう!!
Desktopのdockerフォルダにdockerfileを作成する
$ cd ~/Desktop
$ mkdir docker
$ cd docker
$ touch Dockerfile
FROM ubuntu:latest
RUN touch test
FROM: 元となるベースのイメージを指定する
RUN: これを使って、Linuxのコマンドを実行する
FROM ubuntu:latest
元となるDocker imageを指定している。(:latestは無くてもよい)
ubuntu:latestを取ってきてその上に何か新しいことをする
今回のDockerfileは、
- Ubuntuというイメージをベースにする
- touch testというLinuxコマンドを実行する
DockerfileからDocker imageを作る際に、
予めtestというファイルが作られた状態でDocker imageが出来る。
DockerfileをbuildしてDocker imageを作る
DockerfileからDocker imageを作るには、
Docker buildというコマンドが必要
$ cd ~/Desktop/docker
$ docker build <directory>
$ docker images
$ docker build -t <name> <directory>
docker buildの使い方:
- Dockerfileがあるdockerフォルダに移動する
- 移動した先で$ docker build . コマンドを実行する
(. は、カレントディレクトリを示す)
$ docker images
Docker imageが出来ているか確認するコマンド
$ docker build -t <name> <directory>
-t: これを付ける事でDocker imageに名前を付けて作る事が出来る。
実際にDocker imageを作ってみよう!!
$ docker build .
エラー発生:
# latestがtestになってた!!
FROM ubuntu:test
RUN touch test
下記のように修正して、再度コマンドを実行する
FROM ubuntu:latest
RUN touch test
こちらのコマンドでイメージが作られたか確認する
$ Docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> d9629dd78a11 22 seconds ago 77.8MB
ビルドしたDocker imageをrunする
docker imagesでイメージの確認をする
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> d9629dd78a11 22 seconds ago 77.8MB
コンテナの中に入る
$ docker run -it d9629dd78a11 bash
/# ls
コンテナの中に実際にtestファイルがある事を確認できた。
Dockerfileの書き方と基本
FROM
- ベースとなるイメージを決定する
- DockerfileはFROMから書き始める(一番最初を書く)
例:
FROM ubuntu:latest
RUN touch test
ベースとなるイメージとは?
Docker fileを作ってbuildして、Docker imageを作成する
Docker imageは基本的にFROMで指定したDocker imageの上にレイヤーとしてRUN ~ とかが来る。
FROMの上に積み重なっていく感じ。
FROM docker.io/library/ubntu:latestに、RUN touch testが追加されるイメージ
FROM docker.io/library/ubuntu:latest
CACHED [2/2] RUN touch test
FROMは、ほとんどの場合OSを指定する!!
RUN
- Linuxコマンドを実行
- RUNを使うことで好きなようにカスタマイズ出来る
- RUN毎にLayerが作られる
Layerとは?
基本的には、RUNを使ってカスタマイズしていく!!
例:
FROM ubuntu:latest
RUN touch test
実際に使ってみると、、、
FROM ubuntu:latest
RUN touch test
RUN echo 'hello world' > test
$ docker build .
Layer数を最小限にするために
RUNを書く度にDocker image Layerが増える
=>Docker imageのサイズが大きくなる!!
Docker imageのLayer数は最小限にする!!
- Layerを作るのはRUN, COPY, ADDの3つ
- コマンドを&&で繋げる
- バックスラッシュ()で改行する
実際は、Dockerfileを作る場合パッケージをインストールする!!
Ubuntuではapt-getまたはaptというコマンドでパッケージを管理する
常に、新しいパッケージリストを取得してからインストールする!!
$ apt-get update : 新しいパッケージリストを取得
$ apt-get install <package> : <package>をインストール
cacheを使おう
RUN apt-get update
RUN apt-get install
この時、apt-get install用のlayer , apt-get update用のlayerが作られる。
この時、他のパッケージをインストールする時、再度updateしなくて良い
=> 既に、imageが作られパソコンの方に保存されているのでそのキャッシュを使ってくれている!!
例:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
nginx
-y: インタラクティブな質問をyで答える
$ docker build .
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
cvs\
nginx
cvsというパッケージを追加してdocker build .すると、、、
=> update , install を0からやり始める
=> キャッシュを使って短縮できる!!
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
nginx
CVSというパッケージが無い状態でdokcer build . する
次にcsvを追加して再度、docker build . する
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
nginx
RUN apt-get install -y cvs
この時、キャッシュを使って
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
nginx
↑部分を飛ばして
RUN apt-get install -y cvs
追加した部分を実行している
CMD
- CMD: コンテナのデフォルトコマンドを指定
- CMD["executable", "param1", "param2"]
- 原則Dockerfileの最後に記述
- 1つのDockerfileに1つだけ使える
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
cvs\
nginx
CMD ["ls"]
作ったイメージをdocker runで実行すると、、、
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
lsのコマンドが起動した!
RUNとCMDの違い
- RUNはLayerを作る => Docker imageの構成するのに使われる!!
- CMDは作らない
$docker buildの詳細と、その他のinstruction
$docker buildは何をしているのか
何故、docker buld する時にコンテナごと指定しているのか?
$docker build .
docker build する時に指定フォルダをdockerデーモンに渡す
docker デーモンがフォルダとDockerfileを元にイメージを作る
この時のフォルダをbuild contextという
画像引用:
docker deamonとは
画像引用:
- docker コマンドでdocker deamonに命令を出す
- docker deamonがある所を DockerHostと呼ぶ
build contextとは?
- contextとは、状況や環境の意味
- buildに使わないファイルはbuild contextに入れない
- ADDやCOPYでbuild contextの中にあるファイルをimageに持っていける
docker buildのコマンドを打つと、、、
- build contextがdocker deamonに渡される
- build contextとDockerfileの中身を使ってdocker imageを作る
COPY
build contextの中のDockerfile以外のファイルをDocker imageに組み込む
最終的にコンテナで使う事が出来る。
コンテナのファイルシステムとホストのファイルシステムは違う
=> COPY を使うことでホストからコンテナにファイルを受け渡す
ホストのsomethingというファイルをコンテナに渡す
(1) dockerフォルダにsomethingというファイルを作成
$ touch something
(2) Dockerfileを作成する
FROM ubuntu:latest
RUN mkdir /new_dir
COPY something /new_dir/
(3) イメージを作成する
$ docker build .
(4)コンテナを作成する
$ docker run -it
(5)ファイルがあるか確認する
:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt new_dir opt proc root run sbin srv sys tmp usr var
/# ls /new_dir
something
COPY と ADDの違い
- 単純にファイルやフォルダをコピーする場合 => COPY
- tarの圧縮ファイルをコピーして解凍する => ADD
helloを圧縮したcompressed.tarを解凍してコンテナに組み込む
(1) sample_folderを作成する
$ mkdir sample_folder
(2) sample_folderにHelloというファイルを作成する
(helloという文字列を入れる)
$ echo 'hello' > hello
(3)sample_folderで圧縮ファイル(compressed.tar)を作成する
$ tar -cvf compressed.tar sample_folder
(4)Dockerfileを作成する
FROM ubuntu:latest
ADD compressed.tar /
(5)イメージを作成する
$ docker build .
(6)コンテナを立ち上げる
$ docker run -it --rm 9a21f97fd388
(7)ファイルを確認する
$ cat /sample_folder/hello
/# cat /sample_folder/hello
hello
ADDは、tarファイルを移動させてそこで解凍したいのに使うのがほとんど!!
Dockerfileがbuild contextに無い場合
前回までのbuildは、build contextの中にDockerfileを作っていた
=> Dockerは、build contextを見てDockerfileを探してこれを元にdocker buildしてdocker imageを作っていた
Dockerfileという名のファイルがbuild contextに入ってない場合
$ docker build -f <dockerfilename> <build context>
どういう時に -f , dockerfilenameを指定するのか?
- Dockerfileが複数用意する時
例: 開発用: Dockerfile.dev , テスト用: Dockerfile.test
sample_folderをbuild contextとし、dockerフォルダの中にあるDockerfileを指定してbuildする
Dockerfile(Dockerfile.dev)を作成する
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
cvs\
nginx
CMD ["/bin/bash"]
docker buildする
docker/sample_folder# docker build -f ../Dockerfile.dev .
Dockerfileとbuild contextは分けて管理出来る!!
CMD と ENTRYPOINTの違い
CMD: デフォルトのコマンドを指定する
UbuntuだったらCMDが/bin/bashになっている
=> Ubuntuのdocker imageをdocker runしたら/bin/bashが実行される
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91c038704849 ubuntu "bash" 13 seconds ago Exited (0) 11 seconds ago elegant_hertz
bashになっているが上書きする事が可能
$ docker run ubuntu ls
# docker run ubuntu ls
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
ENTORYPOINT:
-
デフォルトのコマンドを指定できる!!(ここだけは、CMDと同じ)
-
runの時に上書き出来ない
-
ENTORYPOINTがある場合は、CMDは["param1", "param2",...]の形をとる(つまりENTORYPOINTで指定した引数をとる , ENTORYPOINTで指定したコマンドのオプションを指定する)
例:
ENTORYPOINTを使わない場合
FROM ubuntu:latest
RUN toch test
CMD ["ls", "--help
ENTORYPOINTを使う場合
FROM ubuntu:latest
RUN touch test
ENTORYPOINT ["ls"]
CMD ["--help"]
↑の時、CMDのオプション部分だけrunで上書き出来る!!
- コンテナをコマンドのようにして使いたい時に使う
例:
FROM ubuntu:latest
RUN touch test
ENTRYPOINT [ "ls" ]
CMD ["--help"]
$ docker build .
$ docker run 4f4059d4c7fd0d7dd19dde10646eb86900bb5394c128d68f63acd040d1bb22ab
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE with -l, scale sizes by SIZE when printing them;
e.g., '--block-size=M'; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
-C list entries by columns
--color[=WHEN] colorize the output; WHEN can be 'always' (default
if omitted), 'auto', or 'never'; more info below
-d, --directory list directories themselves, not their contents
-D, --dired generate output designed for Emacs' dired mode
-f do not sort, enable -aU, disable -ls --color
-F, --classify append indicator (one of */=>@|) to entries
--file-type likewise, except do not append '*'
--format=WORD across -x, commas -m, horizontal -x, long -l,
single-column -1, verbose -l, vertical -C
--full-time like -l --time-style=full-iso
-g like -l, but do not list owner
--group-directories-first
group directories before files;
can be augmented with a --sort option, but any
use of --sort=none (-U) disables grouping
-G, --no-group in a long listing, don't print group names
-h, --human-readable with -l and -s, print sizes like 1K 234M 2G etc.
--si likewise, but use powers of 1000 not 1024
-H, --dereference-command-line
follow symbolic links listed on the command line
--dereference-command-line-symlink-to-dir
follow each command line symbolic link
that points to a directory
--hide=PATTERN do not list implied entries matching shell PATTERN
(overridden by -a or -A)
--hyperlink[=WHEN] hyperlink file names; WHEN can be 'always'
(default if omitted), 'auto', or 'never'
--indicator-style=WORD append indicator with style WORD to entry names:
none (default), slash (-p),
file-type (--file-type), classify (-F)
-i, --inode print the index number of each file
-I, --ignore=PATTERN do not list implied entries matching shell PATTERN
-k, --kibibytes default to 1024-byte blocks for disk usage;
used only with -s and per directory totals
-l use a long listing format
-L, --dereference when showing file information for a symbolic
link, show information for the file the link
references rather than for the link itself
-m fill width with a comma separated list of entries
-n, --numeric-uid-gid like -l, but list numeric user and group IDs
-N, --literal print entry names without quoting
-o like -l, but do not list group information
-p, --indicator-style=slash
append / indicator to directories
-q, --hide-control-chars print ? instead of nongraphic characters
--show-control-chars show nongraphic characters as-is (the default,
unless program is 'ls' and output is a terminal)
-Q, --quote-name enclose entry names in double quotes
--quoting-style=WORD use quoting style WORD for entry names:
literal, locale, shell, shell-always,
shell-escape, shell-escape-always, c, escape
(overrides QUOTING_STYLE environment variable)
-r, --reverse reverse order while sorting
-R, --recursive list subdirectories recursively
-s, --size print the allocated size of each file, in blocks
-S sort by file size, largest first
--sort=WORD sort by WORD instead of name: none (-U), size (-S),
time (-t), version (-v), extension (-X)
--time=WORD change the default of using modification times;
access time (-u): atime, access, use;
change time (-c): ctime, status;
birth time: birth, creation;
with -l, WORD determines which time to show;
with --sort=time, sort by WORD (newest first)
--time-style=TIME_STYLE time/date format with -l; see TIME_STYLE below
-t sort by time, newest first; see --time
-T, --tabsize=COLS assume tab stops at each COLS instead of 8
-u with -lt: sort by, and show, access time;
with -l: show access time and sort by name;
otherwise: sort by access time, newest first
-U do not sort; list entries in directory order
-v natural sort of (version) numbers within text
-w, --width=COLS set output width to COLS. 0 means no limit
-x list entries by lines instead of by columns
-X sort alphabetically by entry extension
-Z, --context print any security context of each file
-1 list one file per line. Avoid '\n' with -q or -b
--help display this help and exit
--version output version information and exit
The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
The TIME_STYLE argument can be full-iso, long-iso, iso, locale, or +FORMAT.
FORMAT is interpreted like in date(1). If FORMAT is FORMAT1<newline>FORMAT2,
then FORMAT1 applies to non-recent files and FORMAT2 to recent files.
TIME_STYLE prefixed with 'posix-' takes effect only outside the POSIX locale.
Also the TIME_STYLE environment variable sets the default style to use.
Using color to distinguish file types is disabled both by default and
with --color=never. With --color=auto, ls emits color codes only when
standard output is connected to a terminal. The LS_COLORS environment
variable can change the settings. Use the dircolors command to set it.
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/ls>
or available locally via: info '(coreutils) ls invocation'
ls --helpで出力したオプション結果になっている!!
$ docker run 4f4059d4c7fd0d7dd19dde10646eb86900bb5394c128d68f63acd040d1bb22ab -la
total 56
drwxr-xr-x 1 root root 4096 Feb 3 13:55 .
drwxr-xr-x 1 root root 4096 Feb 3 13:55 ..
-rwxr-xr-x 1 root root 0 Feb 3 13:55 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 30 02:04 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot
drwxr-xr-x 5 root root 340 Feb 3 13:55 dev
drwxr-xr-x 1 root root 4096 Feb 3 13:55 etc
drwxr-xr-x 2 root root 4096 Apr 18 2022 home
lrwxrwxrwx 1 root root 7 Nov 30 02:04 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 30 02:04 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Nov 30 02:04 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Nov 30 02:04 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Nov 30 02:04 media
drwxr-xr-x 2 root root 4096 Nov 30 02:04 mnt
drwxr-xr-x 2 root root 4096 Nov 30 02:04 opt
dr-xr-xr-x 246 root root 0 Feb 3 13:55 proc
drwx------ 2 root root 4096 Nov 30 02:07 root
drwxr-xr-x 5 root root 4096 Nov 30 02:07 run
lrwxrwxrwx 1 root root 8 Nov 30 02:04 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 30 02:04 srv
dr-xr-xr-x 11 root root 0 Feb 3 13:55 sys
-rw-r--r-- 1 root root 0 Jan 21 13:09 test
drwxrwxrwt 2 root root 4096 Nov 30 02:07 tmp
drwxr-xr-x 14 root root 4096 Nov 30 02:04 usr
drwxr-xr-x 11 root root 4096 Nov 30 02:07 var
ls -la で出力したオプション結果になっている!!
ENV
環境変数を設定してくれる
(環境変数: OSの上で動くあらゆるプロセスが情報を共有するために使う変数)
書き方:
ENV <key> <value>
FROM ubuntu
ENV key1 value
ENV key2=value
ENV key3="v a l u e" key4=v\ a\ l\ u\ e
ENV key5 v a l u e
$ docker build .
$ docker run -it --rm a29b4a78bd11bc8be62ee4f3b82979a192e76e8423c22e55c17c6a3ade376c1a bash
/# env
環境変数の一覧を表示するコマンド
HOSTNAME=82bc94195429
PWD=/
HOME=/root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
TERM=xterm
key4=v a l u e
key5=v a l u e
key2=value
key3=v a l u e
key1=value
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
WORKDIR
DockerfileにあるDocker instractionを実行するディレクトリを変更する
FROM ubuntu:latest
RUN mkdir sample_folder
RUN cd sample_folder
RUN touch sample_file
このmkdir , cd , touchがどのディレクトリで実行されるのかを考えてみる。
RUN mkdir sample_folder
sample_folderはルートディレクトリの下で作られる(きっと)
RUN cd sample_folder
sample_folderに移動する
RUN touch sample_file
sample_folderに移動しているので、samplefolderの下につくられるわけではない!!
実際は、ルート直下で作られてる!!(Docker instractionは、ルート直下で実行される)
そこで、WORKDIRを使えば、指定したディレクトリにファイルを作れる!!
実際に見てみると、、、
FROM ubuntu:latest
RUN mkdir sample_folder
RUN cd sample_folder
RUN touch sample_file
イメージを作成する
$ docker build .
コンテナを立ち上げる
$ docker run -it c6c4f853e2c703888378f3e0c5a256e792e1d17c1b13a5206f256340a3c6d9b4 bash
sample_folderの中身を確認する
/# ls sample_folder
/#
RUN touch sample_fileにより、sample_fileが作られているはず!!しかし、無い!!
WORKDIRを使うことでそれ以降のDocker instractionの実行を指定したディレクトリで行える!!
例:
FROM ubuntu:latest
RUN mkdir sample_folder
WORKDIR /sample_folder
RUN touch sample_file
$ docker build .
$ docker run -it c1bb0d52b3cc bash
/sample_folder# ls
sample_file
今回は、sample_folderの下にsample_fileを作成出来た!!
ホストとコンテナの関係
-vを使ってファイルシステムを共有する
-v <host>:<container>
オプションでホストのファイルシステムをコンテナにマウントする
通常、ホストとコンテナのファイルシステムは全くの別物
ファイルシステムをマウントする事であたかもホストのファイルシステムがコンテナのファイルシステムにあるかのようにする事が出来る!!
使い方:
- コードをホストに置いておいて、コードを実行する時にコンテナを使うとき
- データサイエンスの時、大きなデータをホスト側で持っておき、コンテナをそのデータを解析する環境に使う
ホストのmounted_folderをコンテナDockerで作ったnew_dirというフォルダにマウントする
mounted_folderを作成する
$ mkdir mounted_folder
mounted_folderの下にファイルを作成する
$ touch mounted_folder/file_at_host
Dockerファイルを作成する
FROM ubuntu:latest
RUN mkdir new_dir
$ docker build .
$ docker run -it -v ~/Desktop/mounted_folder:/new_dir 115f06700dcb bash
# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt new_dir opt proc root run sbin srv sys tmp usr var
$ cd new_dir
# ls
file_at_host
-u オプションを使って、アクセス権限を共有する
ホストのファイルをマウントする事によって、コンテナからホストのファイルシステムにアクセス出来た!!
問題点
コンテナは基本的に何にも指定しなければroot権限を持つ
ホスト側のファイルはユーザーidやグループidでアクセス権を管理されてる
ホスト側のファイルにroot権限を持ってアクセス出来てしまう!!
よって、-uを使ってコンテナを起動する時にrootではなく
指定したユーザーID , グループIDでrunをする
ユーザーIDとグループIDを指定してコンテナをrunする
-u <user id >:<group id>
使い方:
ユーザーidを確認する
$ id -u
501
グループidを確認する
$ id -g
20
Dockerfileを作成する
FROM ubuntu:latest
RUN mkdir created_in_Dockerfile
$ docker build .
-uを使って、ユーザーを指定してdocker run する
$ docker run -it -u $(id-u):$(id -g) -v ~/Desktop/mounted_folder:/created_in_run 115f06700dcb
-pオプションを使って、ホストとコンテナのポートを繋げる
ポート: プロセスがデータ通信する際に使う物
サーバーに何かwebサービスを立てたとする。
ユーザーがこのwebサービスにアクセスするには、サーバーのIPアドレスが必要
このサーバーに複数のwebサービスがあった場合、ホストのIPアドレスだけだと、どのwebサービスにアクセスすれば良いのか分からない
=> この時にポートを使う , ポートをwebサービスに割り当てる
コンテナに何かwebサービスを立てた時、ホストのポートにアクセスしてもコンテナのポートには繋がらない!!
ホストのポートからコンテナのポートにアクセスする為に
繋げる必要がある(パブリッシュする)
使い方:
$ docker run -it p 8888:8888--rm jupyter/datascience-notebook bash
$ jupyter notebook
ブラウザからlocalhost:8888にアクセスする