2022-11-01 · 4

Docker の基本

docker

この記事は公開から2年以上経過しています。

Docker のインストール

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
  sudo apt-get update

もし apt-get update がエラーになったら、下のコマンドを入力すれば OK です。

sudo chmod a+r /etc/apt/keyrings/docker.gpg
sudo apt-get update

その後、下のコマンドでインストールを完了します。

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker の OS イメージをダウンロード

docker pull <image>:<version>

欲しいものを適当に打ったら全部いけました。docker pull ubuntu:20.04 のように入力すれば OK です。

docker images

上のコマンドでダウンロードしたイメージを確認できます。

Docker を実行する

docker run -itd --name <name> --net <network adapter> -p <src port>:<dst port> [-p...] <image name> /bin/bash

少し長めに書くと上のように使えます。こうして作ったコンテナには下のコマンドで入れます。

docker attach <container name || container ID>

OR

docker exec -it <container name || container ID> /bin/bash

docker exec -it server /bin/bash

そして抜けるとき exit を打って出るとコンテナが終了します。それが嫌なら control + p + q を入力すればそのまま抜けられます。

docker ps [ -a]

上のコマンドで現在実行中のコンテナを見られます。

docker ps

docker stop <container name || container ID>

docker rm <container name || container ID>

docker start <container name || container ID>

実行中のコンテナは stop で停止できます。しかし停止させて終わりではありません。docker ps -a で確認すると残っているため、同名では新規作成できません。そんなときは rm で完全に削除します。もし誤って exit などを打って抜けてしまったら、start で再実行できます。

ところがいざコンテナに入ると vim もなく ifconfig もなく systemctl もありません。ただし下のようなコマンドでやれば systemctl は解決できます。

docker run -itd --name server --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --net Anet -p 0.0.0.0:2222:22 -p 0.0.0.0:80:80 -p 0.0.0.0:53:53 ubuntu20 /usr/sbin/init

--privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro の部分と /usr/sbin/init は必須で入れる必要があります。権限を与えると考えると分かりやすいです。

ポートを 0.0.0.0:2222:22 のようにオプションで与えると、この Docker サーバー内の SSH は 22 番ポートですが、外部から接続するには 2222 番ポートに接続すれば、ポートフォワーディングで Docker 内の 22 番ポートへ渡してくれます。

上の写真のように systemctl コマンドがきちんと効いているのが分かります。こうしてこそ systemctl enable <service> が可能になり、コンテナを起動した瞬間にサービスも立ち上がります。

Docker ネットワーク管理

現在あるネットワークについて表示します。docker run コマンドで --net <NETWORK ID | NAME> を書かなかった場合、デフォルトで bridge に設定されます。この場合のデフォルト Docker の IPv4 は以下の通りです。

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
    inet6 fe80::42:b4ff:fe53:a7a7  prefixlen 64  scopeid 0x20<link>
    ether 02:42:b4:53:a7:a7  txqueuelen 0  (Ethernet)
    RX packets 1323  bytes 56348 (56.3 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1522  bytes 1821313 (1.8 MB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

172.17.0.1 で、net を設定しなければそこから 172.17.0.2 のように 1 つずつ増えていきます。

下はネットワークを生成するコマンドです。

docker network create --subnet <network arange> --gateway <gateway Ipv4> <NETWORK NAME>

例として docker network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 netcard のように入力すると設定した IP どおりに作られ、docker run --net netcard のように入ると IP が 192.168.10.1 のように入ります。

上で例として作ったものの IP をお見せします。

root@ubuntu:~# docker inspect Anet
[
    {
        "Name": "Anet",
        "Id": "56c10b9b13534d94e05af9cd430fab03bf6cdb6ee11e0978c12a96b0833f73ad",
        "Created": "2022-11-01T14:21:51.268503946+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.211.0.0/24",
                    "Gateway": "10.211.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "a9477816e0a083260fbe53bfc50fc2603669da7fbee6979c80cf0df1d03dab36": {
                "Name": "server",
                "EndpointID": "7aca5c8a4b0ecad82cb435819ec1ea96c5dab7ab74cb50f1b74992e3971ec59f",
                "MacAddress": "02:42:0a:d3:00:02",
                "IPv4Address": "10.211.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

IPv4 の情報は上の JSON の通りで、10.211.0.1 が gateway のため IPv4 は 10.211.0.2 から割り当てられているのが分かります。上のような JSON 情報を知るには docker inspect <知りたい情報の ID> を入力すれば OK です。コンテナでもネットワークでも使えます。

この先には --link のようなものもあります。これくらい知っていれば Docker の機能は全部使えると思います。


原文(韓国語): tistory — 2022-11-01 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。

コメント

コメントを削除しますか?

Docker の基本 · 나봄하랑