直播服务器搭建方法

直播服务器搭建流程

  1. 服务器上安装node-media-server
  2. 本地安装ffmpeg
  3. 测试推流
  4. 浏览器查看直播内容

1. 安装node-media-server

  1. ## 在服务器上启动node-media-server 服务
  2. docker run --name nms -d -p 1935:1935 -p 8000:8000 -p 8443:8443 illuspas/node-media-server

2. 本地安装 ffmpeg

  1. 下载解压对应版本的ffmpeg到本地: https://github.com/BtbN/FFmpeg-Builds/releases
  2. 添加环境变量

3. 测试推流

  1. ## 在本地找到视频文件目录, 执行推流命令
  2. ffmpeg -re -i hello.mp4 -c copy -f flv rtmp://localhost/live/hello

4. 浏览器查看直播

使用NodePlayer.js 播放直播内容: https://github.com/illuspas/NodePlayer.js

  1. <canvas id="video" width="640" height="480" data-url="ws://localhost:8000/live/hello"></canvas>
  2. <input type="button" onclick="play()" value="play">
  3. <script src="NodePlayer.js"></script>
  4. <script>
  5. function play() {
  6. var url = document.getElementById("video").dataset.url;
  7. var np = new Module.NodePlayer();
  8. np.setPlayView('video');
  9. np.setScaleMode(1);
  10. np.on('start', () => {
  11. Module.print('NodePlayer on start');
  12. });
  13. np.on('close', () => {
  14. Module.print('NodePlayer on close');
  15. });
  16. np.on('error', (err) => {
  17. Module.print('NodePlayer on error', err);
  18. });
  19. // np.enableVideo(true);
  20. // np.enableAudio(true);
  21. np.start(url);
  22. }
  23. </script>

相关下载

  1. node-media-server: https://github.com/illuspas/Node-Media-Server
  2. ffmpeg: https://github.com/BtbN/FFmpeg-Builds/releases
  3. NodePlayer: https://github.com/illuspas/NodePlayer.js

docker容器不能启动的解决方法

因为系统异常退出, 导致容器不能启动, 提示下面错误:

  1. root@host:~# docker start gogs
  2. Error response from daemon: OCI runtime create failed: container with id exists: 1d8cac1e6ed19db70171786f102f66194d0b2fc5c9f8e6b58da73ae21b319dc8: unknown
  3. Error: failed to start containers: gogs

解决方法和步骤:

  1. 进入系统目录 cd /var/run/docker/runtime-runc/moby/
  2. 删除对应的id目录, 比如这里是 rm -rf 1d8cac1e6ed19db70171786f102f66194d0b2fc5c9f8e6b58da73ae21b319dc8

之后就可以成功 docker start gogs 了.

收藏一些docker镜像和使用方法

  1. version: '2'
  2. services:
  3. proxy:
  4. image: 'jwilder/nginx-proxy'
  5. volumes:
  6. - /var/run/docker.sock:/tmp/docker.sock
  7. ports:
  8. - '80:80'
  9. mysql:
  10. image: mysql:5.7
  11. environment:
  12. - MYSQL_ROOT_PASSWORD=root
  13. volumes:
  14. - "./data/mysql:/var/lib/mysql"
  15. ports:
  16. - '3306:3306'
  17. redis:
  18. image: redis
  19. def:
  20. image: zhaishuaigan/php
  21. volumes:
  22. - "./:/app"
  23. links:
  24. - mysql
  25. - redis
  26. environment:
  27. - VIRTUAL_HOST=shuai.cn
  1. docker run -p 80:80 -p 443:443 -itd --restart always -v /var/run/docker.sock:/tmp/docker.sock:ro --name proxy neilpang/nginx-proxy
  2. docker run -d --name api --restart=always -v /www/api:/app -e VIRTUAL_HOST=api.ngapp.net -e ENABLE_ACME=true zhaishuaigan/php:tp5
  3. docker run -d --name api --restart=always -v /root/www/api:/app -e VIRTUAL_HOST=api.admin-ui.cn -e ENABLE_ACME=true zhaishuaigan/php

nodejs开发的神器 now

now是什么?

now 允许您轻松、快速和可靠地将JavaScript(Node.js)或Docker支持的网站、应用程序和服务带到云中。实际上,包含package.json或Dockerfile的任何目录都可以通过一个命令:now传输到云。

每次部署一个项目,now 将提供一个新的、唯一的URL(甚至在上传完成之前)。这些URL将看起来像这样(我的应用程序-随机字符串):my-app-erkgfjtrna.now.sh 。

当您部署到生产时,您只需选择适当的别名(自定义域)即可。

官网地址: https:/zeit.co

使用方法

  1. 下载命令行工具: npm install -g now
  2. 创建开发目录 mkdir my-project && cd my-project
  3. 创建package.json
    1. {
    2. "name": "koa",
    3. "version": "1.0.0",
    4. "description": "",
    5. "main": "index.js",
    6. "scripts": {
    7. "start": "node index.js"
    8. },
    9. "author": "",
    10. "license": "ISC",
    11. "dependencies": {
    12. "koa": "^2.6.1"
    13. }
    14. }
  4. 创建index.js
    1. const Koa = require('koa');
    2. const app = new Koa();
    3. app.use(ctx => {
    4. ctx.body = 'Hello Koa';
    5. });
    6. app.listen(80);
  5. 登录 now login 然后输入邮箱地址收取验证邮件, 点击邮件里的验证链接, 这里需要翻墙, 因为验证页面有个js在google上.
  6. 执行 now --public 会输出类似下面的结果.
    1. > Deploying D:\xxxx\my-project under shuai
    2. > Synced 2 files (366B) [1s]
    3. > Using Node.js 8.11.3 (default)
    4. > https://my-project-lcjucjkwmi.now.sh [in clipboard] (sfo1) [3s]
    5. > Building
  7. 执行完成后, 就可以打开上面的地址看到运行结果

别名使用

now --public && now alias shuai
即可生成一个 shuai.now.sh 的地址, 方便记忆

使用自己的域名

now --public && now alias shuai.com
需要根据提示验证域名所有权就能使用自己的域名访问了, 而且自动生成https证书

Vagrant+Virtual Box 快速搭建开发环境

  1. Vagrant.configure("2") do |config|
  2. config.vm.box = "ubuntu/xenial64"
  3. # config.vm.network "forwarded_port", guest: 80, host: 80
  4. # config.vm.network "forwarded_port", guest: 3306, host: 3306
  5. config.vm.network "private_network", ip: "10.0.0.3"
  6. config.vm.provision "shell", inline: <<-SHELL
  7. # 更换aliyun软件源
  8. cp /etc/apt/sources.list /etc/apt/sources.list.bak
  9. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list
  10. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list
  11. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list
  12. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse' >> /etc/apt/sources.list
  13. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list
  14. apt-get update
  15. # 安装docker
  16. apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  17. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  18. add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  19. apt-get -y update
  20. apt-get -y install docker-ce docker-compose
  21. # 使用aliyun加速docker镜像
  22. mkdir -p /etc/docker
  23. echo '{' > /etc/docker/daemon.json
  24. echo ' "registry-mirrors": ["https://kag9wqej.mirror.aliyuncs.com"]' >> /etc/docker/daemon.json
  25. echo '}' >> /etc/docker/daemon.json
  26. systemctl daemon-reload
  27. systemctl restart docker
  28. # 把vagrant用户添加到 docker 组
  29. usermod -G docker vagrant
  30. # ssh登录后, 进入/vagrant目录, 并启动docker compose , 然后 输出一下当前正在运行的容器
  31. echo 'cd /vagrant && docker-compose up -d && docker ps' >> /home/vagrant/.bashrc
  32. SHELL
  33. end

自动生成免费 letsencrypt ssl 证书的全自动 nginx 反向代理 docker 镜像

转载, 原文地址: https://github.com/Neilpang/nginx-proxy/wiki
本文是介绍一个 docker 镜像的, 可以全自动实现反向代理, 并自动配置 ssl 证书.

这里主要说两个问题:

  1. 对于只有一个公网 ip 的 docker host, 如果想在其中跑多个 web server 就有问题了, 因为 80 端口只能分配给一个 docker container. 怎么办, 一个好办法就是开一个反向代理. 把 80 端口分配给反向代理, 然后反向代理再根据域名分发给不同的内部 docker container. 看起来很简单对吧, 这没什么. 但是你一旦关闭重启内部的 web server container, 它的内部 ip 可能就会发生改变, 此时你不得不修改反向代理的配置, 并重新加载. 这些工作能不能自动完成 ?
  2. 第二个问题, 反向代理上能不能自动配置 ssl 证书. letsencrypt 不是有免费证书吗?
    很好, 这两个问题的答案都是肯定的. 分三步来说. 不用担心, 非常简单, 本文不会很长, 你会在几分钟只内完成.

1. 先说第一个问题. 自动配置 docker 反向代理.

用 nginx 镜像做一个反向代理, 并且能根据当前 docker host 的 container 的变化, 自动配置反向代理的 ip 和端口.

这个问题其实早就有人解决了, 比如这两个项目:

使用 docker api 可以自动监控 container 变化, 根据模板生成配置文件.

https://github.com/jwilder/docker-gen

作者另外的一个项目, 专门实现了 nginx 的反向代理.

https://github.com/jwilder/nginx-proxy

如果你只需要反向代理, 并不需要自动配置 ssl 的话, 本文你读到这里就可以了.

2. 为 nginx 反向代理自动配置 ssl

为了自动配置 ssl, 我 fork 了上面的项目, 并做了少量修改, 加入了 acme.sh 的支持, 可以实现全自动 配置 ssl 证书.

https://github.com/Neilpang/nginx-proxy

并且已经在 docker hub 上发布了 trusted build:

docker pul neilpang/nginx-proxy

3. 第三步, 快速上手

首先在运行反向代理:

  1. mkdir proxy
  2. cd proxy
  3. docker run \
  4. --rm -it -d \
  5. -p 80:80 \
  6. -p 443:443 \
  7. -v /var/run/docker.sock:/tmp/docker.sock:ro \
  8. -v $(pwd)/certs:/etc/nginx/certs \
  9. -v $(pwd)/acme:/acmecerts \
  10. neilpang/nginx-proxy

稍微解释一下: 运行一个反向代理 并把 80 和 443 端口都分配给它. 并且把 /var/run/docker.sock 传递给 container , 这是 docker api 操作文件.

现在可以运行你的 web server container 了:
先把你的一个域名解析到 docker host ip, 例如: example.com

然后, 我们随便启动一个 webserver:

  1. docker run --rm -itd \
  2. -e VIRTUAL_HOST=example.com \
  3. --name test \
  4. httpd

注意到上面的参数了吗: -e VIRTUAL_HOST=example.com

我们在上一步中运行的 neilpang/nginx-proxy 会自动监控这个 host 上的每一个 container 的变化. 如果发现有 VIRTUAL_HOST 变量, 就会自动配置反向代理.

试试访问你的域名:

http://example.com
现在给这个反向代理配置 ssl:

在此之前,请确保你的域名已经指向了主机 ip, 因为 letsencrypt 证书需要验证域名所有权.

  1. docker kill test
  2. docker run --rm -itd \
  3. -e VIRTUAL_HOST=example.com \
  4. -e ENABLE_ACME=true \
  5. --name test \
  6. httpd

注意到不同了吗, 仅仅多了一个变量: ENABLE_ACME=true

大概几十秒之后, ssl 证书就会自动配置成功了.

访问试试:

https://example.com
注意, 这个证书是自动配置的, 今后会自动更新, 让你完全忘了它的存在.

有多个域名绑定: 用逗号分隔.

  1. docker kill test
  2. docker run --rm -it -d \
  3. -e VIRTUAL_HOST=example.com,www.example.com \
  4. -e ENABLE_ACME=true \
  5. --name test \
  6. httpd

另外, 这个镜像还有一个好处就是已经配置了从 http 跳转到 https, 并且自动启用 http 2.0

反代 非 80 的自定义端口:
加上: VIRTUAL_PORT=8080 即可

  1. docker run --rm -itd \
  2. -e VIRTUAL_HOST=example.com,www.example.com \
  3. -e ENABLE_ACME=true \
  4. -e VIRTUAL_PORT=8080 \
  5. --name test \
  6. httpd

比如搭建gogs 服务器:

  1. docker run -itd --restart always \
  2. --name gogs \
  3. -e VIRTUAL_HOST=git.ngapp.net \
  4. -e ENABLE_ACME=true \
  5. -e VIRTUAL_PORT=3000 \
  6. -v /data/gogs:/data \
  7. gogs/gogs

原文链接: https://github.com/Neilpang/nginx-proxy/wiki

希望能帮到更多人,节约你的时间和精力.

欢迎大家转载 请保留链接.

欢迎 star:

https://github.com/Neilpang/nginx-proxy

vagrant+docker一键搭建php+mysql开发环境

必备软件

  1. Vagrant
  2. Virtual Box

启动脚本

  1. Vagrantfile
  1. Vagrant.configure("2") do |config|
  2. config.vm.box = "ubuntu/xenial64"
  3. config.vm.network "forwarded_port", guest: 80, host: 80
  4. config.vm.network "forwarded_port", guest: 3306, host: 3306
  5. config.vm.network "private_network", ip: "10.0.0.2"
  6. config.vm.provision "shell", inline: <<-SHELL
  7. # 更换aliyun软件源
  8. cp /etc/apt/sources.list /etc/apt/sources.list.bak
  9. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list
  10. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list
  11. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list
  12. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse' >> /etc/apt/sources.list
  13. echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list
  14. apt-get update
  15. # 安装docker
  16. apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  17. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  18. add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  19. apt-get -y update
  20. apt-get -y install docker-ce docker-compose
  21. # 使用aliyun加速docker镜像
  22. mkdir -p /etc/docker
  23. echo '{' > /etc/docker/daemon.json
  24. echo ' "registry-mirrors": ["https://kag9wqej.mirror.aliyuncs.com"]' >> /etc/docker/daemon.json
  25. echo '}' >> /etc/docker/daemon.json
  26. systemctl daemon-reload
  27. systemctl restart docker
  28. usermod -G docker vagrant
  29. cd /vagrant
  30. docker-compose up -d
  31. # 开机自启动
  32. echo '#!/bin/bash' > /etc/rc.local
  33. echo 'sleep 10' >> /etc/rc.local
  34. echo 'cd /vagrant' >> /etc/rc.local
  35. echo 'docker-compose up -d' >> /etc/rc.local
  36. echo 'exit 0' >> /etc/rc.local
  37. sudo rm /bin/sh
  38. sudo ln -s /bin/bash /bin/sh
  39. SHELL
  40. end
  1. docker-compose.yml
  1. version: '2'
  2. services:
  3. mysql:
  4. image: mysql
  5. environment:
  6. - MYSQL_ROOT_PASSWORD=root
  7. volumes:
  8. - "./mysql:/var/lib/mysql"
  9. ports:
  10. - '3306:3306'
  11. networks:
  12. - bridge
  13. www:
  14. build: .
  15. volumes:
  16. - "./wwwroot/www:/app"
  17. - "./wwwroot/static/Uploads:/app/Uploads"
  18. environment:
  19. - VIRTUAL_HOST="你要绑定的域名"
  20. - PHP_DB_HOST=mysql
  21. - PHP_DB_NAME=你的数据库名称
  22. - PHP_DB_USER=root
  23. - PHP_DB_PASSWORD=root
  24. networks:
  25. - bridge
  26. lb:
  27. image: 'dockercloud/haproxy'
  28. volumes:
  29. - /var/run/docker.sock:/var/run/docker.sock
  30. links:
  31. - www
  32. ports:
  33. - '80:80'
  34. networks:
  35. - bridge
  36. networks:
  37. bridge:
  1. Dockerfile
  1. FROM php:5.6-apache
  2. # 安装扩展
  3. COPY ./soft/*.tgz /soft/
  4. WORKDIR /soft
  5. RUN pecl install redis-3.1.6.tgz \
  6. && pecl install xdebug-2.5.5.tgz \
  7. && docker-php-ext-enable redis xdebug \
  8. && docker-php-ext-install pdo_mysql \
  9. && docker-php-ext-install mysqli \
  10. && rm -rf /soft
  11. # URL重写
  12. RUN a2enmod rewrite
  13. # 安装composer
  14. ADD ./soft/composer.phar /usr/local/bin/composer
  15. RUN chmod 755 /usr/local/bin/composer \
  16. && composer config -g repo.packagist composer https://packagist.phpcomposer.com
  17. # 安装代码
  18. COPY ./wwwroot /app/
  19. # 修改网站主目录
  20. ENV APACHE_DOCUMENT_ROOT /app
  21. RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
  22. RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
  23. # 可写权限
  24. RUN chmod -R 777 /app/
  25. # 默认工作目录
  26. WORKDIR /app
  27. # 暴露工作端口
  28. EXPOSE 80 443 22

docker的web管理工具

海鸥

Docker Pulls
GoDoc
Gitter

简介

Seagull 友好的docker Web界面管理工具

  • 易于安装和卸载在Docker容器
  • 单击开始/停止/删除容器和镜像
  • 超快速(小于10ms)的搜索和过滤
  • 支持多主机管理和监控
  • 国际化主要包括英语、汉语、德语和法语

更多信息, 请到 dockerseagull.com, 观看 三分钟视频官方的幻灯片.

github地址

点击跳转: https://github.com/tobegit3hub/seagull

安装

  1. docker run -d -p 10086:10086 -v /var/run/docker.sock:/var/run/docker.sock tobegit3hub/seagull

或运行 docker-compose up -d.

截图

多主机

Seagull支持监控多台服务器。确保你开始Docker守护这样。

  1. docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -api-enable-cors=true -d

参与

Seagull is written in Go with tools like Docker, Beego, AngularJS, Bootstrap and JQuery.

  1. Install golang and setup $GOPATH
  2. go get github.com/astaxie/beego
  3. go get github.com/tobegit3hub/seagull
  4. go build seagull.go
  5. sudo ./seagull

More detail in seagull-design-and-implement and we have excellent documents in docs.

提醒

The issue #2 每个人都可以在IP和端口海鸥接触访问您的码头工人守护。为了安全,你可以绑定到本地主机的访问限制。

  1. docker run -d -p 127.0.0.1:10086:10086 -v /var/run/docker.sock:/var/run/docker.sock tobegit3hub/seagull

类似的Docker项目

现在有很多类似的项目提供了Web界面来监控Docker。海鸥就是受他们影响并且期望做得比他们更好。

我想把这些项目都介绍给你们,任何人都可以根据他们所需要的进行选择。

Dockerui

这是它的Github主页,https://github.com/crosbymichael/dockerui.

你可以发现海鸥的UI是有点像Dockerui。因为我们都使用了Bootstrap和AngularJS作为前端框架。它是一个很好的项目并且在Github上有差不多2000个关注。

海鸥从Dockerui中学习了很多,包括使用JQuery.Gritter作为网站通知。但Dockerui的界面不够简洁,而且它没有考虑到国际化的需求,而我们考虑到了。我们愿意为全世界的开发者多做些事情。Dockerui还没有实现搜索功能而海鸥则很擅长这点。

Dockerui和海鸥是同类型产品,用于监控Docker。你没必要同时使用他们。而我们的目标就是用一个更友好、更实用的UI满足用户,并且取代Dockerui。

Zdocker

这是它的Github主页,https://github.com/love320/Zdocker.

Zdocker做了同类的事情来监控Docker镜像和容器。但它是使用Java实现的,而且没有提供Docker镜像,而且人们很难使用和学习。

这只能算是个人项目,我并不建议你去使用。因为目前为止我也不知道该怎样去运行它。

Shipyard

这是它的Github主页,https://github.com/shipyard/shipyard.

Shipyard设计来管理一个Docker集群。你必须输入服务器的SSH认证代码才能部署Shipyard引擎。然后你就可以通过命令行或者Web界面在你管理的服务器上部署容器了。

它和海鸥是非常不同的,因为海鸥仅仅是监控Docker而不会要求更多的权限。因此你可以使用Shipyard作为管理系统,同时使用海鸥来监控Docker。

CAdvisor

这是它的Github主页,https://github.com/google/cadvisor.

CAdvisor来自于Google,它主要是为了分析容器的资源。你可以使用它来监控你的容器占用CPU或者内存的历史情况。

然后,你不能用CAdivsor来管理你的镜像和容器。

Docker Registry Web

这是它的Github主页,https://github.com/atc-/docker-registry-web.

这是为Docker参与设计的Web界面。它的UI展示不错但你必须手动添加私有仓库地址。它用了Cookies来存储这个地址所以每次你运行时都要重新添加。

当我尝试去搜索Docker镜像时程序崩溃了。当我尝试去或者镜像详细信息的时候它显示“方法未授权”。

我希望他们可以在我们添加私有仓库时就默认添加Docker官方仓库。但我不太可能因为http://registry.hub.docker.com不支持CORS。

Docker Registry UI

这是它的Github主页,https://github.com/worksap-ate/docker-registry-ui.

这也是为Docker仓库设计的Web界面。它能用但是UI不是很好。

Docker Register Frontend

这是它的Github主页,https://github.com/kwk/docker-registry-frontend.

这几乎是跟Docker-registry-web和Docker-registry-ui是一样的东西。