docker的使用

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上已经使用的端口就不能再用了,网络的隔离性不好。

image-20230613091756458

案例:
docker run -d --network=host nginx
netstat -tunlp
curl 127.0.0.1

image-20230613092404726

Container模式

​ 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

image-20230613092535411

案例:
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来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

image-20230613094958478

案例:
[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查看。

image-20230613095943419

案例:
  • 创建名为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,-cCPU 份额(相对权重)
–cpusCPU数量
–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 服务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值