トップ «前の日記(2024年08月12日) 最新 次の日記(2024年12月27日)» 編集

Masa's blog

検索キーワード:

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"]

CMDdocker 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 ...