「インストール - Docker CE」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の33版が非表示)
24行目: 24行目:
https://download.docker.com/linux/static/stable/x86_64/<br>
https://download.docker.com/linux/static/stable/x86_64/<br>
(stable以外のedgeやtestは好みで選択する)<br>
(stable以外のedgeやtestは好みで選択する)<br>
  wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz
  wget https://download.docker.com/linux/static/stable/x86_64/docker-&#x3C;バージョン&#x3E;.tgz
  tar zxvf docker-18.06.3-ce.tgz
  tar xf docker-<バージョン>.tgz
  sudo cp docker/* /usr/local/bin
  sudo cp docker-<バージョン>/* /usr/local/bin
<br>
<br>
正常にインストールできたか確認する。<br>
正常にインストールできたか確認する。<br>
52行目: 52行目:
ただし、リポジトリに含まれるDocker CEの更新が遅い場合があるので注意すること。<br>
ただし、リポジトリに含まれるDocker CEの更新が遅い場合があるので注意すること。<br>
<br>
<br>
===== CentOSの場合 =====
===== RHELの場合 =====
まず、Docker CEをインストールするために、依存関係のライブラリをインストールする。<br>
まず、Docker CEをインストールするために、依存関係のライブラリをインストールする。<br>
  sudo yum install yum-utils device-mapper-persistent-data lvm2
  sudo dnf install yum-utils device-mapper-persistent-data lvm2
<br>
<br>
続いて、Docker CEをインストールする。<br>
続いて、Docker CEをインストールする。<br>
  sudo yum install docker-ce
  sudo dnf install docker-ce
<br>
<br>
<u>'''※注意'''</u><br>
<u>※注意</u><br>
<u>'''Docker CEの最新バージョンを使用する場合は、標準設定では無効になっているリポジトリを有効にする必要がある。'''</u><br>
<u>Docker CEの最新バージョンを使用する場合は、標準設定では無効になっているリポジトリを有効にする必要がある。</u><br>
  sudo yum-config-manager --enable docker-ce-edge
  sudo yum-config-manager --enable docker-ce-edge
  sudo yum-config-manager --enable docker-ce-test
  sudo yum-config-manager --enable docker-ce-test
81行目: 81行目:
ファイル作成後、リポジトリの更新とdockerのインストールを行う。<br>
ファイル作成後、リポジトリの更新とdockerのインストールを行う。<br>
  sudo zypper --gpg-auto-import-keys refresh
  sudo zypper --gpg-auto-import-keys refresh
  sudo zypper install docker docker-compose
  sudo zypper install docker docker-compose yast2-docker
<br>
<br>
または、SLEの場合は、以下の手順を行うこともできる。<br>
または、SLEの場合は、以下の手順を行うこともできる。<br>
92行目: 92行目:
#: または
#: または
#: <code>sudo SUSEConnect -p sle-module-containers/15/x86_64 ''</code>
#: <code>sudo SUSEConnect -p sle-module-containers/15/x86_64 ''</code>
<br><br>
== Docker Rootlessのインストール ==
==== Docker Rootless (ルートレスモード) とは ====
Docker Rootless (ルートレスモード)は、非スーパーユーザとしてDockerデーモンを実行することができる。<br>
ルートレスモードでは、一般ユーザとしてDockerデーモンとコンテナを実行して、デーモンとコンテナランタイムの潜在的な脆弱性を軽減することができる。<br>
<br>
ルートレスモードは、前提条件さえ満たしていれば、Dockerデーモンのインストール中であってもroot権限を必要としない。<br>
<br>
Docker-Rootlessの詳細を知りたい場合は、[https://docs.docker.com/engine/security/rootless/ Docker-Rootlessの公式ドキュメント]を参照すること。<br>
<br>
==== どのように動作するか ====
ルートレスモードは、Dockerデーモンとコンテナをユーザネーム空間内で実行する。<br>
これは、userns-remapモードとよく似ているが、<br>
userns-remapモードではデーモン自体がスーパーユーザ権限で実行されるのに対して、ルートレスモードではデーモンとコンテナの両方が一般ユーザ権限として実行される。<br>
<br>
ルートレスモードでは、SETUIDビットやファイル機能を持つバイナリを使用しない。<br>
ただし、newuidmapとnewgidmapは、ユーザ名前空間で複数のUID/GIDを使用できるようにするために必要である。<br>
<br>
==== 前提条件 ====
ホストにnewuidmapとnewgidmapをインストールする必要がある。<br>
これらのコマンドは、ほぼ全てのLinuxディストリビューションのuidmapパッケージで提供されている。<br>
<br>
/etc/subuidおよび/etc/subgidには、ユーザの下位UID / GIDが少なくとも65536個含まれていなければならない。<br>
# 実行ユーザIDの確認
id -u
# 実行ユーザ名の確認
whoami
# 実行ユーザのSubUIDの確認
grep ^$(whoami): /etc/subuid
# 実行ユーザのSubGIDの確認
grep ^$(whoami): /etc/subgid
<br>
また、fuse-overlayfsパッケージのインストールを推奨する。<br>
# RHEL
sudo dnf install fuse-overlayfs iptables
# SUSE
sudo zypper install fuse-overlayfs
sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter
<br>
==== 制限事項 ====
* 以下のストレージドライバのみがサポートされている。
*: overlay2 (Linuxカーネル 5.11以降)
*: fuse-overlayfs (Linuxカーネル 4.18以降、かつ、fuse-overlayfsがインストールされている場合のみ)
*: btrfs (Linuxカーネル4.18以降で動作している、または、~/.local/share/dockerがuser_subvol_rm_allowedマウントオプションでマウントされている場合のみ)
*: vfs
*: <br>
* Cgroupは、cgroup v2とsystemdで実行している場合のみサポートされる。
*: <br>
* 以下の機能はサポートされない。
*: AppArmor
*: チェックポイント
*: オーバーレイネットワーク
*: SCTPポートの公開
*: <br>
* <code>ping</code>コマンドを使用する場合は、pingパケットのルーティングを参照すること。
* 特権TCP / UDPポート (1024番以下のポート) を公開する場合は、特権ポートの公開を参照すること。
* <code>docker inspect</code>コマンドで表示されるIPアドレスは、RootlessKitのネットワーク名前空間内に名前空間が存在する。<br>これは、IPアドレスがネットワーク名前空間にnsenterせずにホストから到達できないことを意味する。
* ホストのネットワーク (<code>docker run --net=<ホスト名></code>) も、RootlessKitの名前空間内に存在する。
* Dockerの"data-root"としてのNFSマウントはサポートされない。<br>この制限は、ルートレスモード特有のものではない。
<br>
==== Docker Rootlessのインストール ====
===== パッケージ管理システムからインストール =====
# SUSE
sudo zypper install docker-rootless-extras
<br>
===== バイナリファイルをダウンロードしてインストール =====
まず、[https://download.docker.com/linux/static/stable/x86_64/ Docker Rootlessの公式Webサイト]にアクセスして、Docker-Rootlessの実行バイナリをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf docker-rootless-extras-<バージョン>.tgz
mv docker-rootless-extras-<バージョン> <任意のインストールディレクトリ>
<br>
次に、[https://download.docker.com/linux/static/stable/x86_64/ Dockerの公式Webサイト]にアクセスして、Dockerの実行バイナリをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf docker-<バージョン>.tgz
mv docker-<バージョン>/* <Docker-Rootlessが存在するディレクトリ>
<br>
最後に、<u>~/.profileファイル等に、環境変数<code>PATH</code>を追記する。</u><br>
vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export PATH="<Docker-Rootlessのインストールディレクトリ>:$PATH"
</syntaxhighlight>
<br>
==== Docker Rootlessの初期設定 ====
まず、一般ユーザとして、Docker Rootlessデーモンを設定する。<br>
dockerd-rootless-setuptool.sh install
<br>
次に、~/.profileファイル等に、環境変数<code>PATH</code>および<code>DOCKER_HOST</code>を追記する。<br>
<syntaxhighlight lang="bash">
# ~/.profileファイル
export PATH=<Docker Rootlessのインストールディレクトリ>:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
</syntaxhighlight>
<br>
==== Docker Rootlessのアンインストール ====
まず、Dockerデーモンのsystemdサービスを削除する場合、以下に示すコマンドを実行する。<br>
dockerd-rootless-setuptool.sh uninstall
<br>
次に、~/.bashrcファイル内の環境変数<code>PATH</code>と<code>DOCKER_HOST</code>が追記されている場合は、設定を削除する。<br>
<br>
Docker Rootlessのデータディレクトリを削除する場合は、以下に示すコマンドを実行する。<br>
rootlesskit rm -rf ~/.local/share/docker
<br>
もし、パッケージ管理システムからdocker-ce-rootless-extrasパッケージをインストールしている場合は削除する。<br>
sudo zypper remove docker-ce-rootless-extras
<br>
最後に、Docker Rootlessの実行バイナリを削除する。<br>
cd ~/bin
rm -f containerd containerd-shim containerd-shim-runc-v2 ctr \
      docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh \
      rootlesskit rootlesskit-docker-proxy runc vpnkit
<br>
==== Docker Rootlessの実行 ====
Systemdサービスユニットは、~/.config/systemd/user/docker.serviceとしてインストールされる。<br>
<br>
Docker Rootlessを起動する。<br>
systemctl --user start docker
<br>
システム起動時にDocker Rootlessデーモンを起動する場合は、Systemdサービスユニットとlingeringを有効にする。<br>
systemctl --user enable docker
sudo loginctl enable-linger $(whoami)
<br>
<u>※注意</u><br>
<u>Docker Rootlessをシステム全体(/etc/systemd/system/docker.service)として起動することは、User=ディレクティブを使用してもサポートされていないことに注意する。</u><br>
<br>
クライアントにおいて、ソケットパス、または、CLIコンテキストのいずれかを明示的に指定する必要がある。<br>
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
docker run -d -p 8080:80 nginx
<br>
クライアントにおいて、CLIコンテキストを指定する。<br>
docker context use rootless
docker run -d -p 8080:80 nginx
<br>
==== 特権ポートの公開 ====
ホスト側において、特権ポート (1024番ポート未満) を公開する場合、 Docker Rootless実行バイナリに対して<code>CAP_NET_BIND_SERVICE</code>を設定する。<br>
sudo setcap cap_net_bind_service=ep <Docker Rootless実行バイナリ>
<br>
/etc/sysctl.confファイル、または、/etc/sysctl.dディレクトリ内のファイルにおいて、非特権ポートの開始ポート番号を指定する。<br>
この設定を行うことにより、システム上で使用可能な非特権ポートの範囲を制御できる。<br>
また、ポート番号を上げることにより、特定のセキュリティポリシーに従い、一般ユーザーが使用できるポートの範囲を制限することができる。<br>
# 非特権ポートの開始ポート番号は0番ポート以降となる
# つまり、全てのポートが非特権ポートとなる
net.ipv4.ip_unprivileged_port_start=0
<br>
設定を反映する。<br>
sudo sysctl -p  または  sudo sysctl --system
<br>
==== 注意 ====
===== DockerとDocker Rootlessの共存 =====
システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。<br>
sudo systemctl stop    docker.service docker.socket
sudo systemctl disable docker.service docker.socket
<br>
===== ディレクトリパス =====
Docker Rootlessソケットのパスは、$XDG_RUNTIME_DIR/docker.sockに設定されている。<br>
(環境変数<code>XDG_RUNTIME_DIR</code>は、通常、/run/user/$UIDディレクトリに設定されている)<br>
<br>
データディレクトリは、~/.local/share/dockerに設定されている。<br>
また、データディレクトリはNFS上であってはならない。<br>
<br>
デーモン設定ディレクトリは、~/.config/dockerディレクトリに設定されている。<br>
このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。<br>
<br>
===== Docker RootlessとPodmanの共存 =====
Docker Rootlessのコマンドを実行する前に、環境変数<code>DOCKER_HOST</code>を設定する。<br>
# Docker Rootlessのソケットパスは、$XDG_RUNTIME_DIR/docker.sockである
export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/docker.sock"
# Dockerコマンドの実行
docker ...略
<br>
==== Docker Compose ====
===== Docker Composeとは =====
Docker Composeとは、複数のコンテナを定義し実行するDockerアプリケーションのためのツールである。<br>
YAMLファイルを使用してDockerコンテナの起動やコンテナ起動時の設定等を行うことができる。<br>
<br>
Docker Composeのメリットを以下に示す。<br>
* 複数のDockerfileを同時に起動することができる。
* 実行コマンドによる環境の違いを気にせずに済む。(ポートやバージョン等)
* ブリッジネットワークが自動で生成されるため、コンテナ同士の通信が可能となる。
* インフラ構成の可視化やバージョン管理が完結する。
<br>
===== Docker Composeのインストール =====
[https://github.com/docker/compose Docker ComposeのGithub]にアクセスして、Docker Composeの実行バイナリをダウンロードする。<br>
ダウンロードしたファイルに実行権限を付与する。<br>
chmod u+x docker-compose-linux-<アーキテクチャ名>
<br>
Docker CompposeをDocker Rootlessのインストールディレクトリに配置する。<br>
mv docker-compose-linux-<アーキテクチャ名> docker-compose
mv docker-compose <Docker Rootlessのインストールディレクトリ>
<br>
~/.profileファイル等に環境変数<code>PATH</code>を追記する。<br>
vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export PATH="<Docker Composeのインストールディレクトリ>:$PATH"
</syntaxhighlight>
<br>
Docker Composeのインストールが正常に完了しているかどうかを確認する。<br>
docker-compose version
<br>
.ymlファイルに対して<code>docker-compose up -d</code>コマンドを実行する時、以下に示すようなエラーは出力される場合がある<br>
これは、Docker Composeがdocker.sockファイルを見つけられない場合に発生する。<br>
WARNING:root:could not open file '/etc/apt/sources.list.d/mongodb-org-5.0.list'
<br>
この時、~/.profileファイル等に環境変数<code>DOCKER_HOST</code>を設定する必要がある。<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export DOCKER_HOST="unix:///run/user/$UID/docker.sock"
</syntaxhighlight>
<br>
<br><br>
== Dockerのアンインストール ==
Dockerエンジン、Docker CLI、Containerdをアンインストールする。<br>
sudo zypper remove docker-ce docker-ce-cli containerd.io
<br>
Dockerイメージ、Dockerコンテナ、ボリューム、Dockerの設定ファイルを削除する。(自動的に削除されない)<br>
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
<br><br>
<br><br>


136行目: 375行目:


== 設定 ==
== 設定 ==
~/.profileファイルまたは~/.bashrcファイル等に、以下の設定を追記する。<br>
==== 接続方法の設定 ====
vi ~/.profile
変数<code>DOCKER_HOST</code>は、DockerクライアントにDockerデーモンへの接続方法を指示するためのものである。<br>
変数<code>DOCKER_HOST</code>を設定する場合、<code>docker</code>コマンドを実行するたびに、ローカルホスト上のソケットではなくHTTP APIを使用する。<br>
未設定の場合は、HTTP APIは無効となる。<br>
<br>
例えば、変数<code>DOCKER_HOST</code>を<code>tcp://localhost:2375</code>に設定する時、ローカルホスト上のHTTP APIを監視できるが、<br>
通常は、<code>tcp://0.0.0.0:2375</code>と設定して、リモートサーバ上のAPIを監視する。(この時、ファイアウォールを適切に設定すること)<br>
<br>
<br>
export DOCKER_HOST='tcp://localhost:2375'
* 方法 1
*# ~/.profileファイル等に、変数<code>DOCKER_HOST</code>の設定を追記する。<br>
*#: <code>vi ~/.profile</code>
*#: <br>
*#: <code>export DOCKER_HOST='tcp://localhost:2375'</code>
*: <br>
* 方法 2
*# Dockerデーモンの設定ファイルをバックアップする。
*#: <code>sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service</code>
*#: <br>
*# Dockerデーモンの設定ファイルにある<code>execstart</code>項目を、以下のように編集する。
*#: <code>sudo vi /usr/lib/systemd/system/docker.service</code>
*#: <br>
*#: # 編集前
*#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS</code>
*#: <br>
*#: # 編集後
*#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS <span style="color:#C00000;">-H fd:// -H tcp://localhost:2375</span></code>
*#: <br>
*# Dockerデーモンの設定を有効化する。
*#: <code>sudo systemctl daemon-reload</code>
<br>
<br>
Dockerのイメージおよびコンテナの保存先は、/var/lib/dockerディレクトリに保存される。<br>
==== Dockerイメージおよびコンテナの保存先 ====
Dockerのイメージおよびコンテナの保存先は、初期設定では、/var/lib/dockerディレクトリに保存される。<br>
もし、保存先を変更する場合は、以下の手順を実施する。<br>
もし、保存先を変更する場合は、以下の手順を実施する。<br>
# Dockerデーモンの設定ファイルをバックアップする。
* /etc/docker/daemon.jsonファイルが存在する場合
#: <code>sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service</code>
*# /etc/docker/daemon.jsonファイルに、<code>data-root</code>パラメータを追加する。<br>詳細は、https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file を参照すること。
#: <br>
*#: <code>sudo vi /etc/docker/daemon.json</code>
# Dockerデーモンの設定ファイルにある<code>execstart</code>項目を、以下のように編集する。
*#: <br>
#: <code>sudo vi /usr/lib/systemd/system/docker.service</code>
*#: <code>/etc/docker/daemon.jsonファイル</code>
#: <br>
*#: <code>{</code>
#: # 編集前
*#: <code>  # ...略</code>
#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS</code>
*#: <code>  "data-root": "<Dockerイメージおよびコンテナの保存先のフルパス>",</code>
#: <br>
*#: <code>  # ...略</code>
#: # 編集後
*#: <code>}</code>
#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS <span style="color:#C00000;">-g <Dockerの保存先のフルパス></span></code>
*: <br>
#: <br>
* /etc/docker/daemon.jsonファイルが存在しない場合
# Dockerデーモンの設定を有効にして起動する。
*# Dockerデーモンの設定ファイルをバックアップする。
#: <code>sudo systemctl daemon-reload</code>
*#: <code>sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service</code>
#: <code>sudo systemctl start docker</code>
*#: <br>
<br><br>
*# Dockerデーモンの設定ファイルにある<code>execstart</code>項目を、以下のように編集する。
 
*#: <code>sudo vi /usr/lib/systemd/system/docker.service</code>
== Dockerコマンド ==
*#: <br>
==== Dockerイメージの検索 ====
*#: # 編集前
[https://hub.docker.com/ Docker Hub]からイメージを検索およびダウンロードすることもできる。<br>
*#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS</code>
sudo docker search <イメージ名>
*#: <br>
<br>
*#: # 編集後
==== Dockerイメージのダウンロード ====
*#: <code>ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS <span style="color:#C00000;">-g <Dockerの保存先のフルパス></span></code>
sudo docker pull <イメージ名>
*#: <br>
<br>
*# Dockerデーモンの設定を有効化する。
==== Dockerイメージの一覧表示 ====
*#: <code>sudo systemctl daemon-reload</code>
sudo docker image ls
または
sudo docker image ls -a  または  sudo docker image ls --all
<br>
==== Dockerイメージの削除 ====
<イメージ名>は上述の"イメージの一覧表示"で確認できる。<br>
<code>-f</code>オプションを付加することにより、使用中のイメージおよびコンテナであっても削除することができる。<br>
sudo docker rmi -f <イメージ名>
<br>
==== Dockerイメージの実行 ====
<イメージ名>はイメージの名前であり、<COMMAND>はDockerコンテナ上で実行するコマンドである。<br>
sudo docker run <イメージ名> <COMMAND>
<br>
実行コマンドが、/bin/bashのような対話型(インタラクティブ)なコマンドの場合は、<code>-it</code>オプションを指定する。<br>
<code>-i</code>オプションはコンテナの標準入力を有効化、<code>-t</code>オプションはttyを有効化するためのオプションである。<br>
sudo docker run –it <イメージ名> /bin/bash
<br>
detachedモード(バックグラウンドモード)で実行する場合は、<code>–d</code>オプションを指定する。<br>
sudo docker run -d dockersamples/static-site
<br>
==== 実行中のDockerコンテナの一覧表示 ====
sudo docker ps
または
sudo docker container ls
<br>
==== 全てのDockerコンテナの一覧表示 ====
sudo docker ps -a
または
sudo docker ps --all
または
sudo docker container ls –a
または
sudo docker container ls –-all
<br>
==== Dockerコンテナの削除 ====
<CONTAINER ID>を指定する。<br>
<CONTAINER ID>は上述の"コンテナの一覧表示"で確認できる。<br>
sudo docker rm <CONTAINER ID>
または
sudo docker countainer rm <CONTAINER ID>
<br>
==== Dockerコンテナの停止 ====
sudo docker stop <CONTAINER ID>
sudo docker container stop <CONTAINER ID>
<br>
コンテナの停止と削除を同時に実施する。<br>
sudo docker rm –f <CONTAINER ID>
sudo docker container rm -f <CONTAINER ID>
<br>
==== Dockerコンテナに任意の名前を付ける ====
これは、<CONTAINER ID>の代わりに指定できる。<br>
sudo docker run --name <任意のコンテナ名> <イメージ名>
<br>
==== ポートマッピング ====
<code>run</code>コマンドにおいて、<code>-P</code>オプションを指定すると、コンテナが使うポートがランダムにホストのポートにマッピングされる。<br>
また、<code>-d</code>オプションを指定すると、コンテナIDを表示して、バックグラウンドでコンテナを実行される。<br>
sudo docker run -d -P <イメージ名>
<br>
<code>-p</code>オプションを使用すると、コンテナのポートをマッピングするホストのポートを指定できる。<br>
以下の例では、ホストPCの12345番ポートをコンテナの80番ポートにマッピングしている。<br>
sudo docker run -it –p 12345:80 <イメージ名> /bin/bash
<br>
どのポートにマッピングされたかは、<code>sudo docker ps</code>コマンドまたは<code>sudo docker port <CONTAINER ID></code>で確認できる。<br>
sudo docker port <CONTAINER ID>
# 出力例
443/tcp -> 0.0.0.0:32770
80/tcp -> 0.0.0.0:32771
<br>
==== DockerコンテナからDockerイメージを作成する ====
まず、Dockerコンテナを停止する。<br>
sudo docker container stop <CONTAINER IDまたはコンテナ名>
<br>
次に、停止したDockerコンテナからDockerイメージを作成する。<br>
sudo docker commit <CONTAINER IDまたはコンテナ名> <イメージのリポジトリ名>:<イメージのタグ名>
<br>
作成したDcockerイメージを確認する。<br>
sudo docker images
<br>
作成したDockerイメージからDockerコンテナを作成する。<br>
sudo docker run -it --name <CONTAINER IDまたはコンテナ名> <イメージのリポジトリ名>:<イメージのタグ名> /bin/bash
<br>
==== Dokerイメージのエクスポートおよびインポート ====
まず、Dockerコンテナを停止する。<br>
sudo docker container stop <Dockerコンテナ名またはDockerコンテナのID名>
# または
sudo docker stop <Dockerコンテナ名またはDockerコンテナのID名>
<br>
必要であれば、Dockerコンテナでの変更をDockerイメージに反映する。<br>
sudo docker commit <Dockerコンテナ名またはDockerコンテナのID名> <イメージのリポジトリ名>:<イメージのタグ名>
<br>
Dockerイメージに付随するレイヤの情報(メタ情報)等を含めたイメージを保存する。<br>
sudo docker save <オプション> <イメージ名> > <保存するファイル名>
# または
sudo docker save <オプション> <イメージ名> -o <保存するファイル名>
# 例. Dockerイメージのsample-imageをsample-image.tarとして保存する
sudo docker save sample-image > sample-image.tar
<br>
エクスポートしたDockerイメージファイルをインポートする場合は、<code>load</code>コマンドを使用する。<br>
sudo docker load < <エクスポートしたDockerのファイル名>
# 例. エクスポートしたファイルであるsample-image.tarファイルをインポートする
sudo docker load < sample-image.tar
<br>
==== Dokerコンテナのエクスポートおよびインポート ====
まず、Dockerコンテナを停止する。<br>
sudo docker container stop <コンテナ名またはコンテナID>
# または
sudo docker stop <コンテナ名またはコンテナID>
<br>
必要であれば、Dockerコンテナでの変更をDockerイメージに反映する。<br>
sudo docker commit <Dockerコンテナ名またはDockerコンテナのID名> <イメージのリポジトリ名>:<イメージのタグ名>
<br>
コンテナのメタ情報等は保存されず、ファイルシステムのコピーがそのまま保存される。<br>
sudo docker export <オプション> <コンテナ名またはコンテナID> > <保存するファイル名>
# 例. Dockerコンテナのsample-containerをsample-container.tarとして保存する
sudo docker export sample-container > sample-container.tar
<br>
エクスポートしたDockerコンテナファイルをインポートする場合は、<code>import</code>コマンドを使用する。<br>
sudo docker import <エクスポートしたコンテナファイル名> - <リポジトリ名>:<タグ名>
# 例. エクスポートしたsample-container.tarファイルをインポートする
cat sample-container.tar | sudo docker import - sample-container:latest
<br><br>
<br><br>


346行目: 486行目:
<br><br>
<br><br>


== Dockerfileの基礎 ==
== Docker Compose ==
==== Dockerfileの概要 ====
==== Docker Hubの登録 ====
Dockerfileは、Dockerイメージの設計図のようなものである。
# [https://hub.docker.com/ Docker Hub]にアクセスして、新規登録またはサインインする。<br>
Dockerfileを作成することにより、任意のDockerイメージを作成できる。
# サインイン後、右上にあるアバターを選択して、[My Account]を選択する。
<br>
# [Security]タブを選択して、[New Access Token]を選択する。
DockerfileからDockerイメージを作成するには、Dockerfileが存在するディレクトリで以下のコマンドを実行する。<br>
# 任意のトークンの説明を入力する。<br>これは、トークンのユースケースまたは目的を示すものを入力する。
docker build -t <イメージ名>:<タグ名> -f <Dockerfile名> .
# アクセス権限を設定する。<br><br>アクセス権限は、リポジトリに制限を設定するスコープである。<br>例えば、読み取りおよび書き込み権限の場合、自動化パイプラインでイメージを構築して、それをリポジトリにプッシュできる。<br><u>ただし、リポジトリを削除することはできない。</u>
# または
# [Generate]を選択して、画面に表示されるトークンをコピーして保存する。<br>この画面を閉じた後は、トークンを取得できなくなることに注意する。
docker build . # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる
<br>
Dockerfileで使用するコマンドを、以下に示す。<br>
* FROM
* RUN
* CMD
* ENTRYPOINT
* COPY
* ADD
* ENV
* WORKDIR
<br>
 
==== Dockerfileの作成手順 ====
* FROM
*: ベースとなるイメージを決定するコマンドである。
*: Dockerfileの先頭に記述する。
*: FROMの後には、基本的にOSを記述する。
<br>
例1. FROM centos7:latest
例2. FROM ruby:2.5
<br>
* RUN
*: FROMで記述したOSに対応するコマンドを実行するコマンドである。
*: RUNごとにLayerが作成される。(Dockerイメージは、レイヤーを積み重ねていくように作成される)
*: <br>
*: 以下の例では、Dockerイメージには、centos7のレイヤーにtouch /usr/bin/testのレイヤーが追加作成される。<br>
*: (/usr/bin/testファイルを作成するDockerイメージを作成している)<br>
例. FROM centos7:latest
    RUN ["touch", "/usr/bin/test"]
:: <br>
:: 以下の例では、Dockerイメージには、centos7のレイヤーにcurlとnginxという2つのパッケージをインストールするレイヤーが追加作成される。<br>
:: (yum updateはインストールするパッケージを新しいものにするために記述して、yum install -yはパッケージをインストールするために記述している)<br>
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx
:: <br>
:: DockerfileからDockerイメージを1度作成したものはキャッシュされるため、RUNを複数記述することにより、ビルドの時間を短くすることができる。<br>
:: ただし、レイヤー数は少ない方が望ましいため、&&や\を使用して、RUNの記述を少なくする。<br>
<br>
* CMD
*: コンテナの実行コマンドを指定するコマンドである。
*: Dockerfileの最後に記述する。
*: <br>
*: 以下の例では、DockerfileからDockerイメージを作成、docker runコマンドによりコンテナを作成した後、/bin/bashを実行している。<br>
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx
    CMD ["/bin/bash"]
<br>
* ENTRYPOINT
*: CMDに近い役割を持つコマンドである。
*: CMDは、Dockerコンテナを作成・実行する時(docker runコマンド)、コマンドを上書きできるが、
*: (例. docker run lsコマンドを実行する場合、上記のCMDの例ではbashではなく、lsが実行される)
*: ENTRYPOINTを使用する場合、コマンドは上書きできなくなり、CMDはENTRYPOINTのオプションを記述する形となる。
*: <br>
*: 以下の例では、<code>ENTRYPOINT</code>に<code>ls</code>コマンドを記述することにより、コンテナ実行時(<code>docker run</code>コマンド)に、<code>ls</code>以外のコマンドが実行できなくなる。<br>
*: なお、<code>CMD</code>では、<code>--help</code>オプションを指定している。<br>
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx
    ENTRYPOINT ["ls"]
    CMD ["--help"]
<br>
* COPY
*: Dockerfileが存在するディレクトリ(BuildContextという)にあるファイルを、Dockerイメージにコピーするコマンドである。
*: DockerfileをビルドしてDockerイメージからコンテナを作成した後、コンテナにNewDirディレクトリを作成して、Test.txtファイルをコピーしている。
*: この時、Dockerイメージのレイヤーが追加・作成される。
例. FROM ubuntu:latest
    RUN mkdir /NewDir
    COPY Test.txt /NewDir
    CMD ["/bin/bash"]
<br>
<br>
* ADD
Docker Hubに登録する。<br>
*: COPYのコマンドと似ていて、同じくコピーができるインストラクションです。
docker login -u <Docker Hubのユーザ名>  または  docker login --username <Docker Hubのユーザ名# 直後にパスワードを入力する
*: <br>
*: ADDとCOPYとの違い
*: ADDは圧縮ファイルをコピーした際、コピーと解凍の両方を行います。
*: COPYは単純なコピーのみです。
*: 圧縮ファイルをコピー・解凍する時にはADD、圧縮ファイルが関係ない単純なコピーにはCOPYを使います。
*: <br>
*: 以下の例では、Dockerfileをbuildした際、DockerImageにsample.tarを/(ルート直下)にコピー・解凍するLayerを作成されます。
*: コンテナを作成した際に、コンテナのルート直下にsample.tarが解凍されたものが作成されています。
  例. FROM ubuntu:latest
    ADD sample.tar /
    CMD ["/bin/bash"]
<br>
<br>
* ENV
正常に登録される場合、~/.docker/config.jsonファイルが自動的に生成される。<br>
*: 環境変数を設定するインストラクションです。
*: <br>
*: 以下の例では、コンテナ作成時にkey1=valueという環境変数が設定されるDockerImageが作成されます。
例. FROM ubuntu:latest
    ENV key1 value
    CMD ["/bin/bash"]
<br>
<br>
* WORKDIR
詳細を知りたい場合は、[https://docs.docker.com/security/for-developers/access-tokens/ Dockerの公式Webサイト]を参照すること。<br>
*: インストラクションの実行ディレクトリを変更するインストラクションです。
*: <br>
*: 以下の例では、sample_folderというディレクトリを作り、sample_folder内でsample_fileを作成するLayerとなります。
*: (WORKDIRを使ったことで、コンテナ内に作成した/sample_folderの中でRUNの実行ができます。)
例. FROM ubuntu:latest
    RUN mkdir sample_folder
    WORKDIR /sample_folder
    RUN touch sample_file
<br><br>
<br><br>


462行目: 508行目:
  chmod 755 dockerfile docker-compose.yml
  chmod 755 dockerfile docker-compose.yml
<br>
<br>
==== openSUSEコンテナ ====
==== Systemdエラー ====
openSUSEコンテナをDockerコンテナとして動作する時、以下のようなエラーが出力されてsystemdが起動できない。<br>
openSUSEコンテナをDockerコンテナとして動作する時、以下のようなエラーが出力されてsystemdが起動できない。<br>
  Failed to connect to bus: No such file or directory.
  Failed to connect to bus: No such file or directory.
486行目: 532行目:
   
   
  CMD ["/sbin/init"]
  CMD ["/sbin/init"]
EXPOSE 22
EXPOSE 80
<br>
<br>
次に、作成したdockerfileからDockerイメージを作成する。<br>
次に、作成したdockerfileからDockerイメージを作成する。<br>
  docker build -t suse153i .
  sudo docker build -t <イメージ名>:<タグ名> -f <Dockerfile名> .  # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる
例. sudo docker build -t suse153i .
<br>
<br>
Dockerコンテナを実行する。<br>
Dockerコンテナを実行する。<br>
  sudo docker run -d --name=suse153c --hostname suse153 <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i
  sudo docker run -d --name=<コンテナ名> --hostname <コンテナのホスト名> <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <イメージ名>
例. sudo docker run -d --name=suse153c --hostname suse153 -p 50080:80 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i
# 開始しているコンテナ内にアクセスする場合
sudo docker exec -it <コンテナ名> /bin/bash
例. sudo docker exec -it suse153c /bin/bash
   
   
  sudo docker container start suse153c
# 停止したコンテナを開始する場合
# または
  sudo docker container start <コンテナ名>
  sudo docker exec -it suse153c /bin/bash
  例. sudo docker container start suse153c
<br>
<br>
openSUSEコンテナにおいて、systemctlコマンドが実行できるかどうかを確認するには、以下のコマンドを実行する。<br>
openSUSEコンテナにおいて、systemctlコマンドが実行できるかどうかを確認するには、以下のコマンドを実行する。<br>
  systemctl list-units
  systemctl list-units
<br>
==== Systemdサービスのサポート ====
[https://registry.opensuse.org/cgi-bin/cooverview openSUSEコンテナリポジトリ]で公開されているコンテナイメージは、containers-systemdパッケージがインストールされている。<br>
例えば、Systemdサービスを使用してNginXコンテナを設定して、自動的に起動するためのSystemdサービスファイルとSysconfigファイルが含まれている。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Web]][[カテゴリ:コンテナ]]

2024年8月6日 (火) 12:09時点における最新版

概要

Dockerとは、軽量なコンテナ型のアプリケーション実行環境である。dotCloud社(現Docker社)が開発し、2013年にオープンソースのプロジェクトとして公開された。
ソフトウェアの高速な配布・実行、容易なイメージのカスタマイズ、導入運用の手軽さ、豊富なプレビルドイメージの提供などの理由により、当初はソフトウェアの開発やテスト段階における利用が多かったが、
現在ではパブリッククラウドからオンプレミスシステムまで、さまざまなシーンで急速に普及しつつある。

コンテナは、Linuxの通常のプロセスとほぼ同じものであるが、利用できる名前空間やリソースが他のプロセスやコンテナからは隔離され、それぞれ固有の設定を持てるようになっている。
そのため、コンテナ内のアプリケーションから見ると、独立したコンピュータ上で動作しているように振る舞う。
コンテナを管理するコストは、プロセスを管理するコストとほぼ変わらず、仮想マシンを管理するコストと比較すると非常に軽い。

  • 名前空間の隔離機能
    ファイルシステムやコンピュータ名、ユーザー名(ユーザーID)、グループ名(グループID)、プロセスID、ネットワーク機能などを、コンテナごとに独自に設定できるようにする機能。
  • リソースの隔離機能
    CPUやメモリ、ディスク入出力など、コンテナ内で利用するリソースを他のコンテナから隔離したり、設定に基づいて振り分けたりする機能。


様々なDockerイメージは下記のWebサイトよりダウンロードできる。
https://hub.docker.com


Docker公式サイトからバイナリをインストールする

サポート外のプラットフォーム用の手順として、バイナリインストールの手順が以下にある。
Install Docker CE from binaries | Docker Documentation
最新版をインスールする場合はこの手順が推奨される。

バイナリは以下のWebサイトから選択する。
https://download.docker.com/linux/static/stable/x86_64/
(stable以外のedgeやtestは好みで選択する)

wget https://download.docker.com/linux/static/stable/x86_64/docker-<バージョン>.tgz
tar xf docker-<バージョン>.tgz
sudo cp docker-<バージョン>/* /usr/local/bin


正常にインストールできたか確認する。

docker version

# 結果
Client:
Version:      18.06.3-ce
API version:  ****
Go version:   *******
Git commit:   *******
Built:        **************
OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?


次に、systemdユニットファイルを作成する。
パッケージ管理システムを使用せずにバイナリファイルをインストールする場合、Dockerとsystemdを手動で統合する。

以下のGitHubにアクセスして、docker.serviceファイルとdocker.socketファイルを/etc/systemd/systemディレクトリに配置する。
https://github.com/moby/moby/tree/master/contrib/init/systemd

リポジトリを追加してインストール

Dockerのリポジトリを追加してインストールする場合は、こちらの手順を用いる。
ただし、リポジトリに含まれるDocker CEの更新が遅い場合があるので注意すること。

RHELの場合

まず、Docker CEをインストールするために、依存関係のライブラリをインストールする。

sudo dnf install yum-utils device-mapper-persistent-data lvm2


続いて、Docker CEをインストールする。

sudo dnf install docker-ce


※注意
Docker CEの最新バージョンを使用する場合は、標準設定では無効になっているリポジトリを有効にする必要がある。

sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test


SUSEの場合

まず、Dockerのリポジトリを追加するため、以下のファイルを任意のエディタで作成する。

sudo vi /etc/zypp/repos.d/docker.repo

# 追記
[Virtualization_containers]
name=Virtualization:containers (SLE and openSUSE 15)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/Virtualization:/containers/SLE_xx_SPx/          # SLEの場合
baseurl=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_xx.x/  # openSUSEの場合
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/Virtualization:/containers/SLE_xx_SPx/repodata/repomd.xml.key  # SLEの場合
gpgkey=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_xx.x/repodata/repomd.xml.key  # openSUSEの場合
enabled=1


ファイル作成後、リポジトリの更新とdockerのインストールを行う。

sudo zypper --gpg-auto-import-keys refresh
sudo zypper install docker docker-compose yast2-docker


または、SLEの場合は、以下の手順を行うこともできる。

  1. YaSTを起動して、[ソフトウェア] - [ソフトウェアリポジトリ]を選択する。
  2. [ソフトウェアリポジトリ]画面から、[追加]ボタンを押下する。
  3. [Extensions and Module from Registration Server]を選択して、[次へ]ボタンを押下する。
  4. [利用可能なextensionsとmodules]から、[Container Module]を選択して、[次へ]ボタンを押下する。
    この時、containerモジュールとリポジトリがシステムに追加される。
  5. Subscription Management Toolを使用している場合、SMTサーバのリポジトリリストを更新する。
    または、以下のコマンドを実行する。
    sudo SUSEConnect -p sle-module-containers/15/x86_64 -r
    または
    sudo SUSEConnect -p sle-module-containers/15/x86_64



Docker Rootlessのインストール

Docker Rootless (ルートレスモード) とは

Docker Rootless (ルートレスモード)は、非スーパーユーザとしてDockerデーモンを実行することができる。
ルートレスモードでは、一般ユーザとしてDockerデーモンとコンテナを実行して、デーモンとコンテナランタイムの潜在的な脆弱性を軽減することができる。

ルートレスモードは、前提条件さえ満たしていれば、Dockerデーモンのインストール中であってもroot権限を必要としない。

Docker-Rootlessの詳細を知りたい場合は、Docker-Rootlessの公式ドキュメントを参照すること。

どのように動作するか

ルートレスモードは、Dockerデーモンとコンテナをユーザネーム空間内で実行する。
これは、userns-remapモードとよく似ているが、
userns-remapモードではデーモン自体がスーパーユーザ権限で実行されるのに対して、ルートレスモードではデーモンとコンテナの両方が一般ユーザ権限として実行される。

ルートレスモードでは、SETUIDビットやファイル機能を持つバイナリを使用しない。
ただし、newuidmapとnewgidmapは、ユーザ名前空間で複数のUID/GIDを使用できるようにするために必要である。

前提条件

ホストにnewuidmapとnewgidmapをインストールする必要がある。
これらのコマンドは、ほぼ全てのLinuxディストリビューションのuidmapパッケージで提供されている。

/etc/subuidおよび/etc/subgidには、ユーザの下位UID / GIDが少なくとも65536個含まれていなければならない。

# 実行ユーザIDの確認
id -u

# 実行ユーザ名の確認
whoami

# 実行ユーザのSubUIDの確認
grep ^$(whoami): /etc/subuid

# 実行ユーザのSubGIDの確認
grep ^$(whoami): /etc/subgid


また、fuse-overlayfsパッケージのインストールを推奨する。

# RHEL
sudo dnf install fuse-overlayfs iptables

# SUSE
sudo zypper install fuse-overlayfs
sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter


制限事項

  • 以下のストレージドライバのみがサポートされている。
    overlay2 (Linuxカーネル 5.11以降)
    fuse-overlayfs (Linuxカーネル 4.18以降、かつ、fuse-overlayfsがインストールされている場合のみ)
    btrfs (Linuxカーネル4.18以降で動作している、または、~/.local/share/dockerがuser_subvol_rm_allowedマウントオプションでマウントされている場合のみ)
    vfs

  • Cgroupは、cgroup v2とsystemdで実行している場合のみサポートされる。

  • 以下の機能はサポートされない。
    AppArmor
    チェックポイント
    オーバーレイネットワーク
    SCTPポートの公開

  • pingコマンドを使用する場合は、pingパケットのルーティングを参照すること。
  • 特権TCP / UDPポート (1024番以下のポート) を公開する場合は、特権ポートの公開を参照すること。
  • docker inspectコマンドで表示されるIPアドレスは、RootlessKitのネットワーク名前空間内に名前空間が存在する。
    これは、IPアドレスがネットワーク名前空間にnsenterせずにホストから到達できないことを意味する。
  • ホストのネットワーク (docker run --net=<ホスト名>) も、RootlessKitの名前空間内に存在する。
  • Dockerの"data-root"としてのNFSマウントはサポートされない。
    この制限は、ルートレスモード特有のものではない。


Docker Rootlessのインストール

パッケージ管理システムからインストール
# SUSE
sudo zypper install docker-rootless-extras


バイナリファイルをダウンロードしてインストール

まず、Docker Rootlessの公式Webサイトにアクセスして、Docker-Rootlessの実行バイナリをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf docker-rootless-extras-<バージョン>.tgz
mv docker-rootless-extras-<バージョン> <任意のインストールディレクトリ>


次に、Dockerの公式Webサイトにアクセスして、Dockerの実行バイナリをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf docker-<バージョン>.tgz
mv docker-<バージョン>/* <Docker-Rootlessが存在するディレクトリ>


最後に、~/.profileファイル等に、環境変数PATHを追記する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="<Docker-Rootlessのインストールディレクトリ>:$PATH"


Docker Rootlessの初期設定

まず、一般ユーザとして、Docker Rootlessデーモンを設定する。

dockerd-rootless-setuptool.sh install


次に、~/.profileファイル等に、環境変数PATHおよびDOCKER_HOSTを追記する。

 # ~/.profileファイル
 
 export PATH=<Docker Rootlessのインストールディレクトリ>:$PATH
 export DOCKER_HOST=unix:///run/user/1000/docker.sock


Docker Rootlessのアンインストール

まず、Dockerデーモンのsystemdサービスを削除する場合、以下に示すコマンドを実行する。

dockerd-rootless-setuptool.sh uninstall


次に、~/.bashrcファイル内の環境変数PATHDOCKER_HOSTが追記されている場合は、設定を削除する。

Docker Rootlessのデータディレクトリを削除する場合は、以下に示すコマンドを実行する。

rootlesskit rm -rf ~/.local/share/docker


もし、パッケージ管理システムからdocker-ce-rootless-extrasパッケージをインストールしている場合は削除する。

sudo zypper remove docker-ce-rootless-extras


最後に、Docker Rootlessの実行バイナリを削除する。

cd ~/bin
rm -f containerd containerd-shim containerd-shim-runc-v2 ctr \
      docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh \
      rootlesskit rootlesskit-docker-proxy runc vpnkit


Docker Rootlessの実行

Systemdサービスユニットは、~/.config/systemd/user/docker.serviceとしてインストールされる。

Docker Rootlessを起動する。

systemctl --user start docker


システム起動時にDocker Rootlessデーモンを起動する場合は、Systemdサービスユニットとlingeringを有効にする。

systemctl --user enable docker
sudo loginctl enable-linger $(whoami)


※注意
Docker Rootlessをシステム全体(/etc/systemd/system/docker.service)として起動することは、User=ディレクティブを使用してもサポートされていないことに注意する。

クライアントにおいて、ソケットパス、または、CLIコンテキストのいずれかを明示的に指定する必要がある。

export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
docker run -d -p 8080:80 nginx


クライアントにおいて、CLIコンテキストを指定する。

docker context use rootless
docker run -d -p 8080:80 nginx


特権ポートの公開

ホスト側において、特権ポート (1024番ポート未満) を公開する場合、 Docker Rootless実行バイナリに対してCAP_NET_BIND_SERVICEを設定する。

sudo setcap cap_net_bind_service=ep <Docker Rootless実行バイナリ>


/etc/sysctl.confファイル、または、/etc/sysctl.dディレクトリ内のファイルにおいて、非特権ポートの開始ポート番号を指定する。
この設定を行うことにより、システム上で使用可能な非特権ポートの範囲を制御できる。
また、ポート番号を上げることにより、特定のセキュリティポリシーに従い、一般ユーザーが使用できるポートの範囲を制限することができる。

# 非特権ポートの開始ポート番号は0番ポート以降となる
# つまり、全てのポートが非特権ポートとなる
net.ipv4.ip_unprivileged_port_start=0


設定を反映する。

sudo sysctl -p  または  sudo sysctl --system


注意

DockerとDocker Rootlessの共存

システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。

sudo systemctl stop    docker.service docker.socket
sudo systemctl disable docker.service docker.socket


ディレクトリパス

Docker Rootlessソケットのパスは、$XDG_RUNTIME_DIR/docker.sockに設定されている。
(環境変数XDG_RUNTIME_DIRは、通常、/run/user/$UIDディレクトリに設定されている)

データディレクトリは、~/.local/share/dockerに設定されている。
また、データディレクトリはNFS上であってはならない。

デーモン設定ディレクトリは、~/.config/dockerディレクトリに設定されている。
このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。

Docker RootlessとPodmanの共存

Docker Rootlessのコマンドを実行する前に、環境変数DOCKER_HOSTを設定する。

# Docker Rootlessのソケットパスは、$XDG_RUNTIME_DIR/docker.sockである
export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/docker.sock"

# Dockerコマンドの実行
docker ...略


Docker Compose

Docker Composeとは

Docker Composeとは、複数のコンテナを定義し実行するDockerアプリケーションのためのツールである。
YAMLファイルを使用してDockerコンテナの起動やコンテナ起動時の設定等を行うことができる。

Docker Composeのメリットを以下に示す。

  • 複数のDockerfileを同時に起動することができる。
  • 実行コマンドによる環境の違いを気にせずに済む。(ポートやバージョン等)
  • ブリッジネットワークが自動で生成されるため、コンテナ同士の通信が可能となる。
  • インフラ構成の可視化やバージョン管理が完結する。


Docker Composeのインストール

Docker ComposeのGithubにアクセスして、Docker Composeの実行バイナリをダウンロードする。
ダウンロードしたファイルに実行権限を付与する。

chmod u+x docker-compose-linux-<アーキテクチャ名>


Docker CompposeをDocker Rootlessのインストールディレクトリに配置する。

mv docker-compose-linux-<アーキテクチャ名> docker-compose
mv docker-compose <Docker Rootlessのインストールディレクトリ>


~/.profileファイル等に環境変数PATHを追記する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="<Docker Composeのインストールディレクトリ>:$PATH"


Docker Composeのインストールが正常に完了しているかどうかを確認する。

docker-compose version


.ymlファイルに対してdocker-compose up -dコマンドを実行する時、以下に示すようなエラーは出力される場合がある
これは、Docker Composeがdocker.sockファイルを見つけられない場合に発生する。

WARNING:root:could not open file '/etc/apt/sources.list.d/mongodb-org-5.0.list'


この時、~/.profileファイル等に環境変数DOCKER_HOSTを設定する必要がある。

 # ~/.profileファイル
 
 export DOCKER_HOST="unix:///run/user/$UID/docker.sock"




Dockerのアンインストール

Dockerエンジン、Docker CLI、Containerdをアンインストールする。

sudo zypper remove docker-ce docker-ce-cli containerd.io


Dockerイメージ、Dockerコンテナ、ボリューム、Dockerの設定ファイルを削除する。(自動的に削除されない)

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd



Docker CEの設定

正常にインストールできたか確認する。

docker version

# 結果
Client:
Version:      18.06.3-ce
API version:  ****
Go version:   *******
Git commit:   *******
Built:        **************
OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?


インストールが正常に完了したら、Dockerサービスを開始する。

sudo systemctl start docker


また、システムの起動後すぐにDockerを実行する場合、以下のコマンドを実行する。

sudo systemctl enable docker


また、管理者権限不要でDockerを使用する場合は、以下のコマンドを実行する。

sudo usermod -aG docker $(whoami)



Docker CEの動作確認

最後に、Docker CEが正常に動作するか確認する。
これを行うには、以下のように、Dockerのテストイメージを使用する。

sudo docker run --rm hello-world

# 出力
Hello from Docker!


上記のメッセージは、インストールが正常に動作していることを示す。

また、上記のメッセージを生成するために、Dockerは以下の手順を実行している。

  1. Dockerクライアントが、Dockerデーモンに接続される。
  2. Dockerデーモンが、Docker Hubから"hello-world"イメージをプルする。
  3. Dockerデーモンが、実行可能な"hello-world"イメージから、現在読み込んでいる出力を生成する新しいコンテナを作成する。
  4. Dockerデーモンは、Dockerクライアントにその出力をストリーミングして、Dockerクライアントは各自のターミナルに送信する。



設定

接続方法の設定

変数DOCKER_HOSTは、DockerクライアントにDockerデーモンへの接続方法を指示するためのものである。
変数DOCKER_HOSTを設定する場合、dockerコマンドを実行するたびに、ローカルホスト上のソケットではなくHTTP APIを使用する。
未設定の場合は、HTTP APIは無効となる。

例えば、変数DOCKER_HOSTtcp://localhost:2375に設定する時、ローカルホスト上のHTTP APIを監視できるが、
通常は、tcp://0.0.0.0:2375と設定して、リモートサーバ上のAPIを監視する。(この時、ファイアウォールを適切に設定すること)

  • 方法 1
    1. ~/.profileファイル等に、変数DOCKER_HOSTの設定を追記する。
      vi ~/.profile

      export DOCKER_HOST='tcp://localhost:2375'

  • 方法 2
    1. Dockerデーモンの設定ファイルをバックアップする。
      sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service

    2. Dockerデーモンの設定ファイルにあるexecstart項目を、以下のように編集する。
      sudo vi /usr/lib/systemd/system/docker.service

      # 編集前
      ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS

      # 編集後
      ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS -H fd:// -H tcp://localhost:2375

    3. Dockerデーモンの設定を有効化する。
      sudo systemctl daemon-reload


Dockerイメージおよびコンテナの保存先

Dockerのイメージおよびコンテナの保存先は、初期設定では、/var/lib/dockerディレクトリに保存される。
もし、保存先を変更する場合は、以下の手順を実施する。

  • /etc/docker/daemon.jsonファイルが存在する場合
    1. /etc/docker/daemon.jsonファイルに、data-rootパラメータを追加する。
      詳細は、https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file を参照すること。
      sudo vi /etc/docker/daemon.json

      /etc/docker/daemon.jsonファイル
      {
        # ...略
        "data-root": "<Dockerイメージおよびコンテナの保存先のフルパス>",
        # ...略
      }

  • /etc/docker/daemon.jsonファイルが存在しない場合
    1. Dockerデーモンの設定ファイルをバックアップする。
      sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service

    2. Dockerデーモンの設定ファイルにあるexecstart項目を、以下のように編集する。
      sudo vi /usr/lib/systemd/system/docker.service

      # 編集前
      ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS

      # 編集後
      ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS -g <Dockerの保存先のフルパス>

    3. Dockerデーモンの設定を有効化する。
      sudo systemctl daemon-reload



Dockerイメージの作成

Dockerイメージを作成するには、まず、Dockerfileを記述する必要がある。(Dockerfileはテキストファイルである)
このDockerfileに、インストールするOSやライブラリを指定して、最後に、コンテナで実行したいソフトウェアを指定する。

まず、Dockerfileでは、Base Imageを指定する。(例えば、OSのImageはBase Imageの一種である)
Base Imageは"FROM"で指定する。以下の例は、CentOS 7を指定する例である。

FROM centos:centos7


次に、コンテナが必要とするソフトウェアのインストール等を行う。(各OSのパッケージ管理システムを使用すると簡単である)
CentOSであればyum、Ubuntuならaptを使用する。(yumやapt等のコマンドの実行は、RUNで行う)

RUN yum install xxxx


特定のファイルをコンテナに埋め込むには、"COPY"を使用する。コンテナのどこにファイルを埋め込むのかを指定する。

COPY <File Name> /home/xxx


コンテナが実行するソフトウェアが通信を行う場合、そのソフトウェアは特定のポート番号を使用する。(例えば、Webサーバであれば80番や443番を使用する)
そのポート番号を、ホストOSのポート番号とマッピングする必要がある。
マッピングは、コンテナを実行する際に使用するが、そのためには、コンテナのポート番号を公開する必要がある。
それを行うには、"EXPOSE"を使用する。

EXPOSE 80


コンテナが実行するソフトウェアは、"CMD"で指定する。
CMDは、Dockerfileに1個だけである。諸々の準備の完了後、最後にCMDを指定する。

CMD ["python", "/usr/src/app/app.py"]


以下の例では、pythonがコマンドで、その後は、コマンドに対する引数である。つまり、上記の例は、以下のコマンドをコンテナ上で実行することを意味する。

python /usr/src/app/app.py


Dockerfileが完成したら、イメージを作成する。
-tオプションを使用してイメージの名前を指定する。
その後ろの"."は、Dockerfileがあるディレクトリのパスである。Dockerfileと同じディレクトリであれば、"."でoである。
Dockerfileの内容が正しければ、イメージが作成される。

sudo docker build -t xxxx/yyyy .


プロキシ配下でbuildする場合は、プロキシを設定する必要がある。
例えば、コンテナ上でyumやaptを使用する場合は、プロキシの設定が必要である。
環境変数は、"ENV"で指定できる。

ENV https_proxy "http://proxy.hoge.server:8080/"
ENV http_proxy "http:// proxy.hoge.server:8080/"


※注意(yum関連のエラー)
yumのリポジトリが見つからないというエラーが表示される場合がある。
標準のリポジトリではなく、特定のレポジトリを指定する場合、そのリポジトリを記載した設定ファイル(CentOS-Base.repoなど)をCOPYするように、
Dockerfileに記載しておけばよい。

COPY CentOS-Base.repo /etc/yum.repos.d/


yumの処理は、ユーザに対して"yes or no"を訊ねる場合があるので、自動的にyesと答えないと途中でイメージ作成が止まるので、以下のように記述する。

CMD yum update –y



Docker Compose

Docker Hubの登録

  1. Docker Hubにアクセスして、新規登録またはサインインする。
  2. サインイン後、右上にあるアバターを選択して、[My Account]を選択する。
  3. [Security]タブを選択して、[New Access Token]を選択する。
  4. 任意のトークンの説明を入力する。
    これは、トークンのユースケースまたは目的を示すものを入力する。
  5. アクセス権限を設定する。

    アクセス権限は、リポジトリに制限を設定するスコープである。
    例えば、読み取りおよび書き込み権限の場合、自動化パイプラインでイメージを構築して、それをリポジトリにプッシュできる。
    ただし、リポジトリを削除することはできない。
  6. [Generate]を選択して、画面に表示されるトークンをコピーして保存する。
    この画面を閉じた後は、トークンを取得できなくなることに注意する。


Docker Hubに登録する。

docker login -u <Docker Hubのユーザ名>  または  docker login --username <Docker Hubのユーザ名>  # 直後にパスワードを入力する


正常に登録される場合、~/.docker/config.jsonファイルが自動的に生成される。

詳細を知りたい場合は、Dockerの公式Webサイトを参照すること。


エラー関連

エラー : error checking context: 'no permission 〜'

dockerfileファイルとdocker-compose.ymlファイルのパーミッションを755にする必要がある。

chmod 755 dockerfile docker-compose.yml


Systemdエラー

openSUSEコンテナをDockerコンテナとして動作する時、以下のようなエラーが出力されてsystemdが起動できない。

Failed to connect to bus: No such file or directory.


これは、Dockerコンテナを実行する時、initシステムを実行していないからである。

systemctlコマンドは、dbusを介してsystemdと通信するプロセスである。
openSUSEコンテナでは、dbusとsysvinitがインストールされていないため(dbusやsystemdが動作していない)、systemctlコマンドは失敗する。

Dockerコンテナでsystemctlを実行するには、その依存関係をインストールして、特殊なコマンドを実行する必要がある。

dockerfileを作成および使用して解決する手順を、以下に記載する。
まず、以下のようなdockerfileを作成する。

FROM opensuse/leap:15.3
MAINTAINER Annonymas

RUN zypper update -y
RUN zypper install -y dbus-1 systemd-sysvinit
RUN cp /usr/lib/systemd/system/dbus.service /etc/systemd/system/; \
    sed -i 's/OOMScoreAdjust=-900//' /etc/systemd/system/dbus.service

VOLUME ["/sys/fs/cgroup", "/run"]

CMD ["/sbin/init"]

EXPOSE 22
EXPOSE 80


次に、作成したdockerfileからDockerイメージを作成する。

sudo docker build -t <イメージ名>:<タグ名> -f <Dockerfile名> .  # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる
例. sudo docker build -t suse153i .


Dockerコンテナを実行する。

sudo docker run -d --name=<コンテナ名> --hostname <コンテナのホスト名> <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <イメージ名>
例. sudo docker run -d --name=suse153c --hostname suse153 -p 50080:80 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i

# 開始しているコンテナ内にアクセスする場合
sudo docker exec -it <コンテナ名> /bin/bash
例. sudo docker exec -it suse153c /bin/bash

# 停止したコンテナを開始する場合
sudo docker container start <コンテナ名>
例. sudo docker container start suse153c


openSUSEコンテナにおいて、systemctlコマンドが実行できるかどうかを確認するには、以下のコマンドを実行する。

systemctl list-units


Systemdサービスのサポート

openSUSEコンテナリポジトリで公開されているコンテナイメージは、containers-systemdパッケージがインストールされている。
例えば、Systemdサービスを使用してNginXコンテナを設定して、自動的に起動するためのSystemdサービスファイルとSysconfigファイルが含まれている。