Docker 備忘録 †[edit]
see also †[edit]
Wiki曰く、「Dockerはソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。」らしい。
ミドルウェア以上のものをコンテナと呼ばれるもので仮想化する。
よく活用されている場面としては以下に記す。
1.開発アプリケーションのバージョンアップや開発のとき
⇒現在のアプリケーション郡をコンテナに収容し、それをコピーすることで同じ環境で自由に触れる環境が出来上がる
出来上がった環境をcommit?することで、本番環境へ切り替えも可能?
2.運用中のサーバプログラムの更新
⇒現在動作中のサーバプログラム類をコンテナ化して、それをコピーしてパッチ、バージョンアップを検証できる
- RHEL8(Red Hat Enterprise Linux 8)および CentOS8 からは Docker の代わりに Podman の使用が推奨されている.
CentOS 8 (2021 7/25) †[edit]
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf -y install docker-ce docker-ce-cli containerd.io --nobest --allowerasing
CentOS8 入れ直し(21 7/3) †[edit]
リポジトリがあるようなので,それから入れなおす. †[edit]
- # rpm -e docker-ce-3:19.03.15
- # rpm -e containerd.io-1.2.6 --force
- # dnf erase containerd.io-1.2.6
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf -y install docker-ce docker-ce-cli containerd.io
For CentOS8 †[edit]
下記方法とは別に dnf module install container-tools でもインストールできる場合がある.
CentOS8 の場合の事前準備 (2020 8/15) †[edit]
2023 1/17 CentOS8 の update で Docker が動かなくなったので上記の方法で入れ直し.(containerd.io が runc と競合する場合) †[edit]
もし podman が必要なら containerd.io をインストール後に,入れ直す. †[edit]
# yum install podman -y
# yum install toolbox -y
# yum install cockpit-podman -y
# yum install buildah -y
本体の Install & Getting Start †[edit]
# wget -qO- https://get.docker.com/ | sh
..............
# systemctl enable docker
# systemctl start docker
# docker run hello-world
or
# dnf install docker-ce
# systemctl enable docker
# systemctl start docker
# docker run hello-world
- 注)ipv6 が OFF だと bridge.ko の読み込みで,シンボル(ipv6_dev_get_saddr)未定義のエラーを起こす.
- Error starting daemon: Error initializing network controller: Error creating default \"bridge\" network: package not installed
- NSLでは /etc/modprobe.d/dist.conf の最終行をチェック <-- ここで ipv6 を止めている.
Getting Start †[edit]
Hello World †[edit]
# docker run hello-world
CentOSを使ってみる †[edit]
# docker pull centos
# docker images
# docker run -i -t centos /bin/bash
(DockerBash)#
CentOSを使ってみる2 †[edit]
# docker pull centos:centos7
# docker run -ti -d --name centos7 centos:centos7
# docker exec -it centos7 /bin/bash
[root@fbd5aeb4046a /]#
- コンテナ状況確認
- コンテナ状況確認(過去の終了したものも含む)
- コンテナから抜ける
- コンテナへの接続を再開する
- docker attach コンテナID(またはコンテナ名)
- コンテナ内でシェルが動いていないとダメ.exit で抜けるとコンテナが停止する.
- docker exec -it コンテナID(またはコンテナ名) bash
- コンテナでPID=1のプロセスを実行する. exit で抜けてもコンテナは停止しない.
- コンテナの削除
- docker rm コンテナID(またはコンテナ名)
- コンテナを止める
- docker stop コンテナID(またはコンテナ名)
- 止まっているコンテナを動かす
- docker start コンテナID(またはコンテナ名)
- コンテナのログを表示
- docker logs コンテナID(またはコンテナ名)
ボリューム(永続ストレージ) †[edit]
- ボリューム一覧
- ボリュームの削除
- docker volume rm ボリューム名
- 強制削除には --force を使用する
- イメージ削除
- イメージ名の変更(A->B タグの付け替え)
- # docker tag A B
- # docker rmi A
- イメージを保存
- docker stop コンテナ名
- docker commit イメージ名
- ファイルシステムの書き出し
- docker export コンテナID(またはコンテナ名)
- tar 形式で標準出力に出力される.
- 例) docker export vyos_netp | ( cd rootfs; tar xfvp -)
- ファイルシステムの読み込み
- docker import ファイル名(tar形式) イメージ名
- 例)tar -C rootfs -c . | docker import - vyos_netp:200920
- イメージの保存
- docker save コンテナID(またはコンテナ名)
- tar 形式で標準出力に出力される.
- 例) docker save vyos_netp | ( cd rootfs; tar xfvp -)
- イメージの読み込み
- docker load
- tar 形式のイメージを標準入力から入力
- 例)tar -C rootfs -c . | docker load
使用していない(孤立した)リソースの削除 †[edit]
- システム: docker system prune
- イメージ: docker image prune
- コンテナ: docker container prune --filter "until=24h"
- ボリューム: docker volume prune --filter "label!=keep"
Health check[edit]
- /usr/bin/podman healthcheck run e7c872ee87560f886a697b5115673a8050e0a09c4797b774f86731425900dbc5
- 書式
- HEALTHCHECK [オプション] CMD "コマンド" || exit 1
- 例)HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
- オプション
- --interval=DURATION (default: 30s)
- --timeout=DURATION (default: 30s)
- --start-period=DURATION (default: 0s)
- --retries=N (default: 3)
ファイル(Volume)共有 †[edit]
- volume : /var/lib/docker/volumes
- Podman : /var/lib/containers/storage/volumes
- DB: /var/lib/docker/volumes/metadata.db (PC毎に持つ必要がある)
- POdman(特殊ファイル): /var/lib/containers/storage/volumes/backingFsBlockDev 特に処理する必要はない(と思う)
none タグのイメージの名前(表示)を消す. †[edit]
- 名前も none の場合は,docker tag で指定する名前は何でもよい.
現在の環境が Docker のコンテナなのかを確認する. †[edit]
cockpit-docker †[edit]
Networkの初期化スクリプト †[edit]
#!/bin/sh
rm -r /var/lib/docker/network/files/*
systemctl restart docker
Dockerデーモン(dockerd) のリモート操作 †[edit]
- リモートとローカルの unix ソケットファイルを ssh でつなぐ.
- Docker の動いているマシンで,グループ docker に属するユーザを作成(例えば docker).
- パスワードを設定しておく.起動シェルは要らない.
- # adduser docker -u 105 -g docker -d /var/lib/docker -s /sbin/nologin
- # asswd docker
- ローカルマシンで以下のコマンドを実行.
- ssh -fNL /var/run/mdlds.sock:/var/run/docker.sock docker@202.26.150.55
- chgrp apache /var/run/mdlds.sock
- chmod g+rw /var/run/mdlds.sock
- コマンド実行時は DOCKER_HOST=unix:///var/run/xxx.sock または docker -H unix:///var/run/mdlds.sock ps
- docker_rsock.sh
* ボツ SSH ポートフォワードを使用する. †[edit]
- ログイン相手を docker グループのユーザにする.
- でもローカルポートにアクセス可能なら,結局やばい状況になる..ネ.
* ボツ docker の通信機能を使用する †[edit]
- /usr/lib/systemd/system/docker.service
- ex.) ExecStart=/usr/bin/dockerd -H fd:// -H tcp://202.26.150.55:9099 --containerd=/run/containerd/containerd.sock
- systemctl daemon-reload
- systemctl restart docker
- ssh:// を指定するとエラー.man でも -H に ssh は載っていない.
- よく考えれば,リモートからは無条件でコマンドを受け入れる.やばいです.
Dcoker 内から DNSが引けない (その他のサービスも同様) †[edit]
- ホストの firewall の影響
- ホストのfirewalld を止めてからイメージを実行
- Docker イメージが動いている最中に止めて駄目,=> Dockerを再起動
/etc/resolv.conf †[edit]
- Docker 内の /etc/resolv.conf は特殊なファイルなので mv できない.
Docker Images †[edit]
jupyterhub/singleuser †[edit]
jupyter/datascience-notebook †[edit]
jupyter/tensorflow-notebook †[edit]
rattydave/jupyterhub †[edit]
joequant/bitstation:latest †[edit]
jupyterhub/singleuser †[edit]
/opt/conda/bin/conda update --prefix /opt/conda --all -y
apt-get update -y
apt-get upgrade -y
apt-get install vim -y
apt-get install subversion -y
apt-get install make -y
apt-get install automake -y
apt-get install gcc -y
apt-get install zlib1g-dev -y
apt-get install mlocate -y
docker commit すると,起動時のオプション(arguments)まで保存する. †[edit]
- 次回起動すると,オプションが 2重になる.なんてこったい! docker build では大丈夫(そもそも起動していない)
- 起動時のオプションは,イメージ(/var/lib/docker/image/overlay2/imagedb/....)に Cmd[ ] に値として保存されている.
- イメージファイルはテキスト(!?)なので,Cmd[ ] に何が書いてあるかわかる.
- "Cmd":["start-notebook.sh","--ip=0.0.0.0","--port=8888","--notebook-dir=/home/teacher/iseki/jupyter","--SingleUserNotebookApp.default_url=/lab"]
- 流石に直接編集するのは躊躇われる.(一回やってみる?)
- エディタで直接編集したら,Docker から見えなくなった.まあ予想通り.
- ちゃんと動くやつの Cmd[ ] を確認して,docker commit 起動時に -C オプションで変更可!
- jupyter の場合: docker commit -c 'CMD ["start-notebook.sh"]' jupyter_old jupyter_new
- /etc/passwd と /etc/group も元に戻しておく
Jupyter で色々やっていたらコンテナが続々と自動生成->消滅 を繰り返している †[edit]
Trouble Shooting †[edit]
Dockerfile[edit]
conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory)[edit]
良く分かっていなかった頃のエラーなので,勘違いしているかもしれない †[edit]
docker run実行時のiptablesエラー †[edit]
Dockerfile による RUNで,pipがNewConnectionError を出す. †[edit]
- CentOS8 固有のエラーらしい.CentOS8 は Docker 未サポートだからな~