荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 1124|回复: 21

docker 简单使用

[复制链接]

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
发表于 2022-12-31 00:16 | 显示全部楼层 |阅读模式
https://www.runoob.com/docker/docker-container-usage.html

1.拉取容器
docker pull teddysun/l2tp
2.启动容器
docker run -d --privileged -p 500:500/udp -p 4500:4500/udp --name l2tp --restart=always --env-file /etc/l2tp.env -v /lib/modules:/lib/modules teddysun/l2tp
3.查看启动日志
docker logs l2tp
4.在容器内执行命令
docker exec -it l2tp 命令
输出的结果就类似于直接在docker这个虚拟机内输入命令一样


官方文档
https://docs.docker.com/engine/reference/commandline/ps/#format



docker的内核版本是跟随host的,刚刚才知道这点 uname -a


回复

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2022-12-31 00:17 | 显示全部楼层
列出所有在运行的docker
docker ps -a
docker stats 可选容器名  可查看容器的使用信息 CPU 内存 网络等等
docker inspect 容器名 可查看容器的详细配置信息,比如目录映射端口映射


启动容器
docker start b750bbbcfd88

结束容器
docker stop b750bbbcfd88

删除容器
docker container rm 容器名

列出所有镜像
docker images

显示容器内所有进程的PID
docker top 容器名

run 命令
https://www.runoob.com/docker/docker-run-command.html
常用启动参数讲解
docker run
-d                        后台运行容器,并返回容器ID;

-it                        以交互模式运行容器,通常与 -t 同时使用
                        为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-p 80:80/tcp                 指定端口映射,一般不建议这样弄,除非确定了端口以后永远不改了,我感觉在物理机上用iptables转发更合适
-p 443:443/tcp                 

--name web                 名字

--restart=always                 物理机重启以后本docker自动启动

-v /etc/http:/etc/http        映射文件夹
-v /var/www:/var/www        


rockylinux:9                镜像

/bin/bash                        一般用-it参数以后结尾用这个

组合起来就是:
docker run -d -it -p 80:80/tcp -p 443:443/tcp --name discuz --restart=always -v /etc/http:/etc/http -v /var/www:/var/www rockylinux:9 /bin/bash


-e TZ=Asia/Shanghai这个是指定docker的时区,建议加上,或者可以进docker再调整
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
一些镜像强制写死了UTC时区  需要用DockerFile重新编译镜像的时候设置时区为Asia/Shanghai
然后创建容器的时候用这个参数指定时间-v /etc/localtime:/etc/localtime:ro


--restart unless-stopped  这个是服务器重启以后docker自动启动的,这个是如果用户自己停止了,就不启动,否则就启动,感觉不错,建议加上这条


其他
--privileged                 用管理员权限运行,一般不建议这样做
--env-file /etc/l2tp.env         从指定文件读入环境变量
修改自动启动参数
docker container update --restart=unless-stopped 容器名字
always none




回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-1-22 20:19 | 显示全部楼层
windows server的docker
https://hub.docker.com/_/microsoft-windows-server

要求系统是windows server 2022
然后安装dockerwindows版本
然后拉取镜像docker pull mcr.microsoft.com/windows/server:ltsc2022
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-3-2 08:29 | 显示全部楼层
修改运行中的docker容器的端口映射

https://blog.csdn.net/weixin_42274846/article/details/127912450

修改容器配置文件,重启docker服务
我们需要新增一个端口,就是通过这个方式处理的,亲测有效。
首先关闭docker服务

1|systemctl stop docker
1
关闭之后,找到容器的配置文件路径,通常都是安装在这个路径下方

1|cd /var/lib/docker/containers
1
然后我们在ls查看一下容器,找我们想要修改的容器ID

修改容器中的 hostconfig.json 文件

如上图所示,文件中其中有一项是PortBindings:

8080/tcp对应的是容器内部的8080端口,
HostPort对应的是映射到宿主机的端口9190。
8361/tcp对应的是容器内部的8361端口,
HostPort对应的是映射到宿主机的端口9191。
按需修改端口,然后重启docker服务,再启动容器服务就可以了
————————————————
版权声明:本文为CSDN博主「是阿俏同学吖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42274846/article/details/127912450




最后一种方法:用iptables端口转发,这个作用于docker之前
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-3-2 13:33 | 显示全部楼层
修改容器的IP

先停止容器
cd /var/lib/docker/containers
然后找到容器的ID 进入对应的目录
编辑config.v2.json
"IPv4Address":"192.168.2.9"
这个就是IP修改就行了

####################################

修改容器的名字
docker rename 旧名字 新名字

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-5-2 09:29 | 显示全部楼层
用docker搭建魔力环境我研究成功了

docker pull centos:6.6
docker run -d -p 3306:3306/tcp -p 7651:7651/tcp --name moli --restart=always -v /home/moli:/home/moli -it centos:6.6 /bin/bash
docker exec -it moli bash
然后在容器里面配置环境

最后停止容器
然后把这个容器导出
docker export c14964944d94 > /root/moli.tar

导入容器的命令
cat /root/moli.tar | docker import - moli:moli
最后用这个导入的容器创建魔力容器就好了

这样就可以在所有版本的64位centos上部署了
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-5-20 15:15 | 显示全部楼层
拉取centos 6.10的镜像
docker pull centos:6.10

默认拉取的是64位的

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-5-26 22:29 | 显示全部楼层
docker只允许内部容器互访但是容器不能访问外网

首先创建网络
docker network create -d bridge mynet --subnet=192.168.20.0/24

然后添加iptbles规则
iptables -I DOCKER-USER 1 -s 192.168.20.0/24 -d 192.168.20.0/24 -j ACCEPT
iptables -I DOCKER-USER 2 -s 192.168.20.0/24 -j DROP
这样就可以了容器互相之间可以互访,容器也能访问物理机,但是容器不能上网


如果需要放行某个IP访问外网可以这样
iptables -I DOCKER-USER 1 -s 192.168.20.0/24 -d 192.168.20.0/24 -j ACCEPT
iptables -I DOCKER-USER 2 -s 192.168.20.2 -j ACCEPT #允许这个IP访问外网
iptables -I DOCKER-USER 3 -s 192.168.20.0/24 -j DROP


如果希望容器可以被外网连接,但是容器不能主动连接外网可以这样
这个模式不要轻易使用,一般来说,只有确定容器自己本身不需要访问外网,但是外网可以访问容器的时候才可以这样
iptables -I DOCKER-USER 1 -s 192.168.20.0/24 -m state --state RELATED,ESTABLISHED -j RETURN #这里估计写ACCEPT性能更好
iptables -I DOCKER-USER 2 -s 192.168.20.0/24 -d 192.168.20.0/24 -j ACCEPT
iptables -I DOCKER-USER 3 -s 192.168.20.0/24 -j DROP

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-5-28 16:58 | 显示全部楼层
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Size}}\t{{.Ports}}"
输出选择的字段

https://docs.docker.com/engine/reference/commandline/ps/#format


另外可以设置别名
vi .bashrc
  1. alias dockerps='docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Size}}\t{{.Ports}}"'
复制代码
然后
source ~/.bashrc

这样后面直接输入dockerps就是以指定的格式显示了
注意:别名不能带空格
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-5-28 18:04 | 显示全部楼层
docker network create -d bridge docker_bridge_192_168_21 --subnet=192.168.21.0/24

docker安装rustdesk
github链接
https://github.com/rustdesk/rustdesk

docker image pull rustdesk/rustdesk-server

docker run --name rustdesk_hbbs_4 \
-p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 \
-v /root/docker/rustdesk/hbbs:/root \
-td \
--network=docker_bridge_192_168_21 --ip=192.168.21.4 \
-e TZ=Asia/Shanghai \
rustdesk/rustdesk-server hbbs -r 1.2.3.4:21117
#注意,这里的-r参数一定要填外网IP

docker run --name rustdesk_hbbr_5 \
-p 21117:21117 -p 21119:21119 \
-v /root/docker/rustdesk/hbbr:/root \
-td \
--network=docker_bridge_192_168_21 --ip=192.168.21.5 \
-e TZ=Asia/Shanghai \
rustdesk/rustdesk-server hbbr

然后防火墙打开这几个端口
TCP:21115-21119
UDP:21116


使用方式:
首先下载客户端
https://github.com/rustdesk/rust ... ws_x64-portable.zip

然后解压,把exe文件按照这个方式重命名
rustdesk-host=1.2.3.4,key=0j61WjXmKIt5PKpYueJEQpses+KgtUltgnb2GDf4Xzw=.exe
(cat /root/docker/rustdesk/hbbs/*.pub   这一串就是key)

最后把这个软件发给被控端


1.被控端运行软件
2.主控端运行软件 输入被控端的ID 点击连接
3.被控端点击接受
这样就可以控制了

默认只能复制粘贴剪切板的文本   不能复制粘贴文件,主控端最上面菜单栏有一个电脑图标,点击,勾选允许复制粘贴文件 就可以了
设置是默认保存的

暂时没看到限制游客的方式,所以如果是临时用,可以临时启动docker,不用的时候就关掉
不然任何人只要知道了IP和KEY都可以用你自建的服务器

被控端可以把软件安装为服务,这样就可以任何时候都能连接了,可以顺便修改密码,这样主控端直接输入密码就可以连接了

简单的使用了一下,我用腾讯云内地的云服务器和阿里云香港的云服务器都试了试,都没问题

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-6-7 18:37 | 显示全部楼层
macvlan网络
https://zhuanlan.zhihu.com/p/616504632

简单的解释就是相当于在物理网卡上添加了一个交换机(macvlan有几种模式,默认模式是这样)
然后公司其他的电脑设置和这个macvlan同一个网段的IP就能直接ping通docker的容器


很奇怪,为什么我测试的时候ping不通呢  


docker network create -d macvlan --subnet=192.168.11.0/24 --gateway=192.168.11.3 -o parent=eth0 -o macvlan_mode=bridge macvlan20

开启混杂模式
ip link set eth0 promisc on
ifconfig eth0 promisc

docker network disconnect macvlan20 test
docker network connect macvlan20 test


docker run -dit --name test2 --net macvlan20 --ip 192.168.11.11 centos:6.6 bash



很奇怪,我的物理网络就是11网段的 但是这样创建的docker根本ping不通
难道是因为我的hyper-v用的是内部网络?
研究了好几个小时,openwrt必须要用macvlan
然而用hyper-v装的rockylinux8 和9 都不支持macvlan 创建了以后都还是ping不通
我估计可能必须要物理机也是linux系统 然后装docker才可以使用macvlan  






#######################################

测试IPVLAN
docker network create -d ipvlan --subnet=192.168.11.0/24 --gateway=192.168.11.3 -o parent=eth0 -o ipvlan_mode=l2 ipvlan

docker run -dit --name test --net ipvlan --ip 192.168.11.1 centos:6.6 bash

效果就是局域网内的机器可以直接ping通docker

IPVLAN默认l2模式 下面是docker的文档介绍
https://docs.docker.com/network/drivers/ipvlan/





#####################################

ipvlan和macvlan的区别
https://blog.csdn.net/lsz137105/article/details/100596277

两者都是默认的情况下 区别就是ipvlan的mac地址是和父接口一样的







回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-6-7 18:44 | 显示全部楼层
修改容器的网卡
docker network disconnect nat1 D2GS1
docker network connect nat1 D2GS1
docker start D2GS1
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-6-7 21:27 | 显示全部楼层
https://blog.csdn.net/yabingshi_tech/article/details/125636666
修改docker的默认网段

vi /etc/docker/daemon.json

{
"bip":"192.168.0.1/24"
}

然后重启docker服务
systemctl restart docker
这个时候输入ip addr查看就是修改后的IP了


测试
docker run -dit --name test2 --network bridge --ip 192.168.22.2 centos:6.6 bash
docker run -dit --name test3 --network bridge --ip 192.168.22.3 centos:6.6 bash

提示错误
docker: Error response from daemon: user specified IP address is supported on user defined networks only.

看来想固定IP就只能用户自己创建network了

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-6-7 22:14 | 显示全部楼层
测试host网络
docker run -dit --name test --network host centos:6.6 bash

docker文档
https://docs.docker.com/network/drivers/host/

差不多明白了,host模式就是直接用主机的各种网路信息,同时不需要-p参数进行端口映射
一般不建议用host模式 不太安全 相当于完全把容器暴露在外面,万一容器里面有漏洞就很容易被利用

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-6-7 22:35 | 显示全部楼层
为容器添加多个网卡
必须在容器创建好以后再额外添加网卡 因为run只能有一个--network参数
docker network connect macvlan test
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-7-27 04:30 | 显示全部楼层
复制文件

# 本地到容器
docker cp 本地路径 容器id或者容器名字:容器内路径

# 容器到本地
docker cp 容器id或者容器名字:容器内路径 本地路径

个人建议创建docker的时候加个-v 映射一下路径就更方便了
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-1-15 17:29 | 显示全部楼层
docker导出镜像和导入镜像 方便迁移
docker导出镜像和导入镜像 方便迁移
https://docs.docker.com/reference/cli/docker/image/save/
docker save weejewel/wg-easy:latest | gzip > /root/docker-image/weejewel-wg-easy.tar.gz
docker save rustdesk/rustdesk-server:latest | gzip > /root/docker-image/rustdesk-rustdesk-server.tar.gz
docker save teddysun/l2tp:latest | gzip > /root/docker-image/teddysun-l2tp.tar.gz

https://docs.docker.com/reference/cli/docker/image/load/
docker load < /root/docker-image/weejewel-wg-easy.tar.gz
docker load < /root/docker-image/rustdesk-rustdesk-server.tar.gz
docker load < /root/docker-image/teddysun-l2tp.tar.gz
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-1-25 19:29 | 显示全部楼层
Docker绑定指定CPU核心

需求#
使用多个Container并行任务希望可以对CPU不同核心进行负载均衡。

实现#
可以通过cpuset-cpus参数进行资源管理

docker run --rm -it --cpuset-cpus 8-15 ubuntu:18.04 nproc

https://docs.docker.com/engine/containers/resource_constraints/

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-3-25 17:51 | 显示全部楼层
假设服务器只有1个网卡
然后默认IP是1.1.1.2/24 网关1.1.1.1
然后我们手动添加了另外一个IP 1.1.1.3/24

我们希望某一个docker容器通过1.1.1.3访问外网

方法如下:

首先创建一个网段
docker network create -d bridge docker_bridge_192_168_22 --subnet=192.168.22.0/24
然后关键的来了,用下面这个命令创建SNAT规则,让这个网段全部走1.1.1.3
iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -o eth0 -j SNAT --to-source 1.1.1.3

最后FORWARD链放行
iptables -A FORWARD -s 192.168.21.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.21.0/24 -i eth0 -j ACCEPT
一般来说我建议FORWARD直接全部ACCEPT就行
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-3-25 18:09 | 显示全部楼层
docker容器实现IPV4和IPV6共存


首先开启IPV6,一般现在的系统都默认开启了

编辑 Docker 守护进程配置文件,通常位于 /etc/docker/daemon.json(如果文件不存在则创建),添加如下内容:
{
    "ipv6": true,
    "fixed-cidr-v6": "FD00::/64",
    "experimental": true
}

ipv6:设置为 true 表示开启 Docker 的 IPv6 支持。
fixed-cidr-v6:指定一个 IPv6 子网,你可以根据实际情况修改这个值。
experimental:设置为 true 以启用实验性特性。

配置完成后,重启 Docker 服务:
systemctl restart docker

使用 docker network create 命令创建一个同时支持 IPv4 和 IPv6 的自定义网络。
下面的IPV6我用的内网地址,因为这符合IPV4的使用习惯
IPV6使用NAT6的方式
如果不用NAT6 那么应该是可以直接用公网IP的
一般来说机房分配的都是一个/64的,用户可以自己拆分子网

docker network create --ipv6 \
  --subnet=192.168.100.0/24 \
  --gateway=192.168.100.1 \
  --subnet=FD00:1::/64 \
  --gateway=FD00:1::1 \
  my_ipv4_ipv6_network

我问AI,回答说尽量用上面写的fixed-cidr-v6的子网段

--ipv6:表示开启网络的 IPv6 支持。
--subnet:可以多次使用该参数,分别指定 IPv4 和 IPv6 子网。
--gateway:同样可以多次使用,分别指定 IPv4 和 IPv6 网关。

使用 docker run 命令运行容器,并将其连接到刚才创建的自定义网络。
docker run -it \
  --network=my_ipv4_ipv6_network \
  --ip=192.168.100.10 \
  --ip6=2001:db8:1::10 \
  your_image_name


这个方法我还没测试过,因为目前国内的IPV6还不是很完善
先放这里吧,以后有需要可以看

回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-4-15 05:21 | 显示全部楼层
用Dockerfile编译wireguard
mkdir -p /root/docker/wireguard/
cd /root/docker/wireguard/
vi Dockerfile

  1. # 使用 Rocky Linux 作为基础镜像
  2. FROM rockylinux:8.9

  3. # 更新系统并安装必要的软件包
  4. RUN dnf -y update && \
  5.     dnf -y install epel-release && \
  6.     dnf -y copr enable jdoss/wireguard && \
  7.     dnf -y install wireguard-tools iptables iproute && \
  8.     dnf clean all

  9. # 创建 WireGuard 配置目录
  10. RUN mkdir -p /etc/wireguard

  11. # 暴露 WireGuard 默认端口
  12. EXPOSE 51820/udp

  13. # 启动 WireGuard 服务的命令
  14. CMD ["wg-quick", "up", "wg0"]
  15.    
复制代码


docker build -t wireguard-container .

最后
创建容器
docker run \
-d \
--name=wireguard \
-v /root/docker/wireguard/config/:/etc/wireguard/ \
--cap-add=NET_ADMIN \
--sysctl="net.ipv4.ip_forward=1" \
-p 4502:51820/udp \
--restart unless-stopped \
wireguard-container



回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2025-4-30 17:29 | 显示全部楼层
  1. `/var/lib/docker/overlay2`目录存储了Docker容器的镜像层和容器层数据,随着时间的推移和容器、镜像的不断创建和删除,该目录可能会变得很大。以下是一些清理该目录的方法:

  2. ### 清理无用镜像
  3. - **查看镜像占用空间**:使用`docker system df -v`命令可以查看镜像、容器、数据卷等占用的空间情况,找到占用空间较大的镜像。
  4. - **删除悬空镜像**:悬空镜像是指没有被任何容器引用,且没有标签的镜像。可以使用`docker image prune -a`命令来删除悬空镜像。
  5. - **删除指定镜像**:如果确定某些镜像不再使用,可以使用`docker rmi <镜像名称或ID>`命令来删除指定的镜像。

  6. ### 清理停止的容器
  7. - **查看容器列表**:使用`docker ps -a`命令查看所有容器,包括正在运行和已停止的容器。
  8. - **删除停止的容器**:使用`docker container prune`命令可以删除所有已停止的容器。也可以使用`docker rm <容器名称或ID>`命令来删除指定的停止状态的容器。

  9. ### 清理未使用的数据卷
  10. - **查看数据卷列表**:使用`docker volume ls`命令查看所有数据卷。
  11. - **删除未使用的数据卷**:使用`docker volume prune`命令可以删除所有未被容器使用的数据卷。

  12. ### 清理缓存
  13. - Docker会缓存一些镜像和构建过程中的临时文件,可以使用`docker builder prune`命令来清理构建缓存。

  14. 在进行上述操作时要谨慎,确保不会误删有用的数据和镜像。如果对某些操作不确定,建议先备份重要数据。此外,还可以定期执行这些清理操作,以保持`/var/lib/docker/overlay2`目录的空间占用在合理范围内。
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2025-6-18 07:27 , Processed in 0.016775 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表