- Published on
Docker基礎
- Authors
- Name
- Kikusan
- Dockerコマンド
- Dockerコマンドの詳細
- run = (pull) + create + start
- デフォルトコマンド
- -it とは
- コンテナの削除
- コンテナに名前をつける
- detached & foreground mode
- Dockerfile
- インストラクション
- ホストとコンテナの連携
- ファイルシステムの共有
- ホスト側のユーザを指定してコンテナをrunする
- ホストのポートをコンテナのポートにつなげる
- リソース上限を設定
- Docker composeコマンド
Dockerコマンド
docker login
docker pull hello-world # image取得
docker images # イメージ一覧
docker run hello-world # コンテナ作成
docker ps -a # 起動していないコンテナも含めて表示
docker run -it ubuntu bash # bash起動時のオプション imageないと取ってくる
touch test # testファイル作成
$exit # 停止
docker restart 151dcbb2879f # 開始
docker exec -it 151dcbb2879f bash # すでにあるコンテナに実行するプログラムを命令
Ctrl p q # detouch プロセスは消えない
docker attach 151dcbb2879f # 起動中のプロセスに入る
$exit
docker commit docker 151dcbb2879f ubuntu:updated # コンテナを image名:tag名で保存
docker tag ubuntu:updated username/test:updated # タグ名付け替え
docker push username/test:updated # DockerHubにpush
docker rmi username/test:updated # image削除
docker pull username/test:updated # image取得
docker run -it username/test:updated bash # testファイルがある。
同じimageをrunすると、コンテナは2つになる。
ubuntuでは4つのimageレイヤーを使用し起動される。 コンテナを作成するとその上に新しいimageレイヤーが作成される。
DockerHubのレポジトリはimageにつき一つ。
REPOSITORY名:TAG名 = IMAGE名
library/ubuntu:latest = ubuntuイメージの名前 ※本当は hostname:port/username/repositoryname:tag
DockerHubにimage登録するには、username/reponame:tagnameの形式に揃えてimage名を設定し作成しなければならない
Dockerコマンドの詳細
run = (pull) + create + start
1. docker run <image>
=
2. docker create <image>
3. docker start <container>
start はデフォルトコマンドを実行した後、exitする -a をつけるとコマンド出力が見える。
デフォルトコマンド
docker run -it ubuntu bash の bashがデフォルトコマンド
docker run ubuntu ls とすればlsの結果が出力される
-it とは
-i がホストからの入力チャネルを開く -t がきれいに表示する
コンテナの削除
docker rm <container> # 削除
docker stop <container> # 止める
docker system prune # 全削除
docker image prune # i全削除
コンテナに名前をつける
docker run --name <name> <image>
detached & foreground mode
docker run -d <image> #コンテナを起動後にdetachする(ステータスがupになる)
docker run --rm <image> #コンテナをExit後に削除する(runの削除までVer)
Dockerfile
INSTRUCTION argsの形でつらつら書いていく。
# image作成 Docker build -t <imagename> <directory> . はカレントDir DirにあるDockerfileを探す。
Docker build .
- build時は、Dir(build context)をDocker daemon に渡す。
- build contextにあるファイルは、ADDやCOPYで持っていける。(使わなくてもdaemonには送られる)
- build contextにDockerfileがない場合、 -f <dockerfilename>
インストラクション
- FROM :ベースとなるimageを作成
- RUN :コンテナ内でコマンド実行
- RUNごとにLayerができてしまう(COPY ADD も)
- コマンドを&&でつなげて削減 \で改行
- イメージレイヤーごとに、次buildするときにcacheとして使ってくれる(apt-get update終わってたら次はusing cache)もともとあったimageは削除され、新しいのに置き換わる。
- 実務では、cacheを使って検証して、最後にレイヤーをなくす運用にする。
- CMD ["executable", "param1", "param2"] :runしたときに実行されるデフォルトコマンドのこと
- docker run -it ubuntu bash の bashにあたる部分
- 原則最後にCMDを記述する。
- COPY src dest :ファイルをコンテナにコピーする
- ADD src dest :tarをコピーして解凍したいとき行う。
- ENTRYPOINT ["executable", "param1", "param2"] :デフォルトコマンドを指定する。 後から変更できない。
- ENTRYPOINTがあると、CMDは ["--help"] みたいに最初から引数になる。
- ENV key value :環境変数を設定する。
- ENV key1="va lu e" key2=value
- WORKDIR /dir/ :コンテナ内でコマンドが実行されるDIRを変更する。RUN cd
# FROMで元となるDockerimage
FROM ubuntu:latest
# RUNでコマンド実行 -yでyes指定
RUN apt-get update && apt-get install -y \
curl \
nginx
# COPYでファイル持ってくる
COPY copy.txt /
# 環境変数設定
ENV key value
# デフォルトコマンド設定
# CMD ["ls", "--help"]
CMD ["/bin/bash"]
ホストとコンテナの連携
ファイルシステムの共有
Docker for windows ではファイル共有にC:\を追加してからやらなきゃいけない
コンテナのフォルダはなければ作ってくれる
# -v <host>:<container> ホストのフォルダをコンテナにマウントする 絶対パスで
docker run --rm -v "$(pwd):/data" new-ubuntu ls /data
docker run -it -v C:\host_mount_folder:/container_mount_folder new-ubuntu
ホスト側のユーザを指定してコンテナをrunする
windowsではユーザいないことになるけど入れはする
#-u <userid>:<groupid>
docker run -it -u "$(id -u):$(id -g)" new-ubuntu
ホストのポートをコンテナのポートにつなげる
# -p <hostport>:<containerport>
# jupyterはpullしてくれる
docker run -it -p 11000:8888 --rm jupyter/datascience-notebook bash
$jupyter notebook
http://localhost:11000/?キートークン
リソース上限を設定
#--cpus <# of CPUs>
#--memory <byte>
docker run -it --cpus 2 --memory 1g new-ubuntu bash
docker inspect new-ubuntu # コンテナの設定一覧
Docker composeコマンド
Docker run のまとめて書いとく版 docker使えたらdocker-compose使える
使うポイント
- runコマンドが長いとき。
- 複数コンテナ動かすとき
docker-compose.ymlファイルを作成し、同じ階層でdocker-composeコマンドが使える。
# 宣言
version: '3'
#イメージ
services:
# コンテナ名
web:
#Dockerfileを使うときはbuild image使うときはimage
build: .
#オプション
ports:
- '3000:3000'
volumes:
- '.:/product-register'
#-it
tty: true
stdin_open: true
パスは相対にすること
- docker build = docker-compose build
- docker run = docker-compose up
- --buildでbuildしてrun
- --buildないと、古いコンテナがある場合は古いまま実行される
- docker ps = docker-compose ps
- docker exec = docker-compose exec
- docker-compose down : stopしてrm
docker-compose up -d --build
docker-compose exec containername bash
例:jupyterlab とpostgresコンテナ
version: '3'
volumes:
db-data:
services:
jupyter:
build: ./jupyter
ports:
- '18888:8888'
environment:
- JUPYTER_ENABLE_LAB=yes
volumes:
- '.\jupyter\work:/home/jovyan/work'
command: start-notebook.sh --NotebookApp.token=''
depends_on:
- db
links:
- db
db:
image: postgres
ports:
- '15432:5432'
volumes:
- 'db-data:/var/lib/postgresql/data'
- '.\dbinit:/docker-entrypoint-initdb.d'
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres