docker安装
https://docs.docker.com/engine/install/debian/
设置国内镜像
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
{
"registry-mirrors": [
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
重启docker
systemctl restart docker
查看是否成功
docker info
docker的网络模式
docker的四种网络模式:
Docker网络模型 | 配置 | 说明 |
---|---|---|
host模式 | –-network=host | 容器和宿主机共享Network namespace。 |
container模式 | –network=container:ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –network=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | –network=bridge | 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。(默认为该模式) |
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
案例:
docker run -d --network=host nginx
netstat -tunlp
curl 127.0.0.1
Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
案例:
docker run -itd --name centos centos
docker run -d --network "container:centos" --name nginx nginx
docker exec -it centos bash
curl 127.0.0.1
// 基于镜像centos:centos7创建一个名为centos的容器
[root@bogon ~]# docker run -itd --name centos centos:centos7
d497dd0765201ee7e6c65c7c5732cd5d252153ab64ed8a45afb036ac6f9528ae
// 基于镜像nginx:latest创建一个名为nginx的容器,使用container网络模式,和centos容器共享network namespace
[root@bogon ~]# docker run -d --network "container:centos" --name nginx nginx
25e3618f76477568a330df28c1768db61d50ecbebfb2d22f18bf6893b759efc2
[root@bogon ~]# docker exec -it centos bash
[root@d497dd076520 /]#
[root@d497dd076520 /]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
案例:
[root@bogon ~]# docker run -it --network=none centos bash
[root@207c8a237672 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
bridge模式
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
案例:
- 创建名为dzg的网桥
- 创建容器centos,使用dzg网桥
- 创建容器nginx,使用dzg网桥
- 容器centos内访问容器nginx看通不通
// 创建名为wyx的网桥,使用bridge模式
docker network create --driver bridge wyx
docker run -d --network wyx nginx
docker run -d --network wyx --name nginx nginx
docker run -itd --network wyx --name centos centos
docker ps
docker exec -it centos bash
curl 127.0.01
curl nginx
curl gracious_keller
[root@bogon ~]# docker network create --driver bridge wyx
d973f6c7f0cb264dd96873bcb89c39e954dd1da02816898f9a25de190596ef2d
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e090fb6ad251 bridge bridge local
ab7d0ceecd68 host host local
cc697cee3aab none null local
d973f6c7f0cb wyx bridge local
[root@bogon ~]# docker run -d --network wyx nginx
2f1708f47b7262331cd09f0a429123c5af5fea019c2bd53cad829c3585123a5e
[root@bogon ~]# docker run -d --network wyx --name nginx1 nginx
0af7caff76abf5f9f808809561b8c11e59558817298ab68776c932a36f44ca4f
[root@bogon ~]# docker run -itd --network wyx --name centos1 centos
b55321b6aed5d9828a02740128526016cdc0023579901b7518115b4cf687ea22
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b55321b6aed5 centos "/bin/bash" 4 seconds ago Up 3 seconds centos1
0af7caff76ab nginx "/docker-entrypoint.…" 40 seconds ago Up 38 seconds 80/tcp nginx1
2f1708f47b72 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp hardcore_euler
25e3618f7647 nginx "/docker-entrypoint.…" 37 minutes ago Up 37 minutes nginx
d497dd076520 centos:centos7 "/bin/bash" 40 minutes ago Up 40 minutes centos
d3eeb6236117 nginx "/docker-entrypoint.…" 47 minutes ago Up 47 minutes mystifying_lewin
7a79246a86c1 golang:latest "/bin/bash" 17 hours ago Up 17 hours golang
[root@bogon ~]# docker exec -it centos1 bash
[root@b55321b6aed5 /]# curl 127.0.0.1
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
[root@b55321b6aed5 /]# curl nginx1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@b55321b6aed5 /]# curl hardcore_euler
curl: (6) Could not resolve host: hardcore_euler
docker中创建网桥
要在Docker中创建一个网桥,可以使用以下命令:
docker network create --driver bridge <bridge-name>
其中,<bridge-name>
是您想要为网桥指定的名称,可以根据您的需要选择一个适当的名称。
例如,如果您要创建一个名为my-bridge
的网桥,可以执行以下命令:
docker network create --driver bridge my-bridge
执行该命令后,Docker将创建一个名为my-bridge
的网桥,并使其可供容器使用。
您还可以使用其他选项来自定义网桥的属性。例如,您可以指定子网、网关、IP范围等。以下是一个示例:
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 --ip-range 192.168.0.2/24 my-bridge
在上述示例中,我们使用--subnet
参数指定了子网,--gateway
参数指定了网关地址,--ip-range
参数指定了可用IP范围。
创建网桥后,您可以使用docker network ls
命令来列出所有可用的Docker网络,并验证是否成功创建了您指定的网桥。
docker network ls
创建网桥后,您可以在创建容器时使用--network
参数将容器连接到该网桥。
docker run --network=my-bridge <image>
请注意,网桥的名称在整个Docker环境中必须是唯一的。
镜像备份
备份命令:
docker save -o <备份文件名>.tar <镜像名>:<镜像标签>
例如:
// 提交修改为新的镜像
[root@localhost ~]# docker commit -m="update" -a="wyx" centos-wyx wyx/centos:v11
sha256:7441441b7d3a18c28dbd65264acd66e84d3ce0cbc7a7e41e5e4f696aad2c25da
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wyx/centos v11 7441441b7d3a 4 seconds ago 722MB
centos centos7 eeb6ee3f44bd 20 months ago 204MB
// 导出镜像
[root@localhost ~]# docker save -o wyx_centos.tar wyx/centos:v11
[root@localhost ~]# ls
anaconda-ks.cfg wyx_centos.tar
还原镜像命令:
docker load -i <备份文件名>.tar
例如:
// 删除镜像
[root@localhost ~]# docker rmi wyx/centos:v11
Untagged: wyx/centos:v11
Deleted: sha256:7441441b7d3a18c28dbd65264acd66e84d3ce0cbc7a7e41e5e4f696aad2c25da
Deleted: sha256:7b876d24a8c5c0c19331399c7a1daea5bafd74c93651c4266a715139f8cf0c89
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 eeb6ee3f44bd 20 months ago 204MB
// 导入镜像
[root@localhost ~]# docker load -i wyx_centos.tar
2a1dc067ebe6: Loading layer [==================================================>] 525.9MB/525.9MB
Loaded image: wyx/centos:v11
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wyx/centos v11 7441441b7d3a 4 minutes ago 722MB
centos centos7 eeb6ee3f44bd 20 months ago 204MB
容器快照
导出容器快照
docker export xxxid > xxx.tar
导入容器快照
cat xx.tar |docker import - test/xxx:v1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a01f5369421 nginx "/docker-entrypoint.…" 4 hours ago Up 50 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp nginx-wyx
230052e2c48e centos:centos7 "/bin/bash" 4 hours ago Up 46 minutes centos-wyx
// 导出容器备份
[root@localhost ~]# docker export centos-wyx > centos-weiyuexin.tar
[root@localhost ~]# ls
anaconda-ks.cfg centos-weiyuexin.tar
// 导入容器备份为镜像
[root@localhost ~]# cat centos-weiyuexin.tar |docker import - weiyuexin/centos:v666
sha256:abc0612f96b821c7e253798130fcf742cb9b092e52b9cc0619135f9614fabd9e
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
weiyuexin/centos v666 abc0612f96b8 4 seconds ago 573MB
centos latest 5d0da3dc9764 20 months ago 231MB
docker指定CPU和内存
修改CPU
[root@localhost ~]# docker update --cpus 2 nginx-wyx
nginx-wyx
修改内存限制
[root@localhost ~]# docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5a01f5369421 nginx-wyx 0.00% 3.191MiB / 7.638GiB 0.04% 2.58kB / 2.48kB 0B / 0B 5
230052e2c48e centos-wyx 0.00% 83.78MiB / 7.638GiB 1.07% 11.2MB / 95.7kB 12.7MB / 7.3MB 1
// 修改内存限制
[root@localhost ~]# docker update -m 2G --memory-swap -1 nginx-wyx
nginx-wyx
[root@localhost ~]# docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5a01f5369421 nginx-wyx 0.00% 3.191MiB / 2GiB 0.16% 2.58kB / 2.48kB 0B / 0B 5
230052e2c48e centos-wyx 0.00% 83.78MiB / 7.638GiB 1.07% 11.2MB / 95.7kB 12.7MB / 7.3MB 1
容器常用命令
启动容器
docker run -it nginx /bin/bash
后台运行 -d
查看容器运行状态
docker ps
-q 只显示容器id
-a 输出所有容器
指定端口映射
docker run -p <host-port>:<container-port> <image>
启动一个暂停运行的容器
docker start <容器id/name>
暂停容器
docker pause <容器id/name>
停止容器
docker stop <容器id/name>
进入容器
- docker attach 进入后退出时会停止容器
- docker exec 使用ctrl+d退出不会停止容器
docker exec -it <容器id/name> /bin/bash
导出容器快照
docker export xxxid > xxx.tar
导入容器快照
cat xx.tar |docker import - test/xxx:v1
删除容器
docker rm <容器id/name>
-f 强制删除
删除 所有未被 tag 标记和未被容器使用的镜像:
docker image prune
删除 所有未被容器使用的镜像:
docker container prune
删除所有未被挂载的卷
docker volume prune
删除所有网络
docker network prune
删除所有容器
docker system prune
清理所有处于终止状态的容器
docker prune
查看容器状态
docker stats
查看容器内的进程
docker top
统计容器信息
docker system df
查看容器标准输出
docker logs
-f 持续输出
–details 打印详细信息
-n 打印最近n 条日志
查看容器元数据信息
docker inspect <镜像>
查看镜像sha256 Hash值
docker images --digests
查看docker网络
docker network ls
查看容器映射端口
docker port
查看容器变更
docker diff
更新配置
docker update
参数 | 描述 |
---|---|
–blkio-weight | 块 IO(相对权重),介于 10 和 1000 之间,或 0 禁用(默认 0) |
–cpu-period | 限制 CPU CFS(完全公平调度器)周期 |
–cpu-quota | 限制 CPU CFS(完全公平调度器)配额 |
–cpu-rt-period | 以微秒为单位限制 CPU 实时周期 |
–cpu-rt-runtime | 以微秒为单位限制 CPU 实时运行时间 |
–cpu-shares,-c | CPU 份额(相对权重) |
–cpus | CPU数量 |
–cpuset-cpus | 允许执行的 CPU (0-3, 0,1) |
–cpuset-mems | 允许执行的 MEM (0-3, 0,1) |
–kernel-memory | 内核内存限制 |
–memory,-m | 内存限制 |
–memory-reservation | 内存软限制 |
–memory-swap | 交换限制等于内存加上交换:‘-1’ 启用无限交换 |
–pids-limit | 调整容器 pids 限制(设置 -1 表示无限制) |
–restart | 容器退出时应用的重启策略 |
拷贝文件
// 从主机复制到容器
docker cp host_path containerID:container_path
// 容器复制到主机
docker cp containerID:container_path host_path
-a 打包模式复制文件会带有原始信息的uid/gid 信息
-L 跟随软连接
启动所有镜像
docker start $(docker ps -a -q)
stop停止所有容器
docker stop $(docker ps -a -q)
remove删除所有容器
docker rm $(docker ps -a -q)
删除所有镜像
docker rmi $(docker images -q)
Docker开启远程API访问
vi /lib/systemd/system/docker.service
# -- 找到[Service]下面的:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# -- 改为如下:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
修改配置后重启
systemctl daemon-reload # 重新加载守护进程配置
systemctl restart docker.service # 重启 docker 服务