Skip to main content

Docker

常用容器服务

为知笔记

docker run --name wiz \
--restart=always \
-d \
-v $PWD/wiz:/wiz/storage \
-p 8085:80 \
-p 9269:9269/udp \
wiznote/wizserver

## 升级最新版本的话, 只需要把之前启动的容器删除, 拉取最新镜像, 再次执行上面的 run 命令即可
docker stop wiz
docker rm wiz
docker pull wiznote/wizserver:latest # 拉取最新镜像完成之后, 再次执行上面的 docker run ... 命令, 注意目录路径
note

默认管理员账号: admin@wiz.cn, 密码: 123456。请在部署完成后,使用这个账号,登录网页版,然后修改管理员密码。其他用户,请自行注册。免费版本可以注册5个用户(不包含管理员账号).

Bitwarden

Bitwarden - 密码服务的第三方开源实现 vaultwarden

docker run -d \
--name vaultwarden \
-e DOMAIN=https://your-domain.com \
-v $PWD/vw-data/:/data/ \
-p 8082:80 \
--restart=unless-stopped \
vaultwarden/server:latest

Portainer

容器管理服务, portainer/portainer-ce, 官网

docker run -d -p 8083:8000 -p 8084:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/portainer:/data \
portainer/portainer-ce:2.11.1-alpine

code-server

vsc的网页版

# 显示帮助
docker run -it --rm alanway/code-server --help

# 运行一个在线编辑器
docker run --name blog-editor -d \
-p 8086:80 \
-v $PWD:/app \
--restart=unless-stopped \
alanway/code-server

下面是我的博客项目使用示例:

Dockerfile
FROM alanway/code-server:latest

# code server 监听的端口号
EXPOSE 80

WORKDIR /usr/local
# 下载 node.js
ADD https://registry.npmmirror.com/-/binary/node/v16.14.0/node-v16.14.0-linux-x64.tar.gz ./
# 解压node
RUN tar xvf node-v16.14.0-linux-x64.tar.gz

# 设置账号名和UID, 可以使用 --build-arg 参数修改
ARG USER=alan
ARG USER_ID=1000
# 添加账号, 并把 node 的解压目录所有人改成新建的账号
RUN useradd --create-home --uid $USER_ID --user-group --shell /bin/bash $USER \
&& chown -hR $USER:$USER node-v16.14.0-linux-x64
# 设置容器默认账号为新账号
USER $USER
# 添加环境变量
RUN echo 'export PATH="$PATH:/usr/local/node-v16.14.0-linux-x64/bin/"' >> ~/.bashrc

# 以下资源会被拷贝一份新的到容器里
# 防止使用code editor是修改这些文件
WORKDIR /app
COPY --chown=$USER ./.vscode ./.vscode
COPY --chown=$USER ./scripts/utils.js ./scripts/utils.js
COPY --chown=$USER ./*.js ./
COPY --chown=$USER ./*.json ./

执行以下脚本创建容器并运行

docker build --file Dockerfile --tag blog-editor ./ # 在本地构建镜像

# 运行容器, 运行成功之后访问 localhost:8086 即可 访问在线版vsc了
# 将物理机的 8086 端口号映射到容器里的80端口
# 把当前文件夹的 src 目录映射到容器里的 /app/src 这样访问 localhost:8086 就可以修改物理机上src目录下的文件了
docker run --name blog-editor-container -d \
-p 8086:80 \
-v $PWD/src:/app/src \
-v $PWD/static:/app/static \
--restart=unless-stopped \
blog-editor

wireguard

docker run -d \
--name=wireguard \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e SERVERURL=172.105.199.140 \
-e SERVERPORT=51820 \
-e PEERS=1 \
-e PEERDNS=auto \
-e INTERNAL_SUBNET=10.13.13.0 \
-p 51820:51820/udp \
-v $PWD/config:/config \
-v /lib/modules:/lib/modules \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
linuxserver/wireguard

注意上述命令中的 SERVERURL=172.105.199.140 IP指的是你服务器的公网IP

BT 下载

docker run -d \
--name=transmission \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e USER=alan \
-e PASS=123456 \
-p 9091:9091 \
-p 51413:51413 \
-p 51413:51413/udp \
-v $PWD/conofig:/config \
-v $PWD/downloads:/downloads \
-v $PWD/watch:/watch \
--restart unless-stopped \
lscr.io/linuxserver/transmission
docker run -d -p 3090:3000 -v $PWD/downloads:/downloads jpillora/cloud-torrent

文件传输

基于 mozilla/send 制作的镜像:

docker run -d -p 8090:1443 --name firefox-send-pod alanway/firefox-send

阿里云盘 WebDAV

将阿里云盘挂载成 WebDAV 服务:

docker run -d --name=aliyundrive-webdav --restart=unless-stopped -p 8091:8080 \
-v $PWD/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \
-e REFRESH_TOKEN='your refresh token' \
-e WEBDAV_AUTH_USER=admin \
-e WEBDAV_AUTH_PASSWORD=admin \
messense/aliyundrive-webdav

上面的参数 REFRESH_TOKEN 值是阿里云盘的token, 打开并登录阿里云盘, 在控制台执行 JSON.parse(localStorage.token).refresh_token 即可看到.

Jetbrains Projector

基于Docker的 Projector

docker pull registry.jetbrains.team/p/prj/containers/projector-clion
docker pull registry.jetbrains.team/p/prj/containers/projector-datagrip
docker pull registry.jetbrains.team/p/prj/containers/projector-goland
docker pull registry.jetbrains.team/p/prj/containers/projector-idea-c
docker pull registry.jetbrains.team/p/prj/containers/projector-idea-u
docker pull registry.jetbrains.team/p/prj/containers/projector-phpstorm
docker pull registry.jetbrains.team/p/prj/containers/projector-pycharm-c
docker pull registry.jetbrains.team/p/prj/containers/projector-pycharm-p
docker pull registry.jetbrains.team/p/prj/containers/projector-webstorm

docker run --rm -p 8887:8887 -it IMAGE_NAME

RabbitMQ

启动一个RabbitMQ服务:

docker run -d --hostname rabbit-svr \
--name rabbit-svr \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=xxxxxx \
-e RABBITMQ_DEFAULT_VHOST=default \
-p 5672:5672 \
-p 15672:15672 \
--restart unless-stopped \
rabbitmq:3.10-management

Redis

docker run -d --name redis-svr \
--restart unless-stopped \
-v $PWD:/data \
-p 6379:6379 \
redis:7
# ref https://developer.redis.com/create/docker/redis-on-docker/
docker run -d \
--name redis-stack \
-p 6379:6379 \
-p 8001:8001 \
--restart unless-stopped \
-v $PWD/redis/:/data \
redis/redis-stack:latest

Plex 流媒体服务

docker run -d \
--name=plex \
--net=host \
-e PUID=1000 \
-e PGID=1000 \
-e VERSION=docker \
-p 32400:32400 \
-v $PWD/plex/library:/config \
-v $PWD/plex/tvseries:/tv \
-v $PWD/plex/movies:/movies \
--restart unless-stopped \
lscr.io/linuxserver/plex:latest

然后访问 http://localhost:32400, 使用命令 sudo ufw allow 32400 开放外网访问.

daemon.json 常用配置

参考:

/etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}

修改文件之后, 执行以下命令重启 Docker 使之生效:

systemctl restart docker

常用命令

删除 none 镜像

# via https://stackoverflow.com/questions/33913020/docker-remove-none-tag-images
docker image prune

发布镜像到阿里云

构建镜像

构建目录为当前目录

docker build --file ./Dockerfile.local --tag code-server:latest ./
  • --file 指定Dockerfile文件路径
  • --tag 格式为 name:tag, 其中 :tag 可以省略

关联标记镜像

下面将本地镜像关联到阿里云账号下:

docker tag code-server:latest registry.cn-hangzhou.aliyuncs.com/alanwei/code-server:latest

docker对镜像名字解析规则如下:

  • name:tag 使用本地镜像或者官方维护的镜像, 比如上述的 code-server:latest 就是本地镜像, 而 nginx:latest 就是官方镜像, 其中 tag 可以省略, 默认为 latest
  • user/name:tag 使用的是 docker hub 上的个人镜像, 比如 alanway/code-server:4.0.2 就是 docker hub 用户alanway发布的镜像
  • domain-host/user/name:tag 使用的就是 domain-host 私服提供的镜像, 而 user 一般指的是私服上的用户id, 比如上面提到的阿里云的镜像私服就是registry.cn-hangzhou.aliyuncs.com, 而alanwei就是阿里云账号id

推送到阿里云

docker login --username=[email] registry.cn-hangzhou.aliyuncs.com # 登陆阿里云账号
docker push registry.cn-hangzhou.aliyuncs.com/alanwei/code-server:latest # 推送第二步骤关联的阿里云镜像