Published on

Docker基礎

Authors
  • avatar
    Name
    Kikusan
    Twitter

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