搭建使用traefik

1. 创建文件夹和文件

mkdir ~/traefik
cd ~/traefik
mkdir -p data/configurations
touch docker-compose.yml
touch data/traefik.yml
touch data/acme.json
touch data/configurations/dynamic.yml
chmod 600 data/acme.json

2. 配置 docker-compose.yml

文件路径为 ~/traefik/docker-compose.yml

version: '3.7'
services:
traefik:
image: traefik:v2.4
container_name: traefik
restart: always
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
# 如果宿主机是标准 linux 系统,可以设置一下localtime
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro # 映射静态配置文件
- ./data/acme.json:/acme.json # 映射证书文件,SSL 证书申请成功后,就会存在这个文件中
- ./data/configurations:/configurations # 映射动态配置文件
networks:
- traefik
labels:
# 下面这些标签,可以帮助 traefik 正确处理该服务
- 'traefik.enable=true'
- 'traefik.docker.network=traefik' # 指定 docker network
# 指定服务入口为 websecure,websecure 会在静态配置文件traefik.yml中定义
- 'traefik.http.routers.traefik-secure.entrypoints=websecure'
# 定义访问域名,需要做 DNS 解析
- 'traefik.http.routers.traefik-secure.rule=Host(`traefik.yourdomain.com`)'
- 'traefik.http.routers.traefik-secure.middlewares=user-auth@file'
- 'traefik.http.routers.traefik-secure.service=api@internal'
networks:
traefik:
external: true

创建 docker-compose.yml 内需要的 network

docker network create traefik

3. 修改静态配置文件

文件路径为 ~/traefik/data/traefik.yml

api:
  dashboard: true
entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure
  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
        - nofloc@file
      tls:
        certResolver: lets-encr
pilot:
  dashboard: false
providers:
  docker:
    endpoint: 'unix:///var/run/docker.sock'
    exposedByDefault: false
  file:
    filename: /configurations/dynamic.yml # 动态配置文件位置
certificatesResolvers:
  lets-encr:
    acme:
      #caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      storage: acme.json
      email: xxxxxx
      httpChallenge:
        entryPoint: web

4. 修改动态配置文件

文件路径为 ~/traefik/data/configurations/dynamic.yml

# Dynamic configuration
http:
middlewares:
nofloc:
headers:
customResponseHeaders:
Permissions-Policy: 'interest-cohort=()'
secureHeaders:
headers:
sslRedirect: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
# UserName : admin
# Password : qwer1234
user-auth:
basicAuth:
# users 选项是认证用户的列表
# 使用 echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
# 来创建 user:password 键值对
users:
- 'admin:$apr1$tm53ra6x$FntXd6jcvxYM/YH0P2hcc1'
tls:
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12

5. 解析域名

在 docker-compose.yml 中,我们指定了使用 traefik.yourdomain.com 作为访问域名。因此,我们需要将 traefik.yourdomain.com 解析至 traefik 服务入口 IP 地址。

frp点对点内网穿透

点对点内网穿透

这个示例将会演示一种不通过服务器中转流量的方式来访问内网服务。

frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

  1. frps.ini 内容如下,需要额外配置监听一个 UDP 端口用于支持该类型的客户端:

    [common]
    bind_port = 7000
    bind_udp_port = 7000
  2. 在需要暴露到外网的机器上部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh]
    type = xtcp
    # 只有 sk 一致的用户才能访问到此服务
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22
  3. 在想要访问内网服务的机器上也部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    [p2p_ssh_visitor]
    type = xtcp
    # xtcp 的访问者
    role = visitor
    # 要访问的 xtcp 代理的名字
    server_name = p2p_ssh
    sk = abcdefg
    # 绑定本地端口用于访问 ssh 服务
    bind_addr = 127.0.0.1
    bind_port = 6000
  4. 通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@127.0.0.1

windows docker安装frpc

windows-docker安装frpc

新建`\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2\frpc-docker-compose.yml
内容如下:

version: "3.7"
services:
  frpc:
    image: snowdreamtech/frpc
    container_name: frpc
    hostname: frpc
    ports:
    #   - "7500:7500"
    #   # - 7400:7400
      - 7000:7000
    #   - 8888:8888
    volumes:
      - frpc:/etc/frp
volumes:
  frpc:

新建`\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2_frpc_data\frpc.ini
写入

[common]
# server_addr = 127.0.0.1
server_addr = 服务器ip或域名
server_port = 7000
# 认证token,客户端需要和此对应
token=1267823123 #与服务器一致
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

运行


(base) PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\docker-desktop-data\data\docker\volumes\dc2<!--autointro-->

windows docker安装cloudreve

windows-docker安装cloudreve

在E盘新建E:/docker/dc1docker-compose.yml文件,写入

version: "3.4"
volumes:
  # tempData:
  cloudreve:
  uploads:
services:  
  cloudreve:
      container_name: cloudreve
      image: cloudreve/cloudreve:latest
      restart: unless-stopped
      ports:
        - "5212:5212"
        # - "443:443"
      volumes:
        - cloudreve:/cloudreve
        - uploads:/cloudreve/uploads

进入该文件夹,运行docker-compose启动:


E:\docker\dc1<!--autointro-->

windows安装docker

安装WSL

先安装WSL,管理员运行`wsl –install

(base) PS C:\Users\weiyo> wsl --install
正在安装: 虚拟机平台
已安装 虚拟机平台。
正在安装: 适用于 Linux 的 Windows 子系统
已安装 适用于 Linux 的 Windows 子系统。
正在下载: WSL 内核
正在安装: WSL 内核
已安装 WSL 内核。
正在下载: GUI 应用支持
[======                    10.6%                           ]

(base) PS C:\Users\weiyo<!--autointro-->

docker因为无法创建文件夹映射导致启动失败解决

[root@iZ8vbajg9wo8iwynfb1lgeZ dc_wagtail]# docker-compose up
Creating wagtail ... error
ERROR: for wagtail  Cannot create container for service wagtail: open /var/lib/docker/volumes/dc_wagtail_wagtailpython/_data: no such file or directory
ERROR: for wagtail  Cannot create container for service wagtail: open /var/lib/docker/volumes/dc_wagtail_wagtailpython/_data: no such file or directory
ERROR: Encountered errors while bringing up the project.

对于我来说出现这种错误一般是因为测试过程中第一次生成了映射文件夹,但是第二次测试前给它改名字了,想让容器重新生成,但结果是容器无法从新生成。
又发现虽然自己把主机实际文件夹名称改了,但是docker内部volume记录名称仍然存在,这就导致找不到该文件夹了。
使用
docker volume ls列出映射的文件夹
使用
`docker volume rm

docker网络模式

Docker有四种网络模式

1.host模式

容器和宿主机共享network,这时候localhost就可以访问宿主机端口了。

docker run -d --network host --name nginx

2.container模式

容器A和容器B共享network,就是说容器之间可以通过localhost直接访问。

docker run -d --network container --name nginx

3.none模式

容器与宿主机隔绝,不能联网,安全性最高,一般很少用到。

docker run -d --network none --name nginx

4.bridge模式(默认模式)

每个容器有自己的network,通过localhost访问不到宿主机

docker run -d --name nginx

docker-compose 中volumes参数说明

docker-compose 使用数据卷进行持久化
直接使用宿主机路径映射

  image: ghost
volumes:
- ./ghost/config.js:/var/lib/ghost/config.js

使用卷标映射

    services:
mysql:
image: mysql
container_name: mysql
volumes:
- mysql:/var/lib/mysql
...
volumes:
mysql:

第一种情况路径直接挂载到本地,比较直观,但需要管理本地的路径
第二种使用卷标的方式,比较简洁,但你不知道数据存在本地什么位置,下面说明如何查看docker的卷标

查看所有卷标

  docker volume ls 

查看批量的卷标

 $ docker volume ls | grep mysql
local               vagrant_mysql

查看具体的volume对应的真实地址


$ docker volume inspect vagrant_mysql
[
{
"Name": "vagrant_mysql",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/vagrant_mysql/_data"
}
]
```<!--autointro-->

Compose常用命令

Compose常用命令

Compose常用命令
docker-compose -h                           # 查看帮助
docker-compose up                           # 启动所有docker-compose服务
docker-compose up -d                        # 启动所有docker-compose服务并后台运行
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id         # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                      		# 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     		# 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     	# 查看容器输出日志
docker-compose config     					# 检查配置
docker-compose config -q  					# 检查配置,有问题才有输出
docker-compose restart   					# 重启服务
docker-compose start     					# 启动服务
docker-compose stop      					# 停止服务

docker查看所有镜像:

docker images

docker删除所有镜像:

#删除tag为none的镜像
docker image prune
#删除指定ID的镜像
docker rmi ed9c93747fe1
#删除全部镜像
docker rmi -f $(docker images -qa)

docker关闭、删除所有容器:

docker stop $(docker ps -a -q)
docker rm $(docker ps -aq)

docker-compose命令使用

docker-compose -f docker-compose-org3.yaml up -d

重新启动docker服务

service docker restart

进入docker容器

docker exec -it [CONTAINERID] /bin/bash

查看docker运行中项目日志

docker logs -f  容器ID
docker logs -f -t --tail 100 容器ID

查看docker-compose运行日志

docker-compose  logs -f
#or
docker-compose  logs

docker 启动配置文件路径

vim /lib/systemd/system/docker.service

进入docker容器内

docker exec -it 89693c83bae9 /bin/bash

注意:如果报错OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused “exec: “/bin/bash”: stat /bin/bash: no such file or directory”: unknown使用如下命令:

docker exec -it 1e33b26152e1 bash #or docker exec -it 1e33b26152e1 sh<!–autointro–>

centos8 安装docker

最近换了服务器,安装了最新的centos8。为了方便使用,避免各种环境相互干扰,准备使用docker来搭建自己的各种应用。记录安装docker的过程如下。

  1. 查看是否已经安装docker的某些版本
    yum repolist

如有,则移除:

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  1. 安装需求工具:
    
    sudo yum install -y yum-utils

$ sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo


遇到报错:

Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist


修改了```/etc/yum.repos.d/CentOS-epel.repo```文件:
将```failovermethod=priority```注释掉,变成如下:

[epel]
name=Extra Packages for Enterprise Linux 8 – $basearch
baseurl=http://mirrors.cloud.aliyuncs.com/epel/8/Everything/$basearch

220913comment

failovermethod=priority

enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8


修改后重新运行命令,成功后进行下一步。
3. 安装docker

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin


这一步会让确认是否下载,核对指纹。确认即可。

Importing GPG key 0x621E9F35:
Userid : "Docker Release (CE rpm) docker@docker.com