服务器docker化管理

服务器docker化管理

这台vps已经伴随我很久了,之前用的事宝塔,但是随着宝塔要手机验证码之后,折腾过国际版宝塔,现在应该是最后一次折腾,直接用docker将各个模块管理。先来分析下:

优势:

  1. 备份还原容易,升级容易

  2. 各个容器相互独立,一旦建立成功,就不会有什么大问题

  3. 不需要宝塔面板做中间人,直接可以保存发布

  4. 对系统占用小且整个系统干净,主要是各个数据相互独立除开有需要得文件,其他得文件都可以放在容器内部,无需担心一些文件上得冲突

缺点:

  1. 技术要求高,docker得安装部署会遇见一些没遇见过的坑

网络扑拓图:

20221202094146

1 安装debain最新系统:


好消息这块搬瓦工内部直接有最新的debain11系统,我个人是建议使用最新系统,这个在之前的文章说过,内置BBR等功能对我们网站速度很有帮助

20221105160743

20221105161135

修改下默认的时区,直接复制粘贴即可

1
2
3

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

增加虚拟交换内存步骤:

这一步非必须,我的服务器是512M的内存,所以一般会增加1G或者1.5G的,在存储足够的情况下,我倾向于多增加一些交换缓存。

  1. 创建内存交换文件

    bs代表内存块大小,这边设置得是1M,数量1000,合计1G,if后面则是对应得/swap内存交换文件名,可以自行修改.

    1
    2
    3

    dd if=/dev/zero of=/swap bs=1024000 count=1024

    20221105163046

  2. 注册内存交换文件

    1
    2
    3

    mkswap /swap

  3. 激活服务器内存文件

    1
    2
    3
    4
    5

    swapon /swap

    #停用 swapoff -v /swap

  4. 设置权限(安全第一,改为只能让root修改)

    1
    2
    3

    # chmod 0600 /swap

  5. 开启启动注册:在/etc/fstab最后一行增加

    1
    2
    3

    /swap swap swap defaults 0 0

20221105163624

增加用户docker

这一步也是非必须,增加一个可以使用sudo的用户是可以将权限隔离开来。

1
2
3
4
5
6
7

useradd docker -d -m -s -c "docker manger"

或者

adduser docker

两者都是增加用户得方法,其中adduser是一个系统自带脚本,会自动提示输入对应得密码,而useradd需要输入对应的开始文件夹等信息,且需要使用passwd输入密码.

20221105164216

增加完用户,需要给用户提权,默认完全干净的debain是没有sudo命令的,需要使用

1
2
3

apt-get install sudo

安装,安装完之后需要进入\etc\sudoers增加一列docker ALL=(ALL:ALL) ALL

20221105175349如果提示无法编辑,看下是不是文件没有给修改权限.

一切就绪之后,退出重新登陆,就可以使用sudo命令.如果直接使用root,不安装sudo,以下命令的sudo可以删除掉.

2 安装docker


推荐使用apt,不推荐脚本,官方脚本安装是适用于测试和开发环境.

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书:

1
2
3
4
5
6
7
8
9
10
11
12
13

sudo apt-get update

sudo apt-get install \

ca-certificates \

curl \

gnupg \

lsb-release

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

1
2
3
4
5
6
7

官方源

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

然后,我们需要向 sources.list 中添加 Docker 软件源:

1
2
3
4
5
6
7
8
9

官方源

echo \

"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \

$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

如果行太长可以通过增加”\“来告诉系统我要换行,不需要执行,稍后一起执行

准备好之后更新一发:

1
2
3

sudo apt-get update

如果执行以上命令出现error错误,一般是没有对应得文件权限.

可以增加读写权限

1
2
3
4
5

sudo chmod a+r /etc/apt/keyrings/docker.gpg

sudo apt-get update

以上是准备工作:然后安装对应得docker:如果不需要docker-compose可以取消掉

1
2
3

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

建立 docker用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组

1
2
3

$ sudo groupadd docker

当前用户增加进docker用户组.

1
2
3

$ sudo usermod -aG docker $USER

测试是否成功可以使用:

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

$ docker run --rm hello-world



Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

b8dfde127a29: Pull complete

Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24

Status: Downloaded newer image for hello-world:latest



Hello from Docker!

This message shows that your installation appears to be working correctly.



To generate this message, Docker took the following steps:

1. The Docker client contacted the Docker daemon.

2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

(amd64)

3. The Docker daemon created a new container from that image which runs the

executable that produces the output you are currently reading.

4. The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.



To try something more ambitious, you can run an Ubuntu container with:

$ docker run -it ubuntu bash



Share images, automate workflows, and more with a free Docker ID:

https://hub.docker.com/



For more examples and ideas, visit:

https://docs.docker.com/get-started/

部署容器


容器装载有两种方式,一种是一个个建立,然后统一使用一个网络来连接内部,一种是直接建立compose文件,直接安装docker集群,两者的方法是一样的,没有区别.只有一次安装和多次安装的区别.

准备工作:

创建一个内部网络,确定对应网段docker network create -d bridge –subnet=172.18.0.0/16 root_caddy 后续所有的docker后面都需要加上--network root_caddy代表将容器加入创建的网络,使用--ip 172.16.0.1指定IP,方便后续调用

拉取镜像:apline是一个以轻量小巧的liunx服务器系统,对应版本的镜像都是十分小巧,和debain的相差8倍.

整体的docker-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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

version: "3.9" # optional since v1.27.0

services:

caddyv2: #caddy反向代理

container_name: caddy

image: caddy:2.6-alpine

restart: unless-stopped

volumes:

- /root/docker_data/caddy/data:/data #caddy留存的证书信息,最好保存,方便后续迁移

- /root/docker_data/caddy/caddyconfig:/etc/caddy #caddyfile的配置文件

- /root/docker_data/caddy/file:/usr/share/caddy #caddy的运行网页

ports:

- "80:80"

- "443:443"

- "443:443/udp"

depends_on:

- v2ray

networks:

root_caddy:

ipv4_address: 172.18.0.3



v2ray: #v2翻墙

container_name: v2ray

image: teddysun/v2ray

restart: unless-stopped

environment:

- TZ=Asia/Shanghai

volumes:

- /root/docker_data/v2ray/config:/etc/v2ray

expose:

- 8888

command: /usr/bin/env v2ray.vmess.aead.forced=false /usr/bin/v2ray run -config /etc/v2ray/config.json #由于MD5验证问题,覆盖容器原有得命令

networks:

root_caddy:

ipv4_address: 172.18.0.2



# calibre-web: #clibre电子阅读器-暂定,还未完全

# image: lscr.io/linuxserver/calibre-web:latest

# container_name: calibre-web

# environment:

# - TZ=Asia/Shanghai

# volumes:

# - /root/docker_data/calibre/config:/config

# - /root/docker_data/calibre/library:/books

# expose:

# - "8083"

# restart: unless-stopped

# networks:

# root_caddy:

# ipv4_address: 172.18.0.4



# PHP:

# image: php:fpm-alpine

# container_name: PHP

# environment:

# - TZ=Asia/Shanghai

# volumes:

# - /root/docker_data/caddy/file:/usr/share/caddy #路径最好和caddy得文件路径一致,否则会出现路径不匹配问题

# expose:

# - "9000"

# restart: unless-stopped

# networks:

# root_caddy:

# ipv4_address: 172.18.0.5





networks:

root_caddy:

external: true



以上将路径和对应的文件夹全部都映射完成,后续可以直接执行运转。这边采用的是Caddy来进行反代,因为它够简单,也够好用,足够满足我的需求。对应的Caddyfile文件

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

*.com {

root * /usr/share/caddy

file_server

reverse_proxy 172.18.0.2:8888 {

header_up Host {http.request.host}

header_up X-Real-IP {http.request.remote}

header_up X-Forwarded-For {http.request.remote}

header_up X-Forwarded-Port {http.request.port}

header_up X-Forwarded-Proto {http.request.scheme}

header_up Connection {http.request.header.Connection}

header_up Upgrade {http.request.header.Upgrade}

}

}



一些常用的容器命令

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

修订容器内部时间

docker cp -L /usr/share/zoneinfo/Asia/Shanghai 容器名称:/etc/localtime



复制容器内部文件

docker cp nginx:/etc/nginx/ /home/docker/ #将nginx整个文件夹复制到docker下

docker cp nginx:/usr/share/nginx/html/ /home/docker/nginx



进入容器内部操作

docker exec -it 容器名称 /bin/bash

docker exec -it 容器名称 /bin/sh #apline 进入容器命令



清理无用的docker,解放硬盘空间(清理没用的image,包括build建立的缓存)

docker system df 查看docker占用硬盘

docker system prune -a

参考文档

docker 网络-容器间通信\

Debian普通用户获取root权限|sudo的安装与配置\

Linux设置和修改时间与时区\

新版的Typecho开发计划\

ALPINE\

容器互联\

docker官方安装\

Linux 使用 adduser 与 useradd 添加普通用户的正确姿势