2022-11-01 · 4

Docker 基础

docker

这篇文章发布已超过两年,内容可能已过时。

安装 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 报错,输入下面的命令即可。

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 操作系统镜像

docker pull <image>:<version>

想要什么随便一敲都能行。输入 docker pull ubuntu:20.04 这样就可以。

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 一样逐个递增。

下面是创建网络的命令。

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 是网关,可以看到 IPv4 从 10.211.0.2 开始分配。想获取上面那样的 JSON 信息,输入 docker inspect <想查的 ID> 即可。容器和网络都可以。

之后还有 --link 之类的东西。掌握到这个程度,Docker 的功能应该都能用了。


原文(韩语): tistory — 发布于 2022-11-01,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

Docker 基础 · 나봄하랑