基礎 | Docker
Docker を実行できるユーザー
- /var/run/docker.sock の所有権を確認
Docker Command は下記 Unix socket に REST API を発行します。
ls -al /var/run/docker.sock
srw-rw---- 1 root docker 0 Mar 26 2024 /var/run/docker.sock
上記の場合、 root ユーザーもしくは docker グループのユーザーが実行可能です。
コンテナ作成方法
DockerfileからDockerコンテナ作成Docker HubからDockerコンテナ作成
Dockerfile から Docker コンテナ作成
.Dockerfileを作成- build:
DockerfileからDockerイメージを作成 - run/create:
DockerイメージからDockerコンテナを作成docker create コマンドは、コンテナを停止状態 (stop した状態) で作成する以外は、run コマンドと同等です。オプションは run コマンドを参照してください。
https://www.tohoho-web.com/docker/docker_run.html
- start:
createで作成したコンテナを起動
1. Dockerfile を作成
例) UbuntuでApacheを動かす Dockerfile の例。
# ubuntu
FROM ubuntu:24.04
RUN apt-get update && \
apt-get install -y apache2 && \
rm -rf /var/lib/apt/lists/*
EXPOSE 80
WORKDIR /var/www/html
COPY index.html .
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
USER www-data
CMD ["apachectl", "-D", "FOREGROUND"]
※ 実運用では ubuntu:24.04 ではなくタグのバージョンを固定(タグ固定・ダイジェスト指定等)することを推奨。
latest にした場合、新しいバージョンが出たときに、Dockerfile の RUN や環境変数 ENV の値が新しいバージョンで動作する保証はない。
2. build(イメージ作成)
$ docker image build -t .
DockerfileからDockerイメージを作成する- コマンド末尾の
.はcontextを表す -fでDockerfileを指定する。省略した場合は、contextを指定(例では.カレントディレクトリ)-tでイメージに名前:タグ形式で名前とタグを指定する-tで名前:タグのタグを省略した場合はlatestになる
buildとcontext
Docker イメージは Dockerfile と「コンテクスト」(context)を使って構築します。構築時のコンテクストとは、特定の パス や URL の場所にあるファイルのことです。構築中のステップで、対象コンテクスト内のファイルを参照できます。
https://docs.docker.jp/engine/reference/commandline/build.html
context:前後関係、文脈、環境
例)
app
|
|-- .docker
|
|-- Dockerfile
appをプロジェクトルートとする。
Dockerfileをapp/.dockerに作成。
$ cd /path/to/app
$ docker build -t myimage:0.0.1 -f .docker/Dockerfile .
上記の場合、contextがカレントディレクトリ(.)として設定される。
DockerfileのCOPYコマンドの<src>(コピー元)はcontextからの相対パスとして解釈される。
Multiple
resources may be specified but the paths of files and directories will be interpreted as relative to the source of the context of the build. https://docs.docker.com/engine/reference/builder/#copy
COPYの<dest>は、コンテナ内の絶対パスまたはイメージのWORKDIRからの相対パスになる。
The
is an absolute path, or a path relative to WORKDIR, https://docs.docker.com/engine/reference/builder/#copy
WORKDIRは、特に指定しなければイメージのデフォルトが使用される。WORKDIRコマンドで変更することもできる。
(イメージ配布元またはソースを見ればWORKDIRは分かる)
3. run(イメージからコンテナ作成・・・起動した状態)
$ docker run --name -p 8000:80 -v path/to/host:path/to/docker
例)
$ docker run -d --name my-httpd -p 8000:80 -v $(pwd):/usr/local/apache2/htdocs/ httpd:latest
runとcreateの違い
FROM php:7.4.6
COPY ./test.sh /usr/local/bin
RUN chmod +x /usr/local/bin/test.sh
CMD ["php", "--version"]
/usr/local/bin/test.sh。
#!/bin/bash
echo 'hello'
hello:1.0.0というイメージを作成済みとする。
docker runはhelloと表示される。
$ docker run hello:1.0.0 /usr/local/bin/test.sh
// hello
createは、コンテナを停止した状態で作成するので以下はエラーになる
$ docker create hello:1.0.0 /usr/local/bin/test.sh
createの場合は、コンテナを起動するには、createした後にstartする必要がある。
※ ちなみに /usr/local/bin/test.sh は、引数としてコンテナに渡されてCMDコマンドを上書きする。
If the user specifies arguments to docker run then they will override the default specified in CMD.
https://docs.docker.com/engine/reference/builder/#cmd
CMDの上書き
$ docker run
docker runの末尾の引数はDockerfileのCMDコマンドを上書きする。
# ワーキングディレクトリを表示
$ docker run pwd
# 例 ファイル一覧を表示
$ docker run ls -al
–rm
コンテナが終了したら、コンテナを削除する。
CMDの上書き例
# PHPのインストール済み拡張機能一覧を表示
$ docker run -it --rm php -m
2. Docker HubからDockerコンテナを作成
Docker Hubでホストされているイメージからコンテナ作成する。
$ docker run -d -p 8080:80 --name web-server -v $(pwd):/var/www/html php:7.4-apache
docker runは以下の順序でイメージを探す。
- ローカル
- Docker Hub
Docker HubのPublicなイメージはログインしていなくても使用することができる。
$ docker runで、Docker Hubのイメージを指定(例:php:7.4-apache)してコンテナを作成する処理は、内部で以下コマンドを実行している。
docker pull:イメージをDocker Hubから取得docker create:イメージからコンテナを作成docker start:コンテナを起動
d/detachオプション
-d, –detach コンテナをバックグラウンドで実行し、コンテナ ID を表示
http://docs.docker.jp/engine/reference/commandline/run.html
※ -dを忘れてもctrl + p, ctrl + qでデタッチ可能
コンテナにログイン(docker exec -it)
http://docs.docker.jp/engine/reference/commandline/exec.html
- Debian/Ubuntu系は
/bin/bash - Alpine系は
/bin/sh
$ docker exec -it /bin/bash
docker execのオプションは以下のとおり。
-d, –detach=false デタッチド・モード: コマンドをバックグラウンドで実行
–detach-keys デタッチド・コンテナに特定のエスケープ・キー・シーケンスを設定
–help=false 使い方の表示
-i, –interactive=false アタッチしていなくても STDIN をオープンにし続ける
–privileged=false コマンドに拡張 Linux ケーパビリティの追加
-t, –tty=false 疑似ターミナル (pseudo-TTY) の割り当て
-u, –user= ユーザ名か UID (書式: <名前|uid>[:<グループ|gid>])http://docs.docker.jp/engine/reference/commandline/exec.html
※ tty:teletypewriter
docker inspect
docker inspectでCMDやEntrypointを調べることができる。
$ docker inspect
docker create
$ docker create
docker cp
コンテナが稼働している最中にコンテナ内のファイルをローカルにコピーする(またはその逆)。
ref. http://docs.docker.jp/v19.03/engine/reference/commandline/cp.html
# コンテナ内の/path/to/sourceをローカルの./path/to/destinationにコピー
$ docker cp コンテナID:/path/to/container ./path/to/local
// 例
docker cp symfony-micro-app:/etc/apache2/sites-available/000-default.conf ./000-default.conf
通常のcpコマンドの挙動。
project
|
|- src
|
|-- text1.txt
|
|-- text2.txt
|
|- dst
$ cd /path/to/project
$ cp -r src/. ./dst
project
|
|- src
|
|-- text1.txt
|
|-- text2.txt
|
|- dst
|
|-- text1.txt
|
|-- text2.txt
docker commit
コンテナに対する変更から、新しいイメージを作成。
– https://docs.docker.jp/engine/reference/commandline/commit.html
docker system prune
// イメージ、コンテナ、ネットワークを削除
$ docker system prune
docker system prune 注意1
docker system pruneはデフォルトではボリュームを削除しない。
削除する場合は--volumeを使う。
ref. https://docs.docker.jp/config/pruning.html
docker system prune コマンドは、イメージ、コンテナ、ネットワークを削除(prune)するショートカットです。ボリュームはデフォルトでは削除されないため、ボリュームを削除するには docker system prune で –volumes フラグを使う必要があります。
docker system prune 注意2
イメージは宙ぶらりんイメージ(dangling image)のみ削除する。
宙ぶらりんイメージ(dangling image)のみ削除します。宙ぶらりんイメージとは、タグを持たず、他のコンテナからも参照されないイメージです。
ref. https://docs.docker.jp/config/pruning.html
Appendix
Official Image
通常、親イメージとして使用される
- https://github.com/docker-library
Docker for Macのディスク使用
セキュリティ注意
docker グループは Docker デーモンへアクセスできるため、実質的に root 相当の権限を持ちます。