#author("2024-06-16T05:49:49+00:00","default:iseki","iseki") #author("2024-06-16T05:52:21+00:00","default:iseki","iseki") * Docker 備忘録 [#y5b36a8f] *** see also [#i9ed634e] - [[Docker]] - [[Docker Compose]] - [[Docker Network]] - [[Docker Swarm]] - [[Kubernetes]] - [[Podman]] **どんなものか [#m8214aa2] - https://www.docker.com/ - 解説:https://tech-lab.sios.jp/archives/18811 Wiki曰く、「Dockerはソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。」らしい。~ ミドルウェア以上のものをコンテナと呼ばれるもので仮想化する。~ よく活用されている場面としては以下に記す。~ 1.開発アプリケーションのバージョンアップや開発のとき~ ⇒現在のアプリケーション郡をコンテナに収容し、それをコピーすることで同じ環境で自由に触れる環境が出来上がる~ 出来上がった環境をcommit?することで、本番環境へ切り替えも可能?~ 2.運用中のサーバプログラムの更新~ ⇒現在動作中のサーバプログラム類をコンテナ化して、それをコピーしてパッチ、バージョンアップを検証できる~ ~ - RHEL8(Red Hat Enterprise Linux 8)および CentOS8 からは Docker の代わりに [[Podman]] の使用が推奨されている. ** Install [#db912155] *** CentOS 8 (2021 7/25) [#e8e9cdfb] # 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) [#q7821cf8] **** リポジトリがあるようなので,それから入れなおす. [#ff55bfe5] - # rpm -e docker-ce-3:19.03.15 - # rpm -e containerd.io-1.2.6 --force -- 依存関係が複雑なので,dnf を使う - # 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 [#ja91b0de] - CentOS8では未サポート -- Docker はネットワークのフィルタリングに [[iptables]] を使う -- CentOS8 では [[nftables]] が使用されている - %%下記方法とは別に ''dnf module install container-tools'' でもインストールできる場合がある.%% **** CentOS8 の場合の事前準備 (2020 8/15) [#u8e9f2bb] - CentOS8のcontainerd.io のバージンが古いので RPM で直接入れる # dnf install container-selinux # wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm # rpm -ih containerd.io-1.2.6-3.3.el7.x86_64.rpm - containerd.io が runc と競合する場合は - runc は containerd.io と被る(同等?)の様 # rpm -e buildah # rpm -e cockpit-podman # rpm -e toolbox # rpm -e podman # rpm -e containers-common-1-2.module_el8.5.0+890+6b136101.noarch (必要なら) # rpm -e runc # rpm -ihv containerd.io-1.2.6-3.3.el7.x86_64.rpm - Install & Getting Start へ **** 2023 1/17 CentOS8 の update で Docker が動かなくなったので上記の方法で入れ直し.(containerd.io が runc と競合する場合) [#hee294de] **** もし podman が必要なら containerd.io をインストール後に,入れ直す. [#y6d1a036] # yum install podman -y # yum install toolbox -y # yum install cockpit-podman -y # yum install buildah -y **** 本体の Install & Getting Start [#nae22c6e] # 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 *** CentOS6 [#za65a6da] - yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm -- chkconfig --level 3 docker on - 注)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 [#fedb2239] *** 使ってみる [#fbf5e0d3] **** Hello World [#u91eb055] # docker run hello-world **** CentOSを使ってみる [#e8e57f9e] # docker pull centos # docker images # docker run -i -t centos /bin/bash (DockerBash)# **** CentOSを使ってみる2 [#m1ae3f38] # docker pull centos:centos7 # docker run -ti -d --name centos7 centos:centos7 # docker exec -it centos7 /bin/bash [root@fbd5aeb4046a /]# ** [[Local Registry>./Registry]] [#jc169974] ** コマンド [#f867895b] *** 操作 [#p0316f54] **** コンテナ [#o6820680] - コンテナ状況確認 -- docker ps - コンテナ状況確認(過去の終了したものも含む) -- docker ps -a - コンテナから抜ける -- Ctrl+p, Ctrl+q - コンテナへの接続を再開する -- docker attach コンテナID(またはコンテナ名) --- コンテナ内でシェルが動いていないとダメ.exit で抜けるとコンテナが停止する. -- docker exec -it コンテナID(またはコンテナ名) bash --- コンテナでPID=1のプロセスを実行する. exit で抜けてもコンテナは停止しない. - コンテナの削除 -- docker rm コンテナID(またはコンテナ名) - コンテナを止める -- docker stop コンテナID(またはコンテナ名) - 止まっているコンテナを動かす -- docker start コンテナID(またはコンテナ名) - コンテナのログを表示 -- docker logs コンテナID(またはコンテナ名) **** ボリューム(永続ストレージ) [#r22a6562] - ボリューム一覧 -- docker volume ls - ボリュームの削除 -- docker volume rm ボリューム名 -- 強制削除には --force を使用する **** イメージ [#a7c2bb26] - イメージ一覧 -- docker images - ダウンロード または 更新 -- docker pull イメージ名(:TAG) - イメージ削除 -- docker rmi イメージ名 - イメージ名の変更(A->B タグの付け替え) -- # docker tag A B -- # docker rmi A - イメージを保存 -- docker stop コンテナ名 -- docker commit イメージ名 **** 退避と復元 [#y5f89442] - ファイルシステムの書き出し -- 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 **** 使用していない(孤立した)リソースの削除 [#z50def7b] - システム: docker system prune - イメージ: docker image prune - コンテナ: docker container prune --filter "until=24h" - ボリューム: docker volume prune --filter "label!=keep" ** Tips [#bc9ce347] *** Health check - https://docs.docker.com/reference/dockerfile/#healthcheck - https://knowledge.sakura.ad.jp/6754/ **** Podman - /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)共有 [#u078f1a8] - 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 タグのイメージの名前(表示)を消す. [#e82b979d] - 同じ名前のタグ付きイメージ名を作成し,それを消す. docker tag 7fe93d9d7854 jupyterhub/singleuser:del (jupyterhub/singleuser:<none> の場合) docker rmi jupyterhub/singleuser:del - 名前も none の場合は,docker tag で指定する名前は何でもよい. *** 現在の環境が Docker のコンテナなのかを確認する. [#gd6a458a] - '' /.dockerenv'' の存在をチェックする. *** cockpit-docker [#wae1c7a6] - https://pkgs.org/download/cockpit-docker - CentOS8 用は無いが,CentOS7用が使える(要 Python2) *** Tools [#pecf29e0] **** Networkの初期化スクリプト [#pc3401bc] #!/bin/sh rm -r /var/lib/docker/network/files/* systemctl restart docker *** Dockerデーモン(dockerd) のリモート操作 [#zb6259d4] **** 最善策 [#bd380800] - リモートとローカルの 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>./docker_rsock.sh]] ***** ''ボツ'' %%SSH ポートフォワードを使用する.%% [#h0ef173d] - 202.26.150.55で動いている場合 # ssh -fNL localhost:9099:/var/run/docker.sock root@202.26.150.55 (rootログインがセキュリティ的に弱い) # export DOCKER_HOST=localhost:9099 # docker volume ls - %%Docker の実効ユーザを root 以外にしておく.%% ムリポ. Rootlessモードは何か違う. - ローカルマシンでは,Dockerデーモンは不要.クライアントのみで可. - ログイン相手を docker グループのユーザにする. -- でもローカルポートにアクセス可能なら,結局''やばい状況になる''..ネ. ***** ''ボツ'' %%docker の通信機能を使用する%% [#g41b437e] - /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が引けない (その他のサービスも同様) [#h55e8064] - ホストの firewall の影響 - ホストのfirewalld を止めてからイメージを実行 -- ホストの firewall の条件を調べること - Docker イメージが動いている最中に止めて駄目,=> Dockerを再起動 *** /etc/resolv.conf [#vce388d5] - Docker 内の /etc/resolv.conf は特殊なファイルなので mv できない. ** Jupyter [#u471de3a] *** Docker Images [#uf21b4ef] **** jupyterhub/singleuser [#k5b135c9] - https://hub.docker.com/r/jupyterhub/singleuser/ **** jupyter/datascience-notebook [#rabcf16e] - https://hub.docker.com/r/jupyter/datascience-notebook/ **** jupyter/tensorflow-notebook [#h63a2e3c] - https://hub.docker.com/r/jupyter/tensorflow-notebook/ **** rattydave/jupyterhub [#p536b876] - C++, Java, Python, Tensorflow, Julia, SQL, NodeJS, Bash and more - https://hub.docker.com/r/rattydave/jupyterhub - 重い(10G).非力マシンではタイムアウト(30s)する. **** joequant/bitstation:latest [#m40761fc] - C++ - https://hub.docker.com/r/joequant/bitstation/tags?page=1&ordering=last_updated - これもタイムアウト *** jupyterhub/singleuser [#k62bfe82] /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)まで保存する. [#v7d65576] - 次回起動すると,オプションが 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 も元に戻しておく *** Trouble [#k8d6e393] **** Jupyter で色々やっていたらコンテナが続々と自動生成->消滅 を繰り返している [#x94b45ca] - 何をどうやってもコマンドレベルでは停止しない # systemctl stop docker # mv /var/lib/docker /var/lib/docker- # reboot - Docker Swarm のせいかも.Swarm から強制離脱すればよかった模様 # docker swarm leave --force ** Trouble Shooting [#gfc999c1] *** Dockerfile **** conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) - libarchive と libmamba を同じチャンネルからインストールする $CONDA_HOME/bin/conda install --prefix $CONDA_HOME -c main libarchive --force-reinstall -y $CONDA_HOME/bin/conda install --prefix $CONDA_HOME -c main libmamba --force-reinstall -y *** 良く分かっていなかった頃のエラーなので,勘違いしているかもしれない [#te98f8c5] **** docker run実行時のiptablesエラー [#y95fbc1b] - ネットワーク設定を削除し,docker を再起動する # \rm -r /var/lib/docker/network/files/* # systemctl restart docker **** Dockerfile による RUNで,pipがNewConnectionError を出す. [#y7ea0619] - CentOS8 固有のエラーらしい.CentOS8 は Docker 未サポートだからな~ -- Docker は iptables を操作するが,CentOS8では iptables ではなくて nftablesを利用しているのが原因のよう. -- Docker の iptables のコマンドが一部失敗している. -- https://qiita.com/DaichiSasak1/items/11687a3c613c8811350c - 一つの解決法として Proxy サーバを立てると良いみたい # yum install squid -y # systemctl enable squid # systemctl start squid # firewall-cmd --add-port 3128/tcp --permanent # filewall-cmd --reload # vi Dockerfile (pip にオプション --proxy=IPアドレス:3128 を追加) - Dockerfile 内の名前解決については以下のRUNコマンドで確認可能 -- python -c "import socket; print(socket.gethostbyname('security.ubuntu.com'))" #br