「インストール - Docker CE」の版間の差分
284行目: | 284行目: | ||
<br> | <br> | ||
コンテナのメタ情報等は保存されず、ファイルシステムのコピーがそのまま保存される。<br> | コンテナのメタ情報等は保存されず、ファイルシステムのコピーがそのまま保存される。<br> | ||
sudo docker export <オプション> <コンテナ名またはコンテナID> | sudo docker export <オプション> <コンテナ名またはコンテナID> > <保存するファイル名> | ||
# 例. Dockerコンテナのsample-containerをsample-container.tarとして保存する | # 例. Dockerコンテナのsample-containerをsample-container.tarとして保存する |
2022年1月11日 (火) 05:48時点における版
概要
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-18.06.3-ce.tgz tar zxvf docker-18.06.3-ce.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の更新が遅い場合があるので注意すること。
CentOSの場合
まず、Docker CEをインストールするために、依存関係のライブラリをインストールする。
sudo yum install yum-utils device-mapper-persistent-data lvm2
続いて、Docker CEをインストールする。
sudo yum 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
または、SLEの場合は、以下の手順を行うこともできる。
- YaSTを起動して、[ソフトウェア] - [ソフトウェアリポジトリ]を選択する。
- [ソフトウェアリポジトリ]画面から、[追加]ボタンを押下する。
- [Extensions and Module from Registration Server]を選択して、[次へ]ボタンを押下する。
- [利用可能なextensionsとmodules]から、[Container Module]を選択して、[次へ]ボタンを押下する。
この時、containerモジュールとリポジトリがシステムに追加される。 - Subscription Management Toolを使用している場合、SMTサーバのリポジトリリストを更新する。
または、以下のコマンドを実行する。sudo SUSEConnect -p sle-module-containers/15/x86_64 -r
- または
sudo SUSEConnect -p sle-module-containers/15/x86_64
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は以下の手順を実行している。
- Dockerクライアントが、Dockerデーモンに接続される。
- Dockerデーモンが、Docker Hubから"hello-world"イメージをプルする。
- Dockerデーモンが、実行可能な"hello-world"イメージから、現在読み込んでいる出力を生成する新しいコンテナを作成する。
- Dockerデーモンは、Dockerクライアントにその出力をストリーミングして、Dockerクライアントは各自のターミナルに送信する。
設定
~/.profileファイルまたは~/.bashrcファイル等に、以下の設定を追記する。
vi ~/.profile
export DOCKER_HOST='tcp://localhost:2375'
Dockerのイメージおよびコンテナの保存先は、/var/lib/dockerディレクトリに保存される。
もし、保存先を変更する場合は、以下の手順を実施する。
- Dockerデーモンの設定ファイルをバックアップする。
sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service
- 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の保存先のフルパス>
- Dockerデーモンの設定を有効にして起動する。
sudo systemctl daemon-reload
sudo systemctl start docker
Dockerコマンド
Dockerイメージの検索
Docker Hubからイメージを検索およびダウンロードすることもできる。
sudo docker search <イメージ名>
Dockerイメージのダウンロード
sudo docker pull <イメージ名>
Dockerイメージの一覧表示
sudo docker image ls または sudo docker image ls -a または sudo docker image ls --all
Dockerイメージの削除
<イメージ名>は上述の"イメージの一覧表示"で確認できる。
-f
オプションを付加することにより、使用中のイメージおよびコンテナであっても削除することができる。
sudo docker rmi -f <イメージ名>
Dockerイメージの実行
<イメージ名>はイメージの名前であり、<COMMAND>はDockerコンテナ上で実行するコマンドである。
sudo docker run <イメージ名> <COMMAND>
実行コマンドが、/bin/bashのような対話型(インタラクティブ)なコマンドの場合は、-it
オプションを指定する。
-i
オプションはコンテナの標準入力を有効化、-t
オプションはttyを有効化するためのオプションである。
sudo docker run –it <イメージ名> /bin/bash
detachedモード(バックグラウンドモード)で実行する場合は、–d
オプションを指定する。
sudo docker run -d dockersamples/static-site
実行中のDockerコンテナの一覧表示
sudo docker ps または sudo docker container ls
全てのDockerコンテナの一覧表示
sudo docker ps -a または sudo docker ps --all または sudo docker container ls –a または sudo docker container ls –-all
Dockerコンテナの削除
<CONTAINER ID>を指定する。
<CONTAINER ID>は上述の"コンテナの一覧表示"で確認できる。
sudo docker rm <CONTAINER ID> または sudo docker countainer rm <CONTAINER ID>
Dockerコンテナの停止
sudo docker stop <CONTAINER ID> sudo docker container stop <CONTAINER ID>
コンテナの停止と削除を同時に実施する。
sudo docker rm –f <CONTAINER ID> sudo docker container rm -f <CONTAINER ID>
Dockerコンテナに任意の名前を付ける
これは、<CONTAINER ID>の代わりに指定できる。
sudo docker run --name <任意のコンテナ名> <イメージ名>
ポートマッピング
run
コマンドにおいて、-P
オプションを指定すると、コンテナが使うポートがランダムにホストのポートにマッピングされる。
また、-d
オプションを指定すると、コンテナIDを表示して、バックグラウンドでコンテナを実行される。
sudo docker run -d -P <イメージ名>
-p
オプションを使用すると、コンテナのポートをマッピングするホストのポートを指定できる。
以下の例では、ホストPCの12345番ポートをコンテナの80番ポートにマッピングしている。
sudo docker run -it –p 12345:80 <イメージ名> /bin/bash
どのポートにマッピングされたかは、sudo docker ps
コマンドまたはsudo docker port <CONTAINER ID>
で確認できる。
sudo docker port <CONTAINER ID> # 出力例 443/tcp -> 0.0.0.0:32770 80/tcp -> 0.0.0.0:32771
DockerコンテナからDockerイメージを作成する
まず、Dockerコンテナを停止する。
sudo docker container stop <CONTAINER IDまたはコンテナ名>
次に、停止したDockerコンテナからDockerイメージを作成する。
sudo docker commit <CONTAINER IDまたはコンテナ名> <イメージのリポジトリ名>:<イメージのタグ名>
作成したDcockerイメージを確認する。
sudo docker images
作成したDockerイメージからDockerコンテナを作成する。
sudo docker run -it --name <CONTAINER IDまたはコンテナ名> <イメージのリポジトリ名>:<イメージのタグ名> /bin/bash
Dokerイメージのエクスポートおよびインポート
まず、Dockerコンテナを停止する。
sudo docker container stop <Dockerコンテナ名またはDockerコンテナのID名> # または sudo docker stop <Dockerコンテナ名またはDockerコンテナのID名>
必要であれば、Dockerコンテナでの変更をDockerイメージに反映する。
sudo docker commit <Dockerコンテナ名またはDockerコンテナのID名> <イメージのリポジトリ名>:<イメージのタグ名>
Dockerイメージに付随するレイヤの情報(メタ情報)等を含めたイメージを保存する。
sudo docker save <オプション> <イメージ名> > <保存するファイル名> # または sudo docker save <オプション> <イメージ名> -o <保存するファイル名> # 例. Dockerイメージのsample-imageをsample-image.tarとして保存する sudo docker save sample-image > sample-image.tar
エクスポートしたDockerイメージファイルをインポートする場合は、load
コマンドを使用する。
sudo docker load < <エクスポートしたDockerのファイル名> # 例. エクスポートしたファイルであるsample-image.tarファイルをインポートする sudo docker load < sample-image.tar
Dokerコンテナのエクスポートおよびインポート
まず、Dockerコンテナを停止する。
sudo docker container stop <コンテナ名またはコンテナID> # または sudo docker stop <コンテナ名またはコンテナID>
必要であれば、Dockerコンテナでの変更をDockerイメージに反映する。
sudo docker commit <Dockerコンテナ名またはDockerコンテナのID名> <イメージのリポジトリ名>:<イメージのタグ名>
コンテナのメタ情報等は保存されず、ファイルシステムのコピーがそのまま保存される。
sudo docker export <オプション> <コンテナ名またはコンテナID> > <保存するファイル名> # 例. Dockerコンテナのsample-containerをsample-container.tarとして保存する sudo docker export sample-container > sample-container.tar
エクスポートしたDockerコンテナファイルをインポートする場合は、import
コマンドを使用する。
sudo docker import <エクスポートしたコンテナファイル名> - <リポジトリ名>:<タグ名> # 例. エクスポートしたsample-container.tarファイルをインポートする cat sample-container.tar | sudo docker import - sample-container:latest
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
Dockerfileの基礎
Dockerfileの概要
Dockerfileは、Dockerイメージの設計図のようなものである。
Dockerfileを作成することにより、任意のDockerイメージを作成できる。
DockerfileからDockerイメージを作成するには、Dockerfileが存在するディレクトリで以下のコマンドを実行する。
docker build -t <イメージ名>:<タグ名> -f <Dockerfile名> . # または docker build . # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる
Dockerfileで使用するコマンドを、以下に示す。
- FROM
- RUN
- CMD
- ENTRYPOINT
- COPY
- ADD
- ENV
- WORKDIR
Dockerfileの作成手順
- FROM
- ベースとなるイメージを決定するコマンドである。
- Dockerfileの先頭に記述する。
- FROMの後には、基本的にOSを記述する。
例1. FROM centos7:latest 例2. FROM ruby:2.5
- RUN
- FROMで記述したOSに対応するコマンドを実行するコマンドである。
- RUNごとにLayerが作成される。(Dockerイメージは、レイヤーを積み重ねていくように作成される)
- 以下の例では、Dockerイメージには、centos7のレイヤーにtouch /usr/bin/testのレイヤーが追加作成される。
- (/usr/bin/testファイルを作成するDockerイメージを作成している)
例. FROM centos7:latest RUN ["touch", "/usr/bin/test"]
- 以下の例では、Dockerイメージには、centos7のレイヤーにcurlとnginxという2つのパッケージをインストールするレイヤーが追加作成される。
- (yum updateはインストールするパッケージを新しいものにするために記述して、yum install -yはパッケージをインストールするために記述している)
例. FROM centos7:latest RUN yum update && yum install -y curl nginx
- DockerfileからDockerイメージを1度作成したものはキャッシュされるため、RUNを複数記述することにより、ビルドの時間を短くすることができる。
- ただし、レイヤー数は少ない方が望ましいため、&&や\を使用して、RUNの記述を少なくする。
- CMD
- コンテナの実行コマンドを指定するコマンドである。
- Dockerfileの最後に記述する。
- 以下の例では、DockerfileからDockerイメージを作成、docker runコマンドによりコンテナを作成した後、/bin/bashを実行している。
例. FROM centos7:latest RUN yum update && yum install -y curl nginx CMD ["/bin/bash"]
- ENTRYPOINT
- CMDに近い役割を持つコマンドである。
- CMDは、Dockerコンテナを作成・実行する時(docker runコマンド)、コマンドを上書きできるが、
- (例. docker run lsコマンドを実行する場合、上記のCMDの例ではbashではなく、lsが実行される)
- ENTRYPOINTを使用する場合、コマンドは上書きできなくなり、CMDはENTRYPOINTのオプションを記述する形となる。
- 以下の例では、
ENTRYPOINT
にls
コマンドを記述することにより、コンテナ実行時(docker run
コマンド)に、ls
以外のコマンドが実行できなくなる。 - なお、
CMD
では、--help
オプションを指定している。
例. FROM centos7:latest RUN yum update && yum install -y curl nginx ENTRYPOINT ["ls"] CMD ["--help"]
- COPY
- Dockerfileが存在するディレクトリ(BuildContextという)にあるファイルを、Dockerイメージにコピーするコマンドである。
- DockerfileをビルドしてDockerイメージからコンテナを作成した後、コンテナにNewDirディレクトリを作成して、Test.txtファイルをコピーしている。
- この時、Dockerイメージのレイヤーが追加・作成される。
例. FROM ubuntu:latest RUN mkdir /NewDir COPY Test.txt /NewDir CMD ["/bin/bash"]
- ADD
- COPYのコマンドと似ていて、同じくコピーができるインストラクションです。
- ADDとCOPYとの違い
- ADDは圧縮ファイルをコピーした際、コピーと解凍の両方を行います。
- COPYは単純なコピーのみです。
- 圧縮ファイルをコピー・解凍する時にはADD、圧縮ファイルが関係ない単純なコピーにはCOPYを使います。
- 以下の例では、Dockerfileをbuildした際、DockerImageにsample.tarを/(ルート直下)にコピー・解凍するLayerを作成されます。
- コンテナを作成した際に、コンテナのルート直下にsample.tarが解凍されたものが作成されています。
例. FROM ubuntu:latest ADD sample.tar / CMD ["/bin/bash"]
- ENV
- 環境変数を設定するインストラクションです。
- 以下の例では、コンテナ作成時にkey1=valueという環境変数が設定されるDockerImageが作成されます。
例. FROM ubuntu:latest ENV key1 value CMD ["/bin/bash"]
- WORKDIR
- インストラクションの実行ディレクトリを変更するインストラクションです。
- 以下の例では、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
エラー関連
エラー : error checking context: 'no permission 〜'
dockerfileファイルとdocker-compose.ymlファイルのパーミッションを755にする必要がある。
chmod 755 dockerfile docker-compose.yml
openSUSEコンテナ
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"]
次に、作成したdockerfileからDockerイメージを作成する。
docker build -t suse153i .
Dockerコンテナを実行する。
sudo docker run -d --name=suse153c --hostname suse153 <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i sudo docker container start suse153c # または sudo docker exec -it suse153c /bin/bash
openSUSEコンテナにおいて、systemctlコマンドが実行できるかどうかを確認するには、以下のコマンドを実行する。
systemctl list-units