Dockerって難しいよね


Dockerコマンド関係メモ

正直触りまくってコマンドとか使い方を覚えてる人は化け物って思います。

おじさんは記憶力がなくなってきてるのでメモ残さないと無理!

とりあえずWEBを彷徨いながらWindows、Linux(Ubuntu)共にDockerを使える様にしています。

ただ使う上ではLinux系の方が情報も多いのでメモとしてはこっち基準です。
windous10上でGit Bashも入っています。(スクショが楽だから)

コマンドについて(Linux系)

復習も兼ねて基礎的なものを記載します。

コマンド 意味・用途
cd <Path>
(current directory)
指定したパスに移動する
pwd
(print working directory)
今いるディレクトリの表示
mkdir <new folder>
(make directory)
新しいフォルダを作成する。
touch <new file> 新しいファイルを作成する。
ls カレントディレクトリのファイル、フォルダを一覧表示(list)
rm <file> ファイルを削除する。
rm -r <folder> フォルダーを削除する
reset ターミナル表示をリセットする
(今いるディレクトリはそのまま)

これだけ羅列しても初心者にはわかりにくいと思うので写真で説明します。

cd / pwd / ls

Linux系(Ubuntu)でターミナルを開くとhome/ユーザー位置にいます
WindowsだとC/ユーザー/user位置にいます。

まずはターミナルを立ち上げ、pwdと打ち込むと現在位置が分かります。

Ubuntu

Windows(Git Bash)

次にlsと打ち込むことで今いる場所のフォルダ・ファイル一覧が表示されます。

Ubuntu

Windows(Git Bash)

Windows的な使い方を言語化するならフォルダを開いて中身を確認するって感じです。

次にcdだがデスクトップ上に移動する前提でいうと

cd Desktopと打ち込むことでデスクトップ上に移動する。

Ubuntu

Windows(Git Bash)

これでデスクトップ上に移動した事となります。

cd /○○○/△△△と指定すればダイレクトで指定したディレクトリに移動出来ます。

mkdir / touch

Windowsに慣れてると右クリック→新規作成→フォルダみたいにやってますが
ターミナル上の操作だとそうはいかんです。

前述で移動したデスクトップ上にフォルダを作ってその中になんかファイルを作るていで説明します。
作るフォルダの名前をqiita_testとします。

mkdir qiita_testこれでフォルダ作成されます。

Ubuntu

Windows(Git Bash)


次にtouchを使ってファイルを作成する。
ファイルを作成するにあたりmkdirで作ったqiita_testに移動しておく

移動先でlsと打ち込むと空のはず

そこでtouch qiita_test.txtと入力すると・・・

Ubuntu

Windows(Git Bash)

新規ファイルとして作成されます。

いつも慣れている画面で行くと

Windows

Ubuntu

ターミナルから作ったファイルを開くにはvimnano等のエディターを用いると開けます。
Linux系だと設定ファイルの変更等でよく使用しますがここでは説明を割愛します。

rm / rm -r

次は削除について

rmについてはファイル削除
前述のqiita_test.txtを消してみる

Ubuntu

Windows(Git Bash)

てな感じで削除されます。

続いてrm -rで作ったqiita_testフォルダを削除してみます。
削除の際はディレクトリを前の階層(Desktop)に移動しておくとよいと思います。
ちなみに前の階層にはcd ../で戻る事が出来ます。

Ubuntu

Windows(Git Bash)

大分前振りが長くなりましたが基本的なLinux系コマンドは以上となります。
他にも多数ありますがまずはこれで
Dockerコンテナ内での作業でも使用するので使用頻度は多いと思います。

あとLinux系コマンドめっちゃ多いので詰まれば都度調べながらは未だに変わりません。

コマンドについて(Docker)

今回の説明でDocker Hubをメインとしています。
アカウント登録済み前提となります。

Docker Hub ← 公式です。

全部網羅出来ているとは思いません。
とりあえず使うであろうものを羅列しました。

また、リスト内の<IMAGE_ID><CONTAINER_ID>については下記図の部分を差します。

コマンド 意味・用途
docker -v インストールしたDockerのバージョン確認
docker login Docker Hubにログインする。
docker logout Docker Hubからログアウトする。
docker pull <IMAGE_ID> Docker Hubからイメージを持ってくる。
docker images     ホスト(PC)に今あるDockerのイメージのリストを確認する
(コンテナの設計図データ)
docker rmi <IMAGE_ID> イメージの削除。
docker iamges -aq | xargs docker rmi イメージの全削除
(要コンテナがないこと)
docker run [option] <IMAGE_ID> [command] イメージからコンテナを生成する
(設計図からコンテナを立ち上げる)
docker ps 今あるアクティブなコンテナを確認する。
docker ps -a すべてのコンテナを確認する。
docker rm <CONTAINER_ID> コンテナを削除する。
docker ps -aq | xargs docker rm コンテナの全削除。
docker system prune コンテナの全削除。
docker stop <CONTAINER_ID> STATUSがUpのコンテナを停止させる。
exit 作業していたコンテナから抜ける。
(作業していたプロセスを切ってコンテナから抜ける)
(docker ps -aで確認するとSTATUSはExitedになっている )
docker restart <CONTAINER_ID> 抜けたコンテナを再起動する。
docker exec [option] <CONTAINER_ID> [command] 再起動したコンテナに入る。
(restartしておかないとエラー出ます)
Ctrl+p+q 作業していたコンテナから抜ける。(detach)
(作業していたプロセスを残したままコンテナから抜ける)
(docker ps -aで確認するとSTATUSはUpのまま)
docker attach <CONTAINER_ID> Ctrl+p+q(detach)で抜けたコンテナに再度入る。
(exitで抜けた場合は使わない)
docker commit <CONTAINER_ID> <new image> 触ったコンテナを更新して、更新内容をDocker imageにする。
docker tag <source> <target> Docker Hubにpushするイメージの名前を新しくして保存する。
(要Docker Hubにrepositoryを作ってある事)
docker push <IMAGE_ID> Docker Hubにあるリポジトリにdockerイメージをpushする。
(要Docker Hubにrepositoryを作ってある事)

簡単ですが以上が基本的なコマンドとなります。
恐らく突き詰めるともっとありますが道半ばなので今はこれで勘弁して下さい。

実際にDockerを触ってみる

文字ばっかりだとイメージが付きにくいのざっくりとだが流れをば
まぁ以降は蛇足感はありますが・・・

使うのはDocker Hubにある『hello-world』とこちらに書かれている『docker run -it ubuntu bash』を触ります。

ちなみにDocker Hub公式イメージ

①ログインからイメージを持ってくる(確認も含む)

docker loginをするとDocker Hubにログインします。
この際、user名とパスワードを入力します(Linuxはパスワードが表示されなのははじめ知りませんでした。)

docker pull hello-worldで公式よりイメージを持ってきます。

docker run hello-worldで持ってきたイメージからコンテナを生成します。
このhello-worldはコンテナ生成してターミナルにコメントを表示してコンテナを抜けて終了となります。

docker ps -aでコンテナ一覧を確認するとhello-worldで生成されたコンテナ履歴が出ます。
ここの『STATUS』がexitedとなっているので抜け事もわかります。

次にhello-worldコメントにある『docker run -it ubuntu bash』を試してみます。


docker run -it ubuntu bash
あれ?イメージ持ってきてないけど?と最初は思いましたが
どうもホスト側(ローカル)にイメージがない場合はDocker Hubからイメージを勝手に持ってきます。

するとターミナルで

root@○○○○○○○:/#

となります。

ルート権限でコンテナ内のubuntuを使用出来る様になります。
ここでls等を使いながら色々と環境構築をしていき
開発に必要な環境を作っていく事となります。

コンテナからはexitで抜けれます。

docker ps -aで確認するとubuntuが追加されてます。
docker imagesでイメージを確認してもubuntuが確認出来ます。

②コンテナに再度入ってみる

docker ps-aでコンテナを確認すると『STATUS』がExitedになっていると思いますが
この状態では再度コンテナ内に進入出来ません。
コンテナの再起動が必要となります。

それがdocker restart <CONTAINER_ID>となります。

すると『STATUS』がUpに変わりますのでこの状態でdocker run -it ubuntu bashと打ち込めば
コンテナ内に入れます。

コンテナ内では普通のubuntuとして使用可能なのでmkdir qiita_testとか全然できます。
ただこの時点で公式から持ってきたイメージから立ち上がったコンテナとは違うものになります。

しれっとコンテナが増えています。こっちが追加した方です。
再起動したコンテナには追加したqiita_testがないことからもわかると思います。

③更新したコンテナから新しいイメージを作成する

docker commit <CONTAINER_ID> <new image>これで新しいイメージとして保存されます。

<CONTAINER_ID>は上記の図でいう所の新しく出来たコンテナ(9bc42039a04cのこと)
<new image>はubuntuを触ったからubuntu:qiitatestはタグとなります。

これで手を加えたコンテナのイメージが出来ます。

④新しくしたイメージをDocker Hubに上げる(準備編)

公式のリポジトリからイメージを持ってきているが
勝手に手を加えてるのに公式に戻すってのはおかしいので
自身のアカウントでリポジトリを作成しておく必要があります。

但し、Docker Hubは無料で使える範囲は限られています。

無料だとリポジトリーは1つしか作成できないようです。
この辺りはプロジェクト単位か会社として有料版にした方がよいのでは?と思います。

無料プラン概要
有料プラン概要

今回は事前にアカウントを登録してかつ無料を享受したい立場として進めます。

『Create a Repository』をクリック

『Repository Name』を入力して『Create』をクリック
Public or Privateについてはお好みです。

これでリポジトリを作成できます。

私はmy-first-repoと命名しました。

pushする際、ユーザー名とリポジトリ名が必須となりますのであまり変な名前にしない方がよいかと

⑤新しくしたイメージをDocker Hubに上げる(pushする)

リポジトリ名がpullしてきたときと同じでは公式に勝手にいじったイメージをぶん投げるだけなので
リポジトリ先を変更する必要があります。

docker tag <source> <target>

<target>の部分は自分のユーザー名と作ったリポジトリ名となります。
私の場合はtakoyakiya/my-first-repoとなります。

docker imagesで確認すると追加されていることが分かります。
ただ、IMAGE_IDは同じです。
pushする先が違うとの認識でOKと思います。


次はdocker push <image>となります。

私の場合はdocker push takoyakiya/my-first-repoです。

Docker Hub側でpushされたことが確認出来ます。

まとめ

ざっくりとした流れは以上となります。
現時点ではまだまだ理解が浅く使いこなせていないのが実情です。

ただ、ローカル側でVENV等で仮想環境を一から構築するよりは
この環境で行く!って方が楽ちんなのは確かです。

後はdocker run ~以降の物理層とのマウント関係オプションが理解出来れば御の字です。