Skip to content

Latest commit

 

History

History
787 lines (656 loc) · 30.9 KB

docker.md

File metadata and controls

787 lines (656 loc) · 30.9 KB

零、安装

  • docker
https://docs.docker.com/engine/install/
  • dockerCompose
sudo pip3 install docker-compose
sudo yum upgrade python*
docker-compose version
# 卸载命令
sudo pip uninstall docker-compose

!> 不要用snap

sudo snap remove docker

一、docker名词说明

  • 镜像image 相当于Java中的类文件,dockers可以通过镜像来创建多个不同的容器。

  • 容器container 相当于小型的Linux系统,通过镜像可以创建一个或一组不同的系统,容器可以启动、停止、删除等

  • 仓库repository 存放镜像的地方,共有+私有。

二、镜像

  • 1.查看本地镜像:docker images
  • 2.查看镜像的详细信息:docker images --help
  • 3.搜索镜像:docker search 镜像名称,可以--help查看具体的用法,比如搜索stars>200的镜像:docker search mysql --filter=STARS=300
  • 4.下载镜像:docker pull 镜像:版本;版本需要去官网上找,存在才能下载成功;
  • 5.删除镜像:docker rmi 镜像id/名称,删除全部镜像(Linux中可用):docker rmi -f $(docker images -q)

三、容器

  • 1.新建容器并启动:docker run [args] imageid/name

    • --name="名称":指定新建启动容器的名称
    • -d:后台方式运行
    • -it:使用交互方式运行进入该容器,需要在后面指定交互的shell,比如/bin/bash
    • -p:指定容器的端口映射,比如-p 主机端口:容器端口-> -p 8080:8080,如果只是-p则随机端口
  • 2.查看正在运行的容器:docker ps

    • -a:可以查看所有曾经运行的容器记录
    • -n=num:num指定最近创建的容器记录条数
    • -q:只显示容器的id,配合-a使用
  • 3.退出容器(使用-it进入容器):

    • exit:停止容器并退出
    • ctrl+p+q:不停止容器退出
  • 4.删除容器:docker rm 容器id,删除所有容器(同上):docker rm $(docker ps -aq)-f强制删除所有容器,包括正在运行的容器。

  • 5.停止/启动容器

    • docker start 容器id
    • docker restart 容器id
    • docker stop 容器id
    • docker kill 容器id
  • 6.进入正在运行的容器

    • docker exec -it 容器id /bin/bash:进入容器开启一个新的终端
    • docker attach 容器id:进入容器正在执行的终端

扩展

  • 1.后台运行容器,停止问题
docker run -d centos
docker ps
docker ps -a

后台运行必须要有一个前台进程应用,如果没有就会立刻停止容器。

  • 2.日志 docker logs [OPTIONS] 容器id:查看容器的日志信息。 options:-tf显示有时间戳的日志;--tail num显示几条日志信息
docker logs -tf --tail 10 xxx
  • 3.查看容器中的进程信息:docker top 容器id

  • 4.查看容器本身的详细信息(源数据):docker inspect 容器id

  • 5.拷贝容器中的文件到物理机上:docker cp 容器id:/资源完整路径 物理机路径,比如拷贝某容器中的fish.java到物理机当前路径中。

  • 6.查看docker相关cpu信息:docker stats 容器id

docker run -it --name="centos" centos /bin/bash
cd /home
touch fish.java
# ctrl+p+q或者exit退出该容器
docker ps # 查看容器id
docker cp cae59371ee6d:/home/fish.java ./

四、例子

  • 1.安装ngix镜像
docker search nginx # https://hub.docker.com/_/nginx
docker pull nginx
docker run -d --name="fishNgix" -p 3344:80 nginx # -d后台启动、-p 本地物理机端口:ngix容器端口
curl http://localhost:3344

ok,你就会看到nginx默认返回内容。

  • 2.安装tomcat镜像
docker run -it --name="fishTomcat" -p 3355:8080 tomcat /bin/bash
cp -r webapps.dist/* webapps

ok,访问本地localhost:3355即可。

  • 3.安装es
docker run -d --name="fishElasticsearch" -p 9200:9200 -p 9300:9300 -e "descovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# -e表示配置环境

五、辅助

  • 可视化面板portainer docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

六、镜像文件说明

docker镜像使用的时层级文件系统来记录修改。

  • 比如说一个我们下载(pull)的centos就是一个基本的单个文件,但是我们下载nginx镜像时会下载好几个文件。这是为什么
  • 在docker中这些文件都是可重用的,对一个基本的镜像文件添加了某些功能,它就形成了一个新的镜像,这里的功能可以理解为模块。
  • 我们再下载别的镜像时,如果本地已经存在新镜像包含的模块,就不会下载该模块。

正是使用类似的思想,docker的镜像文件都会很小,而且用户也很方便添加新的模块,打包我们的应用程序到镜像中,直接在生产环境启动。

这里的新模块也就是相比源镜像的变化,类似git,只要有不同就相当添加了新模块。

七、commit镜像

docker commit -m="描述信息" -a="作者" 容器id 起一个打包的镜像名:版本

以上面我们下载的tomcat为例子。 下载的官方tomcat镜像里默认webapps下是没有内容的,我们需要复制同目录下webapps.dist里的内容到webapps中,最后把这个有默认访问网页的本地容器打包成一个新的镜像。

  • 1.先修改容器
# 首先删除我们的tomcat容器,再使用docker ps -a看看还有没有
docker rm 容器id/容器名称
# 启动官方的tomcat,访问本地localhost:8888,会发现页面404,不是tomcat的默认页面
docker run -it -p 8888:8080 tomcat
# 在容器中修改默认页面
先按ctrl+p+q退出该容器
# 重新进入 ,docker ps 看容器id
docker exec -it e0414b913e0c /bin/bash
cp -r webapps.dist/* webapps
# ok,此时本地localhost:8888刷新正常出现tomcat默认页面
  • 2.再提交
docker ps # 容器id
docker commit -m="有默认页面的tomcat,看着舒服" -a="shafish" e0414b913e0c tomcatdefaultpage:0.1
# ok
docker images # 就可以看到在本地生成了一个tomcatdefaultpage镜像

八、挂载数据卷(Linux中有效)

提供数据(数据库/配置文件 etc)的外部存储和共享。需求就这么简单

第一种:外部存储(物理机-容器)

-v 物理机目录:容器目录

  • 1.命令介绍:
# 把当前的docker目录与centos容器的/home目录设置同步
docker run -it -v ./docker:/home centos /bin/bash
docker ps # 获取id
docker inspect 容器id # 主要看"Mounts"节点信息,提示type为bind即表示绑定成功

现在就可以在物理机docker目录下创建一个文件,进入容器查看是否同步。

  • 2.结合mysql实战一下: 设置mysql的配置文件和数据同步。
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# -d后台运行 -p 端口映射 - v 物理机目录:容器目录 -e 配置环境(密码) 镜像名称:镜像tag
  • 3.docker还可以不用指定物理机的目录,这种做法也称为匿名挂载
# -P随机映射端口
docker run -d -P --name fish1 -v /etc/nginx:ro nginx
  • 4.为-v指定一个挂载的名称,具名挂载。推荐使用
# 需要注意shafish前面并没有/ 说明这是一个挂载命名,不代表物理机目录
docker run -d -P --name fish2 -v shafishNginx:/etc/nginx:rw nginx

命令中容器目录后面的ro/rw 是针对容器对目录内容只读可读写的权限设置。不明白就自己跑一下 使用docker volume ls查看卷的挂载情况 使用docker volume inspect 具名挂载名称查看容器目录挂载到物理机的位置。都位于:/var/lib/docker/volumes/

  • 5.也可以通过Dockerfile在构建镜像时指定挂载 Dokerfile可以通过命令构建一个镜像文件,直接指定volume挂载目录。在当前目录创建一个名字为Dockerfile文件
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "====end==="
CMD /bin/bash

然后运行: docker build -f ./Dockerfile -t fisha/centos:1.0

Dockerfile文件命令都需要大写,每个命令都相当一个模块,在docker build时生成我们的docker镜像文件。 VOLUME ["volume1","volume2"]就是匿名挂载,使用docker inspect 镜像id可以查看mounts节点挂载信息。

第二种:数据共享(容器-容器)--volumes-from

# 创建一个名称为docker01的容器,作为父类容器,让别的容器挂载
docker run -it --name docker1 fisha/centos:1.0
# 因为fisha/centos:1.0是上面第5步使用Dockerfile创建的镜像,包含两个挂载目录,
# 使用--volumes-from 把当前新建的容器的挂载目录同步到docker1的挂载目录中
docker run -it --name docker2 --volumes-from docker1 fisha/centos:1.0
# 现在在docker1容器中创建文件,就会发现docker2的挂载目录中会同步该文件。
# 在docker2中创建文件,docker1亦然
  • 例子:创建两个myslq容器,使用同一个数据库文件。
# 父容器,指定容器内挂载目录为/etc/mysql/conf.d和/var/lib/mysql
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql
# 子容器,同样指定挂载目录,同步父容器数据,使用--volumes-from挂载mysql1
docker run -d -p 3311:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 --volumes-from mysql1 mysql

九、Dockerfile

构建镜像的脚本。

# 步骤
1. 编写镜像Dockerfile脚本
2. docker build构建成为一个镜像
3. docker run镜像
4. docker push 发布镜像

常用指令

# FROM         指定基础镜像:centos等
# MAINTAINER   表明构建本镜像的作者信息:姓名+邮箱
# RUN          镜像构建时需要运行的命令
# ADD          添加内容,比如说tomcat
# WORKDIR      镜像的工作目录
# VOLUME       挂载目录
# EXPOST       端口配置
# CMD          指定容器启动时默认运行的命令,如果用户在运行容器时编写了执行命令,就会覆盖CMD编写的命令
# ENTRYPOINT   除了默认定义的命令,在容器启动时用户还可以在追加执行命令(apped)
# ONBUILD      构建一个被继承的Dockerfile时,触发该命令
# COPY         类型add,将文件拷贝到镜像中
# ENV          构建时设置环境变量

centos官方镜像

FROM scratch  # 最基础的docker镜像,类似容器的启动引导命令
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
   org.label-schema.schema-version="1.0" \
   org.label-schema.name="CentOS Base Image" \
   org.label-schema.vendor="CentOS" \
   org.label-schema.license="GPLv2" \
   org.label-schema.build-date="20200504" \
   org.opencontainers.image.title="CentOS Base Image" \
   org.opencontainers.image.vendor="CentOS" \
   org.opencontainers.image.licenses="GPL-2.0-only" \
   org.opencontainers.image.created="2020-05-04 00:00:00+01:00"

CMD ["/bin/bash"]

例子1

我们就可以基于上面的centos镜像,在构建一个自己的镜像。

  • 编写构建文件
FROM centos  # 源镜像,在cenos的基础上构建
MAINTAINER shafish<[email protected]>  # 作者信息

ENV MYPATH /usr/local
WORKDIR $MYPATH     # 工作目录,-it进入容器时的当前目录

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80  # 暴露80端口

CMD echo $MYPATH
CMD echo "--end--"
CMD /bin/bash  # 容器启动后进入bash命令行
  • 生成镜像
# -f dokcerfile目录 -t 生成的镜像名称:版本号 .
docker build -f ./Dockerfile1 -t fishcentos:1.0 .
  • 查看镜像在本地的变更记录docker history 镜像id

例子2

CMD和ENTRYPOINT的区别。

使用CMD的Dockerfile2

FROM centos
CMD ["ls","-a"]
  • 构建镜像:docker build -f ./Dockerfile2 -t fishacentosls:1.0 .
  • 运行容器:
    • CMD命令替换:docker run fishacentosls:1.0 -lsh,会发现-l命令提示错误,这是因为用户自定义的-l替换了CMD ["ls","-a"]的内容,直接变成了CMD -l
    • CMD完整使用命令:docker run fishacentosls:1.0 ls -lsh

使用ENTRYPOINT的Dockerfile3

FROM centos
ENTRYPOINT ["ls","-a"]
  • 构建镜像:docker build -f ./Dockerfile3 -t fishcentosls2:1.0 .
  • 运行容器:
    • 用户命令直接追加:docker run fishcentosls2:1.0 -lsh

例子3 tomcat

Dockerfile构建文件

FROM centos
MAINTAINER shafish<[email protected]>

COPY readme.md /usr/local/readme.md

ADD apache-tomcat-9.0.35.tar.gz /usr/local
ADD jdk-8u251-linux-x64.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out

镜像生成

docker build -t fisahjavapro:1.0 .

使用docker images就可以看到本地有一个fisahjavapro的镜像了

容器启动

Docker run -d -p 8081:8080 --name fishajavaprodu -v ./test:/usr/local/apache-tomcat-9.0.35/webapps/test -v ./test/log/:/usr/local/apache-tomcat-9.0.35/logs fisahjavapro:1.0

下一步直接把项目放在test目录中即可运行项目

发布镜像

  • 发布到官方hub镜像仓库:https://hub.docker.com/注册个账号
# docker tag firstimage YOUR_DOCKERHUB_NAME/firstimage
docker tag fishajavaenv shafish/fishajavaenv
# docker push YOUR_DOCKERHUB_NAME/firstimage
docker push shafish/fishajavaenv

jellyfin更新

docker run -d --name=jellyfin --env=PGID=1000 --env=TZ=Europe/London --env=PUID=1000 --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=HOME=/root --env=LANGUAGE=en_US.UTF-8 --env=LANG=en_US.UTF-8 --env=TERM=xterm --env=NVIDIA_DRIVER_CAPABILITIES=compute,video,utility --volume=/data/jellyfin/config:/config --volume=/data/jellyfin/cache:/cache --volume=/mnt:/data/veracrypt --volume=/config -p 8096:8096 --expose=8920 --restart=unless-stopped linuxserver/jellyfin

docker run -d
--name=jellyfin
-e PUID=1000
-e PGID=1000
-e TZ=Asia/Shanghai
-p 8096:8096
-v /mnt/wd4t/docker/jellyfin/config:/config
-v /mnt/wd4t/docker/jellyfin/cache:/cache
-v /mnt/wd4t:/data/all
-v /mnt/wd4t/video/ghs:/data/ghs
-v /mnt/wd4t/docker/cloudTorrent/downloads:/data/cloud
--restart unless-stopped
linuxserver/jellyfin:latest

docker run -d --name=jellyfin -e PUID=1000 -e PGID=1000 -e TZ=Asia/Shanghai -p 8096:8096 -v /mnt/wd4t/docker/jellyfin/config:/config -v /mnt/wd4t/docker/jellyfin/cache:/cache -v /mnt/wd4t:/data/all -v /mnt/wd4t/video/ghs:/data/ghs -v /mnt/wd4t/docker/cloudTorrent/downloads:/data/cloud --restart unless-stopped linuxserver/jellyfin:latest

filebrower

docker run -d
--name=filebrower
-v /mnt/wd4t:/srv
-v /mnt/wd4t/docker/filebrowser/database.db:/etc/database.db
-v /mnt/wd4t/docker/filebrowser/filebrowserconfig.json:/etc/config.json
-p 4001:80
--restart=unless-stopped
filebrowser/filebrowser

初始密码admin/admin

查看docker运行容器的启动命令

runlike:https://blog.csdn.net/qq_35462323/article/details/101607062

本地磁力资源下载

docker run --name cloudTorrent -d -p 4000:3000 -v /mnt/wd4t/docker/cloudTorrent/downloads:/downloads --restart=unless-stopped jpillora/cloud-torrent

docker run --name torrents -d -p 4000:3000 -v /mnt/wd4t/docker/cloudTorrent/downloads:/downloads -v /mnt/wd4t/docker/cloudTorrent/torrents:/torrents --restart=unless-stopped boypt/cloud-torrent -p 3000 -a graham:graham110

/mnt/wd4t/video/ghs/torrents/cloud-torrent_linux_amd64 --port 4000 -t torrent-down -a graham:graham110 --proxy-url socks5://127.0.0.1:1080

/home/shafish/Project/cloud-torrent/cloud-torrent_linux_amd64 --port 4000 -t torrent-down -a graham:graham110 --proxy-url socks5://127.0.0.1:1080

docker run -d -p 3000:3000 -v /root/downloads:/downloads -v /root/torrents:/torrents boypt/cloud-torrent

Jenkins

sudo mkdir -p /var/data/jenkins_home

docker run -u root -d -p 10240:8080 -p 10241:50000 \
-v /var/data/jenkins_home:/var/jenkins_home \
-v /opt/jdk8u272-ga:/usr/local/jdk1.8 \
-v /opt/apache-maven-3.6.3:/usr/local/maven3 \
-v /usr/bin/git:/usr/bin/git \
-v /etc/localtime:/etc/localtime \
-v /var/run/docker.sock:/var/run/docker.sock \
--privileged=true --restart=always --name myjenkins jenkinsci/blueocean
  • 修改加速:/var/data/jenkins_home/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
  • 查看登录密码:docker logs myjenkins或者cat /var/data/jenkins_home/secrets/initialAdminPassword

如果登录提示offine,则修改加速后再访问xxx:10240/restart或者参考下面 网络问题 步骤解决

网络问题

# wget https://cdn.shafish.cn/bridge-utils-1.6.tar.xz
tar -xf bridge-utils-1.6.tar.xz
cd bridge-utils-1.6
yum install autoconf
autoconf
./configure --prefix=/usr
make
make install
systemctl start firewalld #启动防火墙服务
firewall-cmd --add-masquerade --permanent     ##开启IP地址转发(一直生效)
firewall-cmd --reload         ##重载防火墙规则,使之生效
systemctl stop docker
iptables -t nat -F POSTROUTING
ip link set dev docker0 down
brctl delbr docker0
systemctl start docker

短地址生成

https://www.moerats.com/archives/956/

docker run --restart=always --name lstu -d -p 8080:8080 -v "$(pwd)/lstu.conf:/home/lstu/lstu.conf" -v "$(pwd)/lstu.db:/home/lstu/lstu.db" lstu

fiora

docker pull mongo docker pull suisuijiang/fiora docker network create fiora-network docker run --name fioradb -d -p 27017:27017 --network fiora-network mongo docker run --name fiora -d -p 7799:7799 -v /opt/fiora/config/:/usr/app/fiora/fisha/ --network fiora-network -e Database=mongodb://fioradb:27017/fiora suisuijiang/fiora

# 在/opt/fiora/config目录下创建.env文件,内容如下:
DefaultGroupName=tffats
DisableCreateGroup=true
DisableDeleteMessage=true
Port=7799
JwtSecret=xxxdsdaeqtqf
DisableRegister=true
# 进入fiora容器启动复制配置文件到fiora根目录中
docker exec -it fiora /bin/bash
# 复制fisha目录下的.env到fiora根目录
cp fisha/.env ./
# 退出,重启
exit
docker restart fiora
  • 设置管理员

    • yarn script getUserId [username]
    • Administrator=xxid
  • 手动注册新用户

    • yarn script register [username] [password]
  • 删除

    • yarn script deleteUser [id]5fca63cf7bbce3001dfa3afb

去广告adguardhome

docker run --name adguardhome -v /data/adguardhome/work:/opt/adguardhome/work -v /data/adguardhome/conf:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 68:68/tcp -p 68:68/udp -p 80:80/tcp -p 443:443/tcp -p 853:853/tcp -p 3000:3000/tcp -d --restart=unless-stopped adguard/adguardhome

api接口管理平台

docker run -dt -p 7777:80 -p 6666:3306 --privileged=true -v /home/graham/docker/eolinker/config:/eolinker_os/server/RTP/config -v /home/graham/docker/eolinker/mysql:/usr/local/mysql/var --name=eolinker --restart=unless-stopped eolinker/eolinker-api-management-system
  • 80表示管理面板访问端口,对应7777
  • 3306表示内置数据库访问端口,对应6666,对应管理员密码为root/root
  • /home/graham/docker/eolinker目录权限需设置为777, chmod -R 777 /home/graham/docker/eolinker

ref:https://hub.docker.com/r/eolinker/eolinker-api-management-system

Rocket.Chat 聊天网站

docker-compose

https://docs.rocket.chat/installation/paas-deployments/aliyun/

mkdir /home/rocketchat
cd /home/rocketchat && mkdir data dump
vim docker-compose.yml
version: '2'

services:
  rocketchat:
    image: rocket.chat:latest
    restart: unless-stopped
    volumes:
      - /mnt/wd4t/docker/rocket_chat/uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://192.168.0.100
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - Accounts_UseDNSDomainCheck=True
    depends_on:
      - mongo
    ports:
      - 4006:3000

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
     - /mnt/wd4t/docker/rocket_chat/data:/data/db
     - /mnt/wd4t/docker/rocket_chat/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1

  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:4.0
    command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval \"rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})\" && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)"'
    depends_on:
      - mongo
#docker pull mongo
#docker pull rocketchat/rocket.chat
docker-compose up -d

docker

docker run --name db -d mongo:4.0 --smallfiles --replSet rs0 --oplogSize 128
docker exec -ti db mongo --eval "printjson(rs.initiate())"
docker run --name rocketchat -d -p 5555:3000 --link db --env ROOT_URL=http://192.168.0.100 --env MONGO_OPLOG_URL=mongodb://db:27017/local --restart=unless-stopped rocket.chat

docker run --name rocketchat -d -p 15555:3000 --link db --env ROOT_URL=http://8.129.84.85 --env MONGO_OPLOG_URL=mongodb://db:27017/local --restart=unless-stopped rocket.chat
  • ROOT_URL:填上内网ip

ref:https://hub.docker.com/_/rocket-chat

高仿youtube CMS

https://github.com/mediacms-io/mediacms

git clone https://github.com/mediacms-io/mediacms
cd mediacms
# 更换源,否则执行Dockerfile更新时会很慢
# 修改Dockerfile文件,在 RUN apt-get update -y && apt-get -y upgrade && apt-get install --no-install-recommends \前添加下面命令
RUN echo "cp /etc/apt/sources.list /etc/apt/sources.list.bak && \
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib \
deb http://mirrors.aliyun.com/debian-security buster/updates main \
deb-src http://mirrors.aliyun.com/debian-security buster/updates main \
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
" > /etc/apt/sources.list
# 启动
docker-compose build && docker-compose up -d
# 完整Dockerfile如下
FROM python:3.8-buster AS compile-image

SHELL ["/bin/bash", "-c"]

# Set up virtualenv
ENV VIRTUAL_ENV=/home/mediacms.io
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
ENV PIP_NO_CACHE_DIR=1

RUN mkdir -p /home/mediacms.io/mediacms/{logs,pids} && cd /home/mediacms.io && python3 -m venv $VIRTUAL_ENV

# Install dependencies:
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . /home/mediacms.io/mediacms
WORKDIR /home/mediacms.io/mediacms

# http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip
RUN wget -q https://cdn.shafish.cn/download/Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip && \
    mkdir -p /home/mediacms.io/mediacms/media_files/hls Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/ && \
    unzip -j Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/mp4hls -d Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/ && \
    rm Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip

############ RUNTIME IMAGE ############
FROM python:3.8-slim-buster as runtime-image

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV ADMIN_USER='admin'
ENV ADMIN_PASSWORD='mediacms'
ENV ADMIN_EMAIL='admin@localhost'

# See: https://github.com/celery/celery/issues/6285#issuecomment-715316219
ENV CELERY_APP='cms'

# Use these to toggle which processes supervisord should run
ENV ENABLE_UWSGI='yes'
ENV ENABLE_NGINX='yes'
ENV ENABLE_CELERY_BEAT='yes'
ENV ENABLE_CELERY_SHORT='yes'
ENV ENABLE_CELERY_LONG='yes'
ENV ENABLE_MIGRATIONS='yes'

# Set up virtualenv
ENV VIRTUAL_ENV=/home/mediacms.io
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

COPY --from=compile-image /home/mediacms.io /home/mediacms.io

RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb http://mirrors.163.com/debian/ buster main non-free contrib \
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib \
deb http://mirrors.163.com/debian/ buster-backports main non-free contrib \
deb-src http://mirrors.163.com/debian/ buster main non-free contrib \
deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib \
deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib \
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib \
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib \
" > /etc/apt/sources.list

RUN apt-get update -y && apt-get -y upgrade && apt-get install --no-install-recommends \
    supervisor nginx ffmpeg imagemagick procps -y && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get purge --auto-remove && \
    apt-get clean

WORKDIR /home/mediacms.io/mediacms

EXPOSE 9000 80

RUN chmod +x ./deploy/docker/entrypoint.sh

ENTRYPOINT ["./deploy/docker/entrypoint.sh"]

CMD ["./deploy/docker/start.sh"]
  • 注意项
# 配置管理员帐号 默认管理员帐号密码为:admin/mediacms
docker exec -it mediacms_web_1 /bin/bash
python manage.py createsuperuser
# 修改访问端口直接修改docker-compose.yaml中web 80:80即可,再修改cms配置local_setting中的ip:port
...
web:
    build:
      context: .
      target: runtime-image
    image: mediacms:latest
    deploy:
      replicas: 1
    ports:
      - "4002:80"
...

清理docker

docker system prune

docker-compose运行

docker-compose build && docker-compose up -d

查看目录内容大小

sudo du --max-depth=1 -h /var/lib/docker/

AdGuard_Home

https://github.com/AdguardTeam/AdGuardHome/wiki/Docker

docker run \
--name adguardhome \
-v /mnt/wd4t/docker/AdGuard_Home/work:/opt/adguardhome/work \
-v /mnt/wd4t/docker/AdGuard_Home/conf:/opt/adguardhome/conf \
-p 53:53/tcp -p 53:53/udp \
-p 80:80/tcp -p 4004:3000/tcp \
-p 67:67/udp -p 68:68/tcp -p 68:68/udp \
-p 443:443/tcp \
-p 853:853/tcp \
--restart=always \
-d adguard/adguardhome

docker run --name adguardhome -v /mnt/wd4t/docker/AdGuard_Home/work:/opt/adguardhome/work -v /mnt/wd4t/docker/AdGuard_Home/conf:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 81:80/tcp -p 3000:3000/tcp -p 67:67/udp -p 70:68/tcp -p 70:68/udp -p 444:443/tcp -p 853:853/tcp --restart=always -d adguard/adguardhome

This setup will automatically cover all the devices connected to your home router and you will not need to configure each of them manually.

    Open the preferences for your router. Usually, you can access it from your browser via a URL (like http://192.168.0.1/ or http://192.168.1.1/). You may be asked to enter the password. If you don't remember it, you can often reset the password by pressing a button on the router itself. Some routers require a specific application, which in that case should be already installed on your computer/phone.
    Find the DHCP/DNS settings. Look for the DNS letters next to a field which allows two or three sets of numbers, each broken into four groups of one to three digits.
    Enter your AdGuard Home server addresses there.
    You can't set a custom DNS server on some types of routers. In this case it may help if you set up AdGuard Home as a DHCP server. Otherwise, you should search for the manual on how to customize DNS servers for your particular router model.

Eclipse Theia

ref:

docker pull theiaide/theia-full
docker run --name theia-full -itd --init -p 4005:3000 -v "/mnt/wd4t/docker/theia/project:/mnt/wd4t/docker/theia/project" theiaide/theia-full:latest
docker run --name theia-py -d --init -p 4005:3000 -v "/mnt/wd4t/docker/theia/project:/home/project" theiaide/theia-python:latest
git clone https://github.com/theia-ide/theia-apps.git && cd theia-apps/theia-https-docker
docker build . --build-arg app=theia-full -t theiaide/theia-full-sec
docker run --init -itd -p 10443:10443 -e token=RS497RkpEoJ -v "$(pwd):/var/docker/theia/project:cached" theiaide/theia-full-sec
# java
docker volume create theia_workspaces
docker run -d --name theia-java --restart=unless-stopped --init -p 4005:3000 -p 4105:8080 -v theia_data:/home/project raonigabriel/theia-java
# docker run -it -p 3000:3000 -v "$(pwd):/home/project:cached" theiaide/theia-java  # OpenJ9 jdk8u191-b26

mkdocs-material

在线电子书格式:https://github.com/squidfunk/mkdocs-material docker run -d --name mkdocs -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material

在线uml绘图

https://github.com/jgraph/docker-drawio

docker run -d --name=drawio -e COUNTRY_CODE=CN --restart=unless-stopped -p 4007:8080 -p 8443:8443 jgraph/drawio:16.6.6

curl -L "https://d.pcs.baidu.com/file/fdc6ed31evc3a869cf52438ea38aefc2?fid=3107137870-250528-998089118346382&dstime=1643373666&rt=sh&sign=FDtAERVJouK-DCb740ccc5511e5e8fedcff06b081203-kCbf%2B4zv4ANLxUJRNs8MbRAD%2BUg%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=8716646158542612248&dp-callid=0&shareid=3248416136&r=839701185&resvsflag=1-12-0-1-1-1&vuk=691799587&file_type=0" --output "cxuan_PDF 大全.zip" -A "pan.baidu.com" -b "BDUSS=dVTmhlSlNDcThyUDExdXc3OU41UUx3ZVNBSmtYaUR3RWNBY2YwOWVFMEljQnRpSVFBQUFBJCQAAAAAAAAAAAEAAABIKfw4srvS1M7vz7K38QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjj82EI4~NhVD"