|
|
| (同じ利用者による、間の10版が非表示) |
| 236行目: |
236行目: |
| docker run -d -p 8080:80 nginx | | docker run -d -p 8080:80 nginx |
| <br> | | <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とDocker Rootlessの共存 ===== |
| システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。<br> | | システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。<br> |
| | sudo systemctl stop docker.service docker.socket |
| sudo systemctl disable docker.service docker.socket | | sudo systemctl disable docker.service docker.socket |
| <br> | | <br> |
| 251行目: |
267行目: |
| このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。<br> | | このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。<br> |
| <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 Composeとは ===== |
| Docker Composeとは、複数のコンテナを定義し実行するDockerアプリケーションのためのツールである。<br> | | Docker Composeとは、複数のコンテナを定義し実行するDockerアプリケーションのためのツールである。<br> |
| YAMLファイルを使用してDockerコンテナの起動やコンテナ起動時の設定等を行うことができる。<br> | | YAMLファイルを使用してDockerコンテナの起動やコンテナ起動時の設定等を行うことができる。<br> |
| <br> | | <br> |
| Docker-composeのメリット | | Docker Composeのメリットを以下に示す。<br> |
| 複数のDockerfileを同時に起動できる。
| | * 複数のDockerfileを同時に起動することができる。 |
| 実行コマンドによる環境差異がなくなる。(ポートやバージョンなど)
| | * 実行コマンドによる環境の違いを気にせずに済む。(ポートやバージョン等) |
| ブリッジ・ネットワークが自動で作成されるため、コンテナ同士の通信が可能。
| | * ブリッジネットワークが自動で生成されるため、コンテナ同士の通信が可能となる。 |
| インフラ構成の可視化やバージョン管理がDocker-composeで完結する。
| | * インフラ構成の可視化やバージョン管理が完結する。 |
| <br> | | <br> |
| | |
| ===== Docker Composeのインストール ===== | | ===== Docker Composeのインストール ===== |
| [https://github.com/docker/compose Docker ComposeのGithub]にアクセスして、Docker Composeの実行バイナリをダウンロードする。<br> | | [https://github.com/docker/compose Docker ComposeのGithub]にアクセスして、Docker Composeの実行バイナリをダウンロードする。<br> |
| 408行目: |
434行目: |
| *# Dockerデーモンの設定を有効化する。 | | *# Dockerデーモンの設定を有効化する。 |
| *#: <code>sudo systemctl daemon-reload</code> | | *#: <code>sudo systemctl daemon-reload</code> |
| <br><br>
| |
|
| |
| == Dockerコマンド ==
| |
| ==== Dockerイメージの検索 ====
| |
| [https://hub.docker.com/ Docker Hub]からイメージを検索およびダウンロードすることもできる。<br>
| |
| sudo docker search <イメージ名>
| |
| <br>
| |
| ==== Dockerイメージのダウンロード ====
| |
| sudo docker pull <イメージ名>
| |
| <br>
| |
| ==== Dockerイメージの一覧表示 ====
| |
| 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>
| |
| 以下の例では、ホストPCの12345番ポートをコンテナの80番ポートにマッピングしている。<br>
| |
| sudo docker run -it -p 12345:80 <イメージ名> /bin/bash
| |
| <br>
| |
| <code>-P</code>オプションを指定すると、コンテナが使うポートがランダムにホストのポートにマッピングされる。<br>
| |
| sudo docker run -it -P <イメージ名>
| |
| <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>
| |
| ==== ディレクトリの共有 ====
| |
| <code>run</code>コマンドにおいて、<code>-v</code>オプションまたは<code>–-volume</code>オプションを指定することにより、<br>
| |
| コンテナ内のボリュームとローカル環境のボリュームを接続することができる。<br>
| |
| sudo docker run -d -p 12345:80 -v /home/user/htdocs:/var/www/html <イメージ名>
| |
| <br>
| |
| ==== バックグラウンドでの実行 ====
| |
| <code>run</code>コマンドにおいて、<code>-d</code>オプションまたは<code>-–detach</code>を指定することにより、コンテナをバックグラウンドを実行することができる。<br>
| |
| 実行直後にコンテナIDが表示される。<br>
| |
| sudo docker run -d <イメージ名>
| |
| <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ファイルをインポートする
| |
| sudo docker import < sample-container.tar - sample-container:latest
| |
| # または
| |
| cat sample-container.tar | sudo docker import - sample-container:latest
| |
| <br><br> | | <br><br> |
|
| |
|
| 608行目: |
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ファイル名を指定する場合
| | # アクセス権限を設定する。<br><br>アクセス権限は、リポジトリに制限を設定するスコープである。<br>例えば、読み取りおよび書き込み権限の場合、自動化パイプラインでイメージを構築して、それをリポジトリにプッシュできる。<br><u>ただし、リポジトリを削除することはできない。</u> |
| sudo docker build -t <イメージ名>:<タグ名> -f <Dockerファイル名> .
| | # [Generate]を選択して、画面に表示されるトークンをコピーして保存する。<br>この画面を閉じた後は、トークンを取得できなくなることに注意する。 |
|
| |
| # イメージ名およびタグ名、Dockerファイル名(Dockerファイル名が<u>'''dockerfile'''</u>の場合のみ)は省略できる
| |
| sudo docker build .
| |
| <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> |
|
| |
|
| 726行目: |
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. |
| 772行目: |
554行目: |
| 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__ |
| [[カテゴリ:RHEL]][[カテゴリ:SUSE]] | | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Web]][[カテゴリ:コンテナ]] |