dockerの勉強のための備忘録
dockerのイメージ作成からbuidあたりまで
勉強の進捗に従って更新予定
Dockerイメージの作成
## docker run コマンドでイメージをHubからダウンロードする
docker run docker/whalesay cowsay Hello!!
ローカルにダウンロードされていない場合は、イメージのpull結果が表示される
docker run docker/whalesay cowsay Hellodocker run hello-world:latest
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
00bf65475aba: Pull complete
c57b6bcc83e3: Pull complete
8978f6879e2f: Pull complete
8eed3712d2cf: Pull complete
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
____________________________________
< Hellodocker run hello-world:latest >
------------------------------------
\
\
\
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
ローカル上にダウンロード済みのイメージ一覧を表示する
docker images
~/docker 14s
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
docker/whalesay latest 6b362a9f73eb 6 years ago 247MB
tag
コマンドでイメージにタグ付けすることができる
/
で区切って任意の名前をつける
docker tag docker/whalesay my_whalesay
dockerイメージの削除
コンテナを削除してからイメージを削除or -fコマンド
docker rmi docker/whalesay
イメージをPULLする
docker pull docker/whalesay(PULLしたいイメージ名)
既にイメージがある場合はAlready exists
となる
❯ docker pull docker/whalesay
Using default tag: latest
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Already exists
909cd34c6fd7: Already exists
0b9bfabab7c1: Already exists
a3ed95caeb02: Already exists
00bf65475aba: Already exists
c57b6bcc83e3: Already exists
8978f6879e2f: Already exists
8eed3712d2cf: Already exists
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay:latest
Dockerfileについて
Dockerイメージ作成のための指示書
Dockerfile
を作成する
touch Dockerdile
ファイルを開いて指示コマンドを記述する
FROM docker/whalesay:latest // どのイメージを使うか
RUN apt-get -y update && apt-get install -y fortunes // -yは処理が止まらないようにする
CMD /usr/games/fortune | cowsay // run時に実行されるコマンド
dockerfileからイメージをビルドする
-t : タグ名の指定
docker build -t docker-whale(タグ名)
実行結果
❯ docker build -t docker/whalesay .
[+] Building 25.0s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 158B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/docker/whalesay:latest 0.0s
=> [1/2] FROM docker.io/docker/whalesay:latest 0.2s
=> [2/2] RUN apt-get -y update && apt-get install -y fortunes 24.5s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:56e423c8ab3edc2903d97e04f6215b9eb43e54fdd8822 0.0s
=> => naming to docker.io/docker/whalesay 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
ビルドしたイメージを実行する
docker run docker/whalesay
nginxイメージをpull
docker pull nginx
pullしたイメージを起動する
docker run --name test-nginx(tag名) -d -p 8080:80 nginx(コンテナ名)
ローカルホスト8080番にアクセスすると、nginxのwelcome画面が表示される
docker ps
コマンドで、現在稼働中のコンテナを確認できる
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e955fcb1d476 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp test-nginx
run中のコンテナは削除できない
実行中のコンテナは削除できないので、一旦stopさせる
docker stop test-nginx
❯ docker stop test-nginx
test-nginx
次にコンテナを削除する
docker rm test-nginx
特に表示されないが、docker ps
すると先ほどのコンテナが削除されていることを確認できる
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(ここに何も表示されていなければok)
nginxの設定
ホストマシン上のディレクトリをマウントする
ホストマシン(自分のpc上のディレクトリ)にあるファイルをdockerコンテナで立てたnginxに公開する
任意のディレクトリを作成し、その中にhtmlを記述する
❯ ls
Dockerfile html
❯ cat ./html/index.html
<!DOCTYPE html>
<html>
<body>
<h1>My Test Head</h1>
<p>My Test documentations</p>
</body>
</html>
今回は上記ファイルをnginxを使ってブラウザで確認する
-v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション>
-p <ホスト側のポート番号>:<コンテナ側のポート番号>\
<イメージ名>
❯ docker run --name first-nginx -v /Users/docker/html:/usr/share/nginx/html:ro -d -p 8080:80 nginx
実行結果としてコンテナのIDが表示される
5525a00da1eaa67b563fe981d91e80a257a12b39d02866d65e8c715b44f998d2
dockerコンテナが停止した際にコンテナを削除する
オプション--rm
をつける
docker run --name tmp-nginx --rm -d nginx
dockerコンテナ内とファイルをやりとりする
docker cp <ローカルのパス>:<tmp-nginx:(パス)>
:ローカルからコンテナへファイルやディレクトリをコピー
docker cp <tmp-nginx:(パス)> <ローカルのパス>
:コンテナからローカルへファイルやディレクトリをコピー
ローカルで現在のディレクトリ(./)にコンテナ内のconfigファイルを転送する
docker cp tmp-nginx:etc/nginx/conf.d/default.conf ./
ローカルにファイルが転送されていることを確認
❯ ls
Dockerfile default.conf
###ローカル上でファイルを書き換え、それをbuild時にコンテナ内に転送する
server {
listen 80 -> 8080に変更;
listen [::]:80;
server_name localhost;
(以下、略)
コンテナ側のポート番号を変更してみる
Dockerfileを作成し、ファイル転送の記述を追加する
FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf
(Dockerfileと同じ階層にいるdefault.confをコンテナ内にコピー)
コンテナを立ち上げる
今回はコンテナ側のポート番号も8080にする(80番だとアクセスできない)
docker run --name web -p 8080:8080 --rm nginx:ver1
コンテナのライフサイクルについて
CREATED
: コンテナが立ち上がっているがRunnnungしていない状態
docker create --name status-test -it alpine /bin/bash
-i
シェルを展開し双方向に接続できる
-t
コンテナ内にTTYを割り当てる
状態を確認してみる
❯ docker inspect status-test
[
{
"Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
"Created": "2022-04-24T04:35:05.8179181Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "created", // コンテナが作成されている
"Running": false, // 実行状態ではない
この状態だとdocke ps
をしても何も表示されない
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Running
: コンテナが起動している状態
では次にコンテナを起動する
❯ docker start status-test
status-test
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f1e7bd14ed3 alpine "/bin/sh" 3 minutes ago Up 3 seconds status-test
今度はコンテナの情報が表示された
詳細な状態も確認してみる
❯ docker inspect status-test
[
{
"Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
"Created": "2022-04-24T04:35:05.8179181Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "running", //createdからrunningに変わっている
"Running": true, // falseからtrueに変わっている
Paused
: コンテナは起動しているが、一時的に応答拒否状態
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f1e7bd14ed3 alpine "/bin/sh" 6 minutes ago Up 2 minutes (Paused) status-test
(起動中なので表示される)
❯ docker inspect status-test
[
{
"Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
"Created": "2022-04-24T04:35:05.8179181Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "paused", // pausedに変わっている
"Running": true, // Runnningのまま
"Paused": true, // Paused: trueに変わっている
pause状態はunpause
コマンドでrunnning
状態に戻すことができる
❯ docker unpause status-test
status-test
❯ docker inspect status-test
[
{
"Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
"Created": "2022-04-24T04:35:05.8179181Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "running", // runningに変わっている
"Running": true,
"Paused": false, // falseに変わっている
Exited
: コンテナは停止しているが残っている状態
停止しているコンテナを確認する
docker ps -a
ここに存在しているコンテナはdocker start
コマンドで再起動できる
削除する場合はdocker rm
コマンド