Docker管理日记

这里记录了管理Docker的一些琐碎,主要使用docker-compose

在这一章节,我们将讨论安装Docker的一些细节

前言

    在这个页面,我们先来了解一下什么是Docker。Docker是一个虚拟化的应用引擎,使用极少的开支,为每一个运行的容器提供虚拟化环境。在容器内执行的全部,都是独立的。妈妈再也不用担心我的服务器被rm -rf啦!当然,如果你挂载了数据盘,那么数据盘内的数据可以被容器内部访问,也可以用于保存容器内部的数据。Docker会帮我们优雅地处理网络连接,容器版本迭代,宿主机环境问题,让我们更加专注于应用开发本身。

    你现在看到的这个网站,就是运行在docker环境内的。看不出来吧!接下来,在各个章节内,我们会逐步介绍各种应用容器的搭建。从个人博客到知识架构,从代码管理到社交网络,甚至搭建自己的媒体服务器。只要你想得到的,我们都能做到。

安装

    在国内安装Docker不是一件简单的事情,因为网络环境特别糟糕。我们需要做这样几件事情:

  1. 添加Docker的APT软件源
  2. 安装Docker的程序
  3. 修改Docker的容器下载镜像
  4. 启动Docker

    先查看一下当前系统的发布版本 cat /etc/os-release 留意一下两个 CODENAME

NAME="Ubuntu"
VERSION="19.10 (Eoan Ermine)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 19.10"
VERSION_ID="19.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=eoan
UBUNTU_CODENAME=eoan

    接下来我们开始编辑 /etc/apt/sources.list 添加这样一条记录

deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu eoan stable

    注意,这里面的 eoan 是你的 CODENAME 如果说你当前的版本比价新的话可能更新不出来,这样的话可以考虑使用上一个大版本的代码,用是可以用的。eoan 之前的那个版本是 bionic,在这之前我就不知道咯。如果不能用的话可以考虑下面这个软件源。

deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu eoan stable

    接下来就是基础的更新

sudo apt -y update
sudo apt -y install docker-ce

    在安装完成以后,写入一下docker的容器下载镜像地址

sudo rm -rf /etc/docker/daemon.json
sudo nano /etc/docker/daemon.json

{
	"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

    最后我们还需要重启Docker

systemctl restart docker

    另外,本书全程使用docker-compose进行搭建,需要额外安装

curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

    Enjoy!

Docker-Compose

这一章节,我们将探索应用容器使用Compose安装的一些具体细节

Docker-Compose

Aria

Aria是用于远程下载的命令行下载工具,可以配合AriaNG来管理。其中AriaNG不需要安装,是一个网页,会使用打开的本地浏览器的网页资源创建连接,调用Aria。


version: "2"
services:

  aria2:
    image: superng6/aria2
    container_name: aria2
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - SECRET=ariaqaqaqaq
      - UpdateTracker=true
    volumes:
      - ./mnt/config:/config
      - <your_download_path_here>:/downloads
    ports:
      - 6881:6881
      - 6881:6881/udp
      - 6800:6800
    restart: unless-stopped

./mnt/config

## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ##
## 被注释的选项使用的是默认值, 建议在需要使用时再取消注释  ##

## RPC相关设置 ##

# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
#event-poll=select
# RPC监听端口, 端口被占用时可以修改, 默认:6800
rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
rpc-secret=<your_token_password_here>
# 设置的RPC访问用户名(1.15.2以上,1.18.6以下版本), 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=<USER>
# 设置的RPC访问密码(1.15.2以上,1.18.6以下版本), 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>
# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
# rpc-secure=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件(.pem/.crt)
# rpc-certificate=/config/ssl/full_chain.pem
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件(.key)
# rpc-private-key=/config/ssl/private.key

## 文件保存相关 ##

# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
dir=/downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
# disk-cache=512M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS、EXT4 建议使用 falloc, EXT3 建议 trunc, MAC 下需要注释此项
#file-allocation=falloc
# 断点续传
continue=true
# 获取服务器文件时间,默认:false
remote-time=true

## 下载连接相关 ##

# 文件未找到重试次数,默认:0
# 重试时同时会记录重试次数,所以也需要设置 --max-tries 这个选项
max-file-not-found=5
# 最大尝试次数,0表示无限,默认:5
max-tries=0
# 重试等待时间(秒), 默认:0
retry-wait=10
# 使用 UTF-8 处理 Content-Disposition ,默认:false
content-disposition-default-utf8=true
# 最大同时下载任务数, 运行时可修改, 默认:5,路由建议值: 3
max-concurrent-downloads=50
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=16
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=4M
# 单个任务最大线程数, 添加时可指定, 默认:5,路由建议值: 5
split=16
# 整体下载速度限制, 运行时可修改, 默认:0
#max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
max-overall-upload-limit=2M
# 单个任务上传速度限制, 默认:0
max-upload-limit=512K
# 禁用IPv6, 默认:false
disable-ipv6=true
# 支持GZip,默认:false
http-accept-gzip=true
# URI复用,默认: true
reuse-uri=false
# 禁用 netrc 支持,默认:flase
no-netrc=true

## 进度保存相关 ##

# 从会话文件中读取下载任务
input-file=/config/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/config/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60
# 自动保存任务进度,0为退出时才保存,默认:60
auto-save-interval=60
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
force-save=true

## BT/PT下载相关 ##

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true,可选:false|mem
#follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=6881
# 单个种子最大连接数,0为不限制,默认:55
bt-max-peers=100
# DHT(IPv4)文件
dht-file-path=/config/dht.dat
# DHT(IPv6)文件
# dht-file-path6=/root/.aria2/dht6.dat
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用
enable-dht6=false
# DHT网络监听端口, 默认:6881-6999
dht-listen-port=6881
# 本地节点查找, PT需要禁用, 默认:false
bt-enable-lpd=true
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=true
# 期望下载速度,Aria2会临时提高连接数以提高下载速度,单位K或M。默认:50K
bt-request-peer-speed-limit=10M
# 客户端伪装, PT需要保持user-agent和peer-agent两个参数一致
user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36
#user-agent=qBittorrent v4.1.9
peer-agent=qBittorrent v4.1.9
peer-id-prefix=-qB4190-
#peer-agent=uTorrentMac/1870(43796)
#peer-id-prefix=-UM1870-
#peer-agent=Deluge 1.3.15
#peer-id-prefix=-DE13F0-
#peer-agent=Transmission/2.92
#peer-id-prefix=-TR2920-
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=1.0
# 最小做种时间。此选项设置为0时,将在BT任务下载完成后不进行做种。
seed-time=0
# BT校验相关, 默认:true
#bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
#bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=false
# 加载已保存的元数据文件,默认:false
bt-load-saved-metadata=true
# 删除未选择文件,默认:false
bt-remove-unselected-file=true
# 保存上传的种子,默认:true
#rpc-save-upload-metadata=false

## 执行额外命令 ##

# 下载停止后执行的命令(下载停止包含下载错误和下载完成这两个状态,如果没有单独设置,则执行此项命令。)
# 删除文件及.aria2后缀名文件
on-download-stop=/aria2/script/delete.sh
# 删除.aria2后缀名文件
on-download-complete=/aria2/script/delete.aria2.sh
# 下载错误后执行的命令(下载停止包含下载错误这个状态,如果没被设置或被注释,则执行下载停止后执行的命令。)
#on-download-error=
# 下载完成后执行的命令(下载停止包含下载完成这个状态,如果没被设置或被注释,则执行下载停止后执行的命令。)
# 调用 rclone 上传(move)到网盘
#on-download-complete=/root/.aria2/autoupload.sh
# 下载暂停后执行的命令
# 显示下载任务信息
#on-download-pause=/root/.aria2/info.sh
# 下载开始后执行的命令
#on-download-start=

## BT服务器 ##
bt-tracker=<your_bt_trackers_here>
check-certificate=false

Docker-Compose

BookStack

BookStack是一个私人笔记书架,能够很好的容纳自己的知识要点。本站就是使用BookStack创建的。


version: "2"

services:

  bookstack:
    image: linuxserver/bookstack
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - DB_HOST=bookstack_db
      - DB_USER=bookstack
      - DB_PASS=<your_password_here>
      - DB_DATABASE=bookstackapp
      - APP_URL=<your_final_url>
    volumes:
      - ./mnt/data:/config
    ports:
      - 15087:80
    restart: unless-stopped
    depends_on:
      - bookstack_db

  bookstack_db:
    image: linuxserver/mariadb
    container_name: bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=<your_password_here>
      - TZ=Asia/Shanghai
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=<your_password_here>
    volumes:
      - ./mnt/data:/config
    restart: unless-stopped

 

Docker-Compose

GitLab

GitLab是本地私有代码托管应用,对于程序员来说,应该对Git再熟悉不过了,我也不多介绍了。注意,这样搭建的GitHub是没有管理员账户的,你需要自己进容器修改。


version: '3'

services:

  web:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['lfs_enabled'] = true
        gitlab_rails['gitlab_default_projects_features_builds'] = false
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
    volumes:
      - './mnt/config:/etc/gitlab'
      - './mnt/logs:/var/log/gitlab'
      - './mnt/data:/var/opt/gitlab'
    ports:
      - '15082:80'
      - '16051:22'

Docker-Compose

Jellyfin

Jellyfin是一款媒体服务器,相比于Plex,Jellyfin更强调本地化。完全开源免费,但是在一些方面比如转码的支持没有Plex好。


version: '3'

services:

  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - UMASK_SET=022 #optional
    volumes:
      - ./mnt/config:/config
      - ./mnt/transcode:/transcode
      - <your_video_here>:/data/media
    ports:
      - 15084:8096
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped

Docker-Compose

Misskey

Misskey是一款去中心化的微博应用系统,适合用作QQ空间或者vx朋友圈或者是微博推特的代替品。

https://github.com/syuilo/misskey


services:

  misskey:
    image: misskey/misskey
    restart: always
    volumes:
      - ./bootstrap:/misskey/.config/
      - ./mnt/files:/misskey/files
    ports:
      - 15086:3000
    depends_on:
      - postgres
      - redis
    links:
      - postgres
      - redis

  postgres:
    image: postgres
    environment:
      POSTGRES_PASSWORD: <your_password_here>
      POSTGRES_USER: misskey
      POSTGRES_DB: misskey
    restart: always
    volumes:
      - ./mnt/postgresql/data:/var/lib/postgresql/data

  redis:
    image: redis
    restart: always
    command: redis-server --requirepass <your_password_here>
    environment:
      - REDIS_PASSWORD=<your_password_here>
    volumes:
      - ./mnt/redis/data:/data

其次是配置文件,在同一目录创建 bootstrap 文件夹,并添加 default.yml 文件

#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Misskey configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

#   ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────

# Final accessible URL seen by a user.
url: <your_final_address>

# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!

#   ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────

#
# Misskey supports two deployment options for public.
#

# Option 1: With Reverse Proxy
#
#                 +----- https://example.tld/ ------------+
#   +------+      |+-------------+      +----------------+|
#   | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
#   +------+      |+-------------+      +----------------+|
#                 +---------------------------------------+
#
#   You need to setup reverse proxy. (eg. nginx)
#   You do not define 'https' section.

# Option 2: Standalone
#
#                 +- https://example.tld/ -+
#   +------+      |   +---------------+    |
#   | User | ---> |   | Misskey (443) |    |
#   +------+      |   +---------------+    |
#                 +------------------------+
#
#   You need to run Misskey as root.
#   You need to set Certificate in 'https' section.

# To use option 1, uncomment below line.
port: 3000    # A port that your Misskey server should listen.

# To use option 2, uncomment below lines.
#port: 443

#https:
#  # path for certification
#  key: /etc/letsencrypt/live/example.tld/privkey.pem
#  cert: /etc/letsencrypt/live/example.tld/fullchain.pem

#   ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────

db:
  host: postgres
  port: 5432

  # Database name
  db: misskey

  # Auth
  user: misskey
  pass: <your_password_here>

  # Whether disable Caching queries
  #disableCache: true

  # Extra Connection options
  #extra:
  #  ssl: true

#   ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────

redis:
  host: redis
  port: 6379
  pass: <your_password_here>
  #prefix: example-prefix
  #db: 1

# Other

id: 'aid'
Docker-Compose

NetData

NetData是一款简单好用的服务器监视应用。由于不包含鉴权,所以在搭建的时候可以考虑仅对本地开放,或者使用nginx做一层代理,添加basic_auth。


version: '3'
services:

  netdata:
    image: netdata/netdata
    hostname: <your_address_here> # set to fqdn of host
    ports:
      - 15088:19999
    cap_add:
      - SYS_PTRACE
    security_opt:
      - apparmor:unconfined
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
Docker-Compose

NextCloud

NextCloud是一款个人云端硬盘,提供强大的功能和多平台本地应用。其中,你可以通过插件挂自己的文件夹。


version: '3'

services:

  db:
    image: postgres:alpine
    restart: always
    volumes:
      - ./mnt/db:/var/lib/postgresql/data
    env_file:
      - db.env

  app:
    image: nextcloud:fpm-alpine
    restart: always
    volumes:
      - ./mnt/nextcloud:/var/www/html
      - ./mnt/data:/data
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_DB=nextcloud
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    env_file:
      - db.env
    depends_on:
      - db

  web:
    build: ./web
    restart: always
    ports:
      - 15083:80
    volumes:
      - ./mnt/nextcloud:/var/www/html:ro
    depends_on:
      - app

其中,你需要在.env中定义如下内容

POSTGRES_PASSWORD=<your_password_here>
POSTGRES_USER=postgres

 

Docker-Compose

NPC

NPC是一款优秀的内网穿透实例,能够配合NPS高效且安全地传送数据。


version: '3'

services:

  npc:
    image: oldiy/npc-client
    network_mode: host
    environment:
      SERVERIP: <your_server_ip>
      VKEY: <your_vkey_here>

Docker-Compose

Plex

Plex是一款媒体服务器,拥有自动搜刮的功能,可以让你拥有一个私人的b站。支持网页播放,全平台客户端播放,拥有强大的解码能力。


version: '3'

services:

  plex:
    image: plexinc/pms-docker
    container_name: plex
    # network_mode: host
    environment:
      - PLEX_UID=1000
      - PLEX_GID=1000
      - TZ=Asia/Shanghai
    volumes:
      - ./:/config
      - <your_media_path>:/data/tvshows
      - /tmpfs/plex:/transcode
    ports:
      - 32400:32400/tcp
      - 3005:3005/tcp
      - 8324:8324/tcp
      - 32469:32469/tcp
      - 1900:1900/udp
      - 32410:32410/udp
      - 32412:32412/udp
      - 32413:32413/udp
      - 32414:32414/udp
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped

Docker-Compose

UnblockNeteaseMusic

UnblockNeteaseMusic会解密你的网易云音乐流量,从其他音乐门户下载免费歌曲并传回网易云音乐。当你的网易云拥有无法播放的歌曲时,这个插件就特别有用。其中16050是连接端口。

更多的配置请参考GitHub专贴: https://github.com/nondanee/UnblockNeteaseMusic


version: '3'

services:

  nm:
    image: nondanee/unblockneteasemusic
    container_name: nm
    restart: always
    command: -p 16050 # -e https://music.163.com -p 80
    ports:
      - "16050:16050"

 

Docker-Compose

WordPress

image-1581843277496.png

WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。


 

version: '3'

services:

  wp:
    image: wordpress:latest
    volumes:
      - ./mnt/config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./mnt/wp-app:/var/www/html
      - ./mnt/wp-data:/var/www/html/wp-content
      - ./mnt/wp-data/config/wp-config.php:/var/www/html/wp-content/wp-config.php
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: <your_password_here>
    depends_on:
      - db
    links:
      - db

  pma:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: <your_password_here>
    links:
      - db:db

  db:
    image: mysql:latest # https://hub.docker.com/_/mysql/ - or mariadb https://hub.docker.com/_/mariadb
    command: [
        '--default_authentication_plugin=mysql_native_password',
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci'
    ]
    volumes:
      - ./mnt/wp-data:/docker-entrypoint-initdb.d
      - ./mnt/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_ROOT_PASSWORD: <your_password_here>

volumes:
  db_data: