kuroの覚え書き

96の個人的覚え書き

Docker-composeをJetson Nanoで使う。

Docker-composeをJetson nanoに入れてdockerの起動を楽にする試み。

まずはDocker-composeをインストールする。

sudo apt install python3-pip
sudo apt install build-essential libssl-dev libffi-dev python3-dev
sudo pip3 install docker-compose
-----------
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-pzvne0ph/cryptography/setup.py", line 14, in <module>
        from setuptools_rust import RustExtension
    ModuleNotFoundError: No module named 'setuptools_rust'
    
            =============================DEBUG ASSISTANCE==========================
            If you are seeing an error here please try the following to
            successfully install cryptography:
    
            Upgrade to the latest pip and try again. This will fix errors for most
            users. See: https://pip.pypa.io/en/stable/installing/#upgrading-pip
            =============================DEBUG ASSISTANCE==========================
    
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-pzvne0ph/cryptography/

そうするとsetuptools_rustが入ってないよ的なエラーが出たので、

sudo pip3 install setuptools_rust
sudo pip3 install docker-compose

とりあえずテストをしてみる。
まず、dockerがちゃんと動くか

docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete 
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
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.
    (arm64v8)
 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/

OK

次にdocker-composeで起動してみる。
まず、適当なディレクトリを作り、中にdocker-compose.ymlというファイルを作る。

$ mkdir docker_test
$ cd docker_test
$ nano docker-compose.yml

$ cat docker-compose.yml
version: "2"

services:
  app:
    image: hello-world

で、

$ docker-compose up
Creating network "docker_test_default" with the default driver
Creating docker_test_app_1 ... done
Attaching to docker_test_app_1
app_1  | 
app_1  | Hello from Docker!
app_1  | This message shows that your installation appears to be working correctly.
app_1  | 
app_1  | To generate this message, Docker took the following steps:
app_1  |  1. The Docker client contacted the Docker daemon.
app_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
app_1  |     (arm64v8)
app_1  |  3. The Docker daemon created a new container from that image which runs the
app_1  |     executable that produces the output you are currently reading.
app_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
app_1  |     to your terminal.
app_1  | 
app_1  | To try something more ambitious, you can run an Ubuntu container with:
app_1  |  $ docker run -it ubuntu bash
app_1  | 
app_1  | Share images, automate workflows, and more with a free Docker ID:
app_1  |  https://hub.docker.com/
app_1  | 
app_1  | For more examples and ideas, visit:
app_1  |  https://docs.docker.com/get-started/
app_1  | 
docker_test_app_1 exited with code 0

$ docker-compose images
    Container       Repository     Tag       Image Id       Size  
------------------------------------------------------------------
docker_test_app_1   hello-world   latest   18e5af790473   9.136 kB

$ docker-compose ps
      Name          Command   State    Ports
--------------------------------------------
docker_test_app_1   /hello    Exit 0        

$ docker container ls -a
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                      PORTS     NAMES
5c4c5e2b5718   hello-world   "/hello"   About a minute ago   Exited (0) 53 seconds ago             docker_test_app_1

docker-composeのオプションとしては

$ docker-compose -h
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --profile NAME              Specify a profile to enable
  -c, --context NAME          Specify a context name
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --ansi (never|always|auto)  Control when to print ANSI control characters
  --no-ansi                   Do not print ANSI control characters (DEPRECATED)
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent (DEPRECATED)
  --env-file PATH             Specify an alternate environment file

Commands:
  build              Build or rebuild services
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove resources
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show version information and quit

となっている。
docker-compose up
を実行するとカレントディレクトリのDockerfile、docker-compose.ymlに従ってコンテナを作り、サービスを開始する。
逆に
docker-compose down
を実行するとサービスを停止し、コンテナを破棄する。

$ docker-compose down
Removing test_app_1 ... done
Removing network test_default

docker-compose stop
だとサービスの停止だけでコンテナは残るので
docker-compose start
でサービスをスタートする。

またdownでコンテナを破棄してもイメージは残っている。

$ docker image ls
REPOSITORY              TAG           IMAGE ID       CREATED         SIZE
hello-world             latest        18e5af790473   2 months ago    9.14kB

必要がなければ
docker image rm 18e
のようにイメージも削除

次はDockerfileとdocker-compose.ymlの中身について解きほぐす。