docker使用心得

Docker使用心得体会,主要涉及一些有关docker的配置服务🙄

Docker网络部分

查看所有容器的IP地址

1
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

查看所有docker网络所在的网段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker network ls --format "{{.ID}} {{.Name}}" | while read id name; do
echo "Network: $name"
# 使用 docker network inspect 并通过 awk 和 tr 来解析 JSON 输出
docker network inspect $id --format='{{json .IPAM.Config}}' |
awk '{
gsub(/[$${}]/, ""); # 移除 JSON 数组和对象的括号
n = split($0, a, ","); # 按逗号分割字符串
for (i = 1; i <= n; i++) {
if (a[i] ~ /"Subnet"/) {
sub(/^"Subnet":/, " Subnet:", a[i]);
print a[i];
}
if (a[i] ~ /"Gateway"/) {
sub(/^"Gateway":/, " Gateway:", a[i]);
print a[i];
}
}
}' | tr -d '"' # 删除双引号
done

设置代理

新建文件夹

1
sudo mkdir -p /etc/systemd/system/docker.service.d

新建文件

1
touch /etc/systemd/system/docker.service.d/http-proxy.conf

使用nano编辑

1
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

写入

1
2
3
[Service]
Environment="HTTP_PROXY=http://192.168.10.50:7890"
Environment="HTTPS_PROXY=https://192.168.10.50:7890"

重启docker

1
2
sudo systemctl daemon-reload
sudo systemctl daemon-reload

Docker Pull设置Proxy

新建daemon.json

1
sudo nano /etc/docker/daemon.json

复制如下内容,保持

1
2
3
4
5
6
7
{
"proxies": {
"http-proxy": "http://hinas-v4.ninglang.top:7891",
"https-proxy": "http://hinas-v4.ninglang.top:7891",
"no-proxy": "localhost,127.0.0.1"
}
}

执行如下命令

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

查看是否生效(如果没在docker组则需要加sudo)

1
docker info | grep -i proxy

设置用户为docker用户组

查看是否有docker用户组

1
getent group docker
查看是否有docker用户组
查看是否有docker用户组

如果有,就会显示如图的docker,如果没有,则采用sudo创建docker用户组

1
sudo groupadd docker

更新用户组信息

1
newgrp docker

将当前用户添加至docker组:

1
sudo usermod -aG docker username

1. ikuai搭建webdav

安装webdav

镜像:bytemark/webdav:latest

目录挂载:/seafile/smb/music/var/lib/dav/data

环境变量:

USERNAME

PASSWORD

LOCATION

AUTH_TYPE:Basic

修改编码为utf8

1
vi conf/conf-enabled/dav.conf

修改为utf8

1
2
3
4
5
6
7
8
9
10
11
12
<Directory "/var/lib/dav/data/">
Dav On
Options Indexes FollowSymLinks

AuthType Basic
AuthName "WebDAV"
IndexOptions Charset=utf-8 <-----------添加这一行
AuthUserFile "/user.passwd"
<RequireAny>
Require valid-user
</RequireAny>
</Directory>

2. 配置alpine-linux

换源

更换为UESTC源

1
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

执行update

1
apk update

安装openrc

1
apk add openrc

添加 auto-docker 为自启动

1
rc-update add auto-docker

/etc/loacal.d/中添加start结尾的脚本,如docker.start,内容如下

1
2
3
if [ -f /root/script/ping.sh ]; then
/root/script/ping.sh
fi

更新一下

1
rc-update add local

3.Ubuntu-ssh的相关配置

STEP1:安装openssh-server

1.更新源

1
apt update

2.安装openssh-server

1
apt install openssh-server

对于Alpine-linux,则用下面命令安装

1
apk add --update openssh-server

还需安装openrc

1
apk add openrc

STEP2:设置允许root登录

设置/etc/ssh/sshd_config

追加如下指令

-- PermitRootLogin yes

NGINX-Docker无法使用apt问题

:star:先换源

1
cd /etc/apt

生成source文件

1
touch  sources.list

写入源

1
2
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >>sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>sources.list

删除缓存

1
rm -fR /var/lib/apt/lists/*

在更新

1
apt-get update

自动ping脚本,适用于ikuai的ipv6问题

1
2
3
4
while true; do
ping -c 1 -v6 -w 1 www.baidu.com > /dev/null
sleep 15
done &

4.seafile6.3.4安装(爱快)

这是一篇有关使用ikuai搭建6.3.4的博客,并且实现了ipv6的访问

step1: 安装seafile-docker

下载seafileltd/seafile:latest镜像

image-20240120202506712
image-20240120202506712

在容器设置中挂载目录

  • /shared

如下环境变量设置账号和密码

  • SEAFILE_ADMIN_EMAIL
  • SEAFILE_ADMIN_PASSWORD

step2:安装 iputils-ping

因为docker中的ipv6如果不往外界发出信号,路由是无法知道该容器的ipv6地址,所以需要安装ping工具每隔一段时间不断发包,表示心跳

1.更新apt包

1
apt update

2.安装iputils-ping

1
apt-get install -y iputils-ping

3.测试ping百度

1
ping -6 -c 1 www.baidu.com

3.编写/root/script/ping.sh

1
2
3
4
while true; do
ping -c 1 -6 www.baidu.com > /dev/null
sleep 15
done &

4.修改ping.sh为可执行文件

1
chmod +x /root/script/ping.sh

5.测试脚本执行情况:如下执行成功

image-202401202037177586.修改自启动脚本

/root/.bashrc中追加

1
2
3
if [ -f /root/script/ping.sh ]; then
/root/script/ping.sh
fi

一般而言,由于seafile不自动开bash,因此,建议将上述加入.bashrc加入到seafile-server-latest/seafile.sh中,添加到echo "Seafile server started"的前面.

step3:设置nginx反向代理

1.创建/etc/nginx/conf.d/seafile.conf,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
server {
listen [::]:80;
server_name seafile.ninglang.fun;

proxy_set_header X-Forwarded-For $remote_addr;

location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_read_timeout 1200s;

# used for view/edit office file via Office Online Server
client_max_body_size 0;

access_log /var/log/nginx/seahub.access.log;
error_log /var/log/nginx/seahub.error.log;
}


location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:8082;
client_max_body_size 0;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;

send_timeout 36000s;
}

location /seafdav {
fastcgi_pass 127.0.0.1:8080;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
client_max_body_size 0;
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
send_timeout 36000s;

# This option is only available for Nginx >= 1.8.0. See more details below.
proxy_request_buffering off;
access_log /var/log/nginx/seafdav.access.log;
error_log /var/log/nginx/seafdav.error.log;
}

}

2.测试文件格式正常

1
2
3
4
nginx -t

#nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
#nginx: configuration file /etc/nginx/nginx.conf test is successful

重启docker容器

step4:设置seafile

修改SERVICE_URLFILE_SERVER_ROOT

SERVICE_URL:http://seafile.ninglang.fun

FILE_SERVER_ROOT:http://seafile.ninglang.fun/seafhttp

step5:设置seafdav

设置/conf/seafdav.conf中为

1
2
3
4
enabled = true
port = 8080
fastcgi = true
share_name = /seafdav

在手机端设置

网络地址:seafile.ninglang.fun/seafdav

账号密码如实填写

5.实现利用clashproxy和tailscale实现代理

下载clash部分

下载地址为

1
http://192.168.10.14/ikuai_ddns_route_docker/clash_docker.tar

启动docker命令

1
docker run -itd --name=clash --restart always -v /home/ninglang/clash/clash.yaml:/root/.config/clash/config.yaml -p 7895:7890 -p 8082:8080 laoyutang/clash-and-dashboard:latest

进入8082端口修改连接模式为直接连接

下载tailscale部分

镜像下载地址为

1
http://192.168.10.14/Docker-Linux/tailscale.tar.gz

启动容器,进行下载

1
docker run -itd --name=tailscale --restart always --network=host --env TS_AUTHKEY=tskey-auth-kgN8f7wMiF11CNTRL-udpA8Q8T25WoFgtSaQDj4W83NPHoeuR1 tailscale/tailscale:latest

设置squid代理

1
docker run --name squid -d --restart=always --publish 3128:3128 --volume /home/yzmin/software/squid:/etc/squid/ ubuntu/squid:latest

设置Lucky实现域名解析和Nginx代理

1
docker run -d --name lucky --restart=always --net=host -v /home/yzmin/software/luckyconf:/goodluck gdy666/lucky

(2025-05-27更新)

mihomo-yacd.tar.gz

这是最新的clash—meta模块,项目地址如liheji/mihomo-yacd,dockerhub链接为yilee01/mihomo-yacd - Docker Image | Docker Hub。dockercompose文件

1
2
3
4
5
6
7
8
9
10
11
version: '3.3'
services:
mihomo:
container_name: mihomo
image: yilee01/mihomo-yacd:latest
ports:
- 7891:7890
- 8080:8080
volumes:
- ./config:/root/.config/mihomo
restart: always

配置文件为config.yaml,位于./config/config.yaml

对clash进行配置

一般来说,可以将sock5和http端口混合,然后放在7890端口传输,在proxies 之上写入如下内容即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
port: 0
socks-port: 0
redir-port: 0
mixed-port: 7890
allow-lan: true
unified-delay: true
mode: rule
log-level: info
ipv6: true
external-controller: 0.0.0.0:9090
clash-for-android:
append-system-dns: false
profile:
tracing: true
experimental:
sniff-tls-sni: true

如果说需要修改为direct之类的,请参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
port: 0
socks-port: 0
redir-port: 0
mixed-port: 7890
allow-lan: true
unified-delay: true
mode: direct
log-level: info
ipv6: true
external-controller: 0.0.0.0:9090
clash-for-android:
append-system-dns: false
profile:
tracing: true
experimental:
sniff-tls-sni: true

6.Docker-Linux实现文件迁移

第一步挂载硬盘

首先,先挂载新的硬盘,详细教程主要查阅5分钟的Linux-挂载新磁盘扩容_哔哩哔哩_bilibili

1
sudo lsblk
image-20241210190513980
image-20241210190513980

上图中可以看出sdb没能实现挂载,sda有三个分区,因此,首先需要对sdb分区,再挂载

分区

使用如下命令

1
fdisk /dev/sdb

查看help,选择新建分区

1
n

分区类型选择主分区

1
p

分区数量:1

分区开始点:回车默认

分区结束点:回车默认

输入w保存配置

查看是否分区

1
sudo lsblk
image-20241210190932695
image-20241210190932695

显然sdb1分区成功

格式化分区

输入如下进行格式化分区sdb

1
sudo mkfs.ext4 /dev/sdb1

挂载分区

新建一个文件夹/data

1
mkdir /data

挂载分区

1
sudo mount /dev/sdb1 /data

查看挂载情况

1
sudo lsblk
image-20241210191252553
image-20241210191252553

可以看出sdb1挂载成功

解决开机磁盘丢失

获取sdb1的UUID

1
sudo blkid /dev/sdb1

将UUID写入/etc/fstab

1
UUID=XXX /data ext4 defaults 0 0

保存即可

停止docker

参阅docker服务如何正确关停_关闭docker-CSDN博客,docker由于有docker.socket服务。无法直接关停,直接关停docker会自动重启,故需要先关闭docker.socket

1
systemctl stop docker.socket

再关闭docker.service

1
systemctl stop docker.service

迁移docker

参阅两种方法迁移 Docker 的默认安装(存储)目录【转载】_镜像lib 移动 软链-CSDN博客

首先对查看docker的根目录

1
sudo docker info | grep "Docker Root Dir"

若为/var/lib/docker,则将该目录中为文件复制到/data/dokcer

1
cp -a /var/lib/docker /data/docker/

修改/etc/docker/daemon.json

1
2
3
{
"data-root": "/data/docker/docker",
}

重启docker

1
systemctl restart docker

7.个人自建分享站webfileshare

使用apache自建的简单分享站,支持x86_64,映射/usr/local/apache2/htdocs/即可,80端口

1
docker run -itd -p 80:80 -v ./:/usr/local/apache2/htdocs/ --name webfileshare webfileshare:1.1

镜像地址为webfileshare.

8.个人博客

使用hexo实现,直接映射/root/blog即可,地址Release Hexo Blog · yzmninglang/docker-images

9.剪切板同步

中转模式使用说明 | ClipShare

Docker-Compose使用

Docker-Compose使用方法概述

YAML语法

参考文献:

对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格

-开头的行表示构成一个数组,没有-开头的表示字典

1
2
3
- A
- B
- C

其中,YAML与其对应的数据结构如图:

1
2
3
4
5
6
7
8
9
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W

其对应的数据结构如下图:

1
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

再例如,YAMLJSON数据的转化

1
2
3
4
5
6
7
8
9
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org

使用yaml转JSON的网站进行转化:在线YAML转JSON,对应的JSON为:

1
2
3
4
5
6
7
8
9
{ 
languages: [ 'Ruby', 'Perl', 'Python'],
websites: {
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}

Dokcer-Compose结构

参考文献:

文件命名:docker-compose.yml

命令:docker-compose up

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

该 Compose 文件定义了两个服务:web 和 redis

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

以Ubuntu20.04:1.2镜像创建为例

创建一个BS1的镜像,需要注意的是,这里的ubuntu2004:1.2由于是自己创建的,没有执行任何任务,所以将会导致创建运行之后会自动退出,并且显示exit 0,因此,我们可以加一条command:tail -f /dev/null来阻止compose运行完成之后自动退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: '3.8'

services:
BS1:
image: ubuntu2004:1.2
container_name: BS1
volumes:
- ./BS1:/root/code
networks:
DPFL-network:
ipv4_address: 192.168.58.3
command: bash -c "source /root/.bashrc && tail -f /dev/null"
BS2:
image: ubuntu2004:1.2
container_name: BS2
volumes:
- ./BS2:/root/code
networks:
DPFL-network:
ipv4_address: 192.168.58.4
command: bash -c "source /root/.bashrc && tail -f /dev/null"
BS3:
image: ubuntu2004:1.2
container_name: BS3
volumes:
- ./BS3:/root/code
networks:
DPFL-network:
ipv4_address: 192.168.58.5
command: bash -c "source /root/.bashrc && tail -f /dev/null"
CS1:
image: ubuntu2004:1.2
container_name: CS1
volumes:
- ./CS1:/root/code
networks:
DPFL-network:
ipv4_address: 192.168.58.6
command: bash -c "source /root/.bashrc && tail -f /dev/null"

networks:
DPFL-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.58.0/24

创建适用于Ikuai的dockerImage

务必记住Ikuai的docker对python的环境有要求

使用ubuntu20.04安装

  • 先安装miniconda
  • 在pip装包
  • 最后运行,一定不出错

使用dockerfile构建

  • 请务必认证alpine,这一点非常重要
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用官方Python镜像作为基础镜像
FROM python:3.11.14-alpine
# 设置工作目录
WORKDIR /app
# 复制requirements.txt并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 创建必要的目录
RUN mkdir -p downloads static templates
# 声明一个挂载点
VOLUME ["/app/downloads"]
# 暴露端口
EXPOSE 8009
# 运行应用
CMD ["python", "main.py"]

其中的require如下

1
2
3
4
5
6
fastapi==0.104.1
uvicorn==0.24.0
jinja2==3.1.2
sqlalchemy==2.0.23
requests==2.31.0
python-multipart==0.0.6

设计seafile同步镜像

执行如下命令

1
2
3
4
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/seafile-keyring.asc] https://linux-clients.seafile.com/seafile-deb/focal/ stable main" | tee /etc/apt/sources.list.d/seafile.list > /dev/null
apt install -y seafile-cli
seaf-cli start
seaf-cli download -l a841eec7-f99b-43b6-b2a2-4e4c9780ea05 -s http://192.168.1.34:8081

Docker Build设置代理

通过如下方式设置

1
2
3
docker build -t umi-ocr-paddle . \
--build-arg HTTP_PROXY=http://hinas.ninglang.top:7891 \
--build-arg HTTPS_PROXY=http://hinas.ninglang.top:7891