2022-11-01 · 4분
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 の協力で作成されました。
コメント
…