2022-11-01 · 4분
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 协助完成。
评论
…