Memo/Docker

https://dexlab.net:443/pukiwiki/index.php?Memo/Docker
 

Docker

  • https://www.docker.io/
    • 仮想化ではなく、LXC(Linux Container)技術を用い、ホストOSの上に独立した環境を構築する。そのため環境を仮想化より早く作れる。ホストOSからプロセスは見える
    • 仮想化(VMware, VirtualBox, VirtualPC等)はハードウェアをエミュレートしている。
    • 2017-04-21 現在、実験環境では動作するが、本番環境では安定して運用するには向かない。各社(AWS, Google, 他)多大な労力を裂いて検証している

マルチCPUアーキテクチャ


/var/lib/docker/containerd の肥大化

  • 現状の確認
    df -h
    sudo du -m --max-depth=2 /var/lib/docker/ | sort -nr | head -n 10
    sudo docker df
  • 不要なimageがたまる
    sudo docker system prune -a --volumes
  • 標準ログがたまる
    • ログファイル単体を0 byteにする
      truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
    • ロギング・ドライバの設定でログの上限を設定する
      # 現在のドライバ確認
      docker info | grep Logging
      Logging Driver: json-file
      
      # ログ1ファイル、最大10MB、3回までrole-overしたら破棄する
      cat /etc/docker/daemon.json
      {
        "log-driver": "json-file",
        "log-opts": {"max-size": "10m", "max-file": "3"}
      }
      
      sudo service docker restart

build後に不要なコンテナやimageを削除

docker buildで失敗したり、同じタグを指定すると、「tag=none」(dangling=宙ぶらりん状態)なimageがどんどん貯まる。
コンテナがあるとimageが消せない。

  • build時に失敗したimageを自動削除
    docker build --force-rm=true -t <tag> .
  • exited=1なコンテナを削除
    docker rm $(docker ps -a --filter 'exited=1' -q)
  • tag=noneなimageを削除
    docker rmi $(docker images  --filter "dangling=true" -aq)
    # or
    docker rmi prune

VirtualBoxとDocker for Windowsが競合する


Dockerfile


MongoDB ReplicaSet

  • network部分は以下でも動いた
    networks:
      default:
        driver: bridge

コマンド

CONTAINER=mysql

# bashでコンテナに入る。bashが無いイメージの場合sh
docker exec -it $CONTAINER bash

# hostnameコマンドを実行
sudo docker exec $CONTAINER hostname
または
sudo docker exec $CONTAINER bash -c 'hostname'

Java


For windows


イメージの容量削減


ベストプラクティス


コンテナ内からのメール送信


ストレージ使用量の確認

  • system毎の使用率表示
    sudo docker system df
  • 詳細: コンテナ毎の使用率表示
    sudo docker system df -v

便利な使い方


systemd経由で、docker-composeを自動起動

  • exampleサービス用のsystemdファイル。volumeは消さない。
    • --abort-on-container-exit: コンテナが1つでも停止したら全てのコンテナを停止
    • /etc/systemd/system/example.service
      [Unit]
      Description=docker-compose example service
      Requires=docker.service
      
      [Service]
      User=vagrant
      Type=simple
      
      EnvironmentFile=-/etc/sysconfig/compose.d/example
      Environment=COMPOSE_FILE=/home/vagrant/docker-compose.yml
      
      ExecStartPre=-/usr/local/bin/docker-compose -f ${COMPOSE_FILE} kill
      ExecStart=/usr/local/bin/docker-compose -f ${COMPOSE_FILE} up --abort-on-container-exit
      
      ExecStop=/usr/local/bin/docker-compose -f ${COMPOSE_FILE} stop
      
      Restart=always
      RestartSec=180s
      
      [Install]
      WantedBy=multi-user.target
    • 登録と実行
      sudo systemctl daemon-reload
      # 自動実行
      sudo systemctl enable example
      sudo service example start
      sudo service example stop

docker-compose: 複数のdockerコンテナをyamlで記述

  • volumes: データの永続化をする場合。ホストの固定パスにデータを置ける。
    • 省略した場合、rm, down等でデータが消える。
  • 例: mysql
  • docker-compose.yml
    version: '3'
    services:
      mysql:
        container_name: mysqld
        image: mysql:5.7
        volumes:
          # 初期データ投入用dir: 01_create.sql 等を置く
          - ./mysql/init:/docker-entrypoint-initdb.d
          # 永続化用
          - ./mysql/data:/var/lib/mysql
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: db01
          MYSQL_USER: user01
          MYSQL_PASSWORD: eZfqol7ql7drIkyr
          MYSQL_ROOT_PASSWORD: NE0byoxdlbo6pefs
  • mysqlへ接続。「--protocol tcp」が無いとunix socketを使おうとしてエラーが出る。
    mysql -u root -p -h localhost --protocol tcp
  • mysqlのrootパスワードを変える場合。
    • docker-compose.ymlを変えて、stop/upしても変わらない。mysqlのファイルは、dockerのファイルシステムに書いてあるので、rmが必要。rmするとデータも消える。
      sudo docker-compose stop mysql
      sudo docker-compose rm mysql
      sudo docker-compose up -d mysql

起動しないコンテナの調査

portsが未定義だったり、なにかエラーがあると、コンテナが止まってしまう。
「tty: true」をつける事で起動しつづける事ができる

  • docker-compose.yml
    version: '2'
    services:
      alpine:
        image: alpine:latest
        tty: true
  • 起動
    docker-compose up -d
    
    docker-compose ps
         Name         Command   State   Ports
    -----------------------------------------
    example_alpine_1   /bin/sh   Up
  • コンテナに入って調査
    docker exec -it example_alpine_1 sh
  • 停止
    docker-compose kill

コード整形


Javaアプリ関連


脆弱性検査


セキュリティ


BuildKit: ビルドの高速化


NIC

  • CentOS7: docker0という仮想NICが増えるが、/etc/sysconfig/network-scripts/ 以下には存在しない

CentOS7で There are no more loopback devices available.

sudo yum install docker device-mapper -y

sudo systemctl start docker
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

sudo systemctl status docker.service -l
...
 9月 07 15:46:04 centos7-server docker-current[2886]: time="2016-09-07T15:46:04.652301456+09:00" level=error msg="There are no more loopback devices available."

# /dev/loop[1:6]を作成
for i in {0..6}; do sudo mknod -m0660 /dev/loop$i b 7 $i;done

# 開始
sudo systemctl start docker
systemctl enable docker

インストール

  • macOS
    brew install docker
    brew cask install docker

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-17 (木) 18:35:08 (35d)