2024年12月07日 Docker on Slackware64-current [長年日記]
_ Docker on Slackware64-current
DockerをSlackware64-currentに導入してみた。基本的にはPonceさんのGithubからSlackbuildスクリプトをダウンロードしてきて諸々をビルドしていく。 ソースはSlackbuild内の*.infoに記述されているので、そこからダウンロードする。 ビルドする際にはsuではなくsu -でrootになって行う。
ビルド後source /etc/profile.d/go.shを実行し、gcc-goではなくgoogle-go-langが優先して実行されるように設定し、以降のビルドを行う。 go.shはビルド時のみ必要で、Docker実行時には必要ない。
chmod +x /etc/rc.d/rc.libvirt
/etc/rc.d/rc.local
if [ -x /etc/rc.d/rc.libvirt ]; then /etc/rc.d/rc.libvirt start fi
chmod +x /etc/rc.d/rc.docker
/etc/rc.d/rc.local
if [ -x /etc/rc.d/rc.docker ]; then /etc/rc.d/rc.docker start fi
_ 動作確認
以下のコマンドを実行し
$ docker run hello-world
以下のような表示がされればOK
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ $
_ docker(基本)
実体
/var/lib/docker/
docker hub(https://hub.docker.com/)からコンテナイメージを取得
docker pull _ContainerImage_:_Tag_
- :_Tag_ 未指定時は :latest を指定したとみなす。
コンテナイメージからコンテナを生成し実行する
docker run --name _ContainerName_ \ -it \ -e _EnvName_=_Value_ [-e ...] \ -p _LocalPort_:_ContainerPort_ [-p ...] \ -v _LocalDir_:_ContainerDir_ [-v _VolumeName_:_ContainerDir_] \ --net _NetworkName_ --expose _OpenPort_ \ -d \ _ContainerImage_:_Tag_
- -it
- ローカルとコンテナの標準入出力を紐づける
- -p
- 外部からのアクセス用ポート指定
- -v _VolumeName_
- _VolumeName_ は docker volume create で作成しておく
- --net _NetworkName_
- _NetworkName_ は docker network create で作成しておく
- --expose _OpenPort_
- コンテナ間通信用に公開するポート
- -d
- バックグラウンドで起動する
- ローカルにコンテナイメージが存在しない場合は、自動的にdocker hubからpullしてくる。
生成済のコンテナを実行する
docker start _ContainerName_
コンテナを停止する
docker stop _ContainerName_
コンテナの削除
docker rm _ContainerName_
コンテナイメージの削除
docker rmi _ContainerImage_
コンテナの一覧
docker container ls -a
コンテナイメージの一覧
docker image ls -a
コンテナプロセスの一覧
docker ps -a
コンテナ内でコマンド実行
docker exec -u _UserName_ \ -w _WorkingDir_ \ -e _EnvName_=_Value_ [-e ...]\ -it \ _ContainerName_ \ /bin/_AnyCommand_ arg1 arg2 ...
ボリュームの生成
docker volume create _VolumeName_
ボリュームの確認
docker volume inspect _VolumeName_
ボリュームの一覧
docker volume ls
ボリュームの削除
docker volume rm _VolumeName_
Bridgeネットワークの作成
docker network create _NetworkName_
ネットワークの削除
docker network rm _NetworkName_
_ コンテナイメージの作成
コンテナイメージの定義(Dockerfile)
# ベースイメージ FROM ubuntu:latest # コンテナ起動時のカレントディレクトリ WORKDIR /var/www/htdocs # コンテナ生成時にローカルからコンテナにファイルをコピーする COPY index.html ./ COPY .htaccess ./ # コンテナ生成時にコンテナ内でコマンドを実行する RUN apt update && \ apt install -y -q apache && \ apt install ..snip.. # コンテナ起動時に実行するコマンド ENTRYPOINT["/etc/rc.d/rc.httpd"] CMD ["start"]
CMD は docker run の引数で置き換えることが可能。
docker run ...snip... _ContainerImage_:_Tag_
は /etc/rc.d/rc.httpd start を実行する。一方、
docker run ...snip... _ContainerImage_:_Tag_ stop
は /etc/rc.d/rc.httpd stop を実行する。
コンテナイメージ生成
docker build -t _ContainerImage_:_Tag_ .
_ composeによる複数コンテナの管理
YAML(compose.yaml)による定義
version: '1' services: app1: build: . container_name: _ContainerName_ working_dir: _WorkingDir_ volumes: - _LocalDir_:_ContainerDir_ - _VolumeName_:_ContainerDir_ ports: - "_LocalPort_:_ContainerPort_" depends_on: - app2 app2: image: _ContainerImage_:_Tag_ container_name: _ContainerName_ environment: _Environ_: _Value_ volumes: - _LocalDir_:_ContainerDir_ - _VolumeName_:_ContainerDir_ volumes: _VolumeName_:
composeでコンテナ群を生成&開始
docker compose up -d --build
- --build コンテナが存在してもイメージから再作成する
- すべてのサービスが自動的に生成された単一のネットワークに接続されている
- サービス名(例 app1,app2)がホスト名になる
composeでコンテナ群を停止&削除
docker compose down
composeでコンテナ群を開始
docker compose start -d
composeでコンテナ群を停止
docker compose stop
composeでコンテナプロセス一覧
docker compose ps -a
composeでコマンド実行
docker compose exec -u _UserName_ \ -w _WorkingDir_ \ -e _EnvName_=_Value_ \ app1 \ /bin/_AnyCommand_ arg1 arg2 ...
[ツッコミを入れる]