Docker 部署常见应用
Portainer
https://www.portainer.io/installation
docker volume create portainer_data docker run --restart=always --name portainer \ -v portainer_data:/data \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 8000:8000 -p 9443:9443 -d portainer/portainer-ce
数据卷默认路径:/var/lib/docker/volumes/portainer_data/_data
访问:https://127.0.0.1:9443
除了 portainer,也可使用 cadvisor + influxdb(prometheus) + grafna:https://github.com/google/cadvisor
MySQL
https://hub.docker.com/_/mysql
docker run --restart=always --name mysql \ -v /opt/mysql/data:/var/lib/mysql \ -v /opt/mysql/log:/var/log/mysql \ -v /opt/mysql/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=root -e MYSQL_ROOT_HOST=% -e TZ=Asia/Shanghai \ -p 3306:3306 -d mysql:latest
docker mysql 连接慢:https://dev.mysql.com/doc/refman/8.0/en/host-cache.html
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve
vim /opt/mysql/conf/config-file.cnf [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] max_connections = 1000 default-time-zone = '+08:00' init_connect = 'SET collation_connection = utf8mb4_unicode_ci' init_connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci skip-character-set-client-handshake skip-name-resolve
查看帮助
docker run -it --rm mysql:latest --verbose --help
MYSQL_ROOT_PASSWORD:root 密码
MYSQL_ROOT_HOST:root 用户远程访问,% 表示任意地址
TZ:时区
其它可用环境变量:https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html
-v /opt/mysql/data:/var/lib/mysql:数据目录
-v /opt/mysql/conf:/etc/mysql/conf.d:配置目录,MySQL 实例从采用混合(/etc/mysql/my.cnf 和自定义配置)设置
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
MariaDB
docker run --name my-mariadb \ -v /opt/mariadb/conf:/etc/mysql/conf.d \ -v /opt/mariadb/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -p 3306:3306 -d mariadb:10.5.8 \ --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
https://hub.docker.com/_/mariadb
RabbitMQ
docker run --restart=always -d --name rabbitmq --hostname my-rabbit \ -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest \ -p 5672:5672 -p 15672:15672 \ -v /opt/rabbitmq:/var/lib/rabbitmq/mnesia \ rabbitmq:management-alpine
https://hub.docker.com/_/rabbitmq
Jenkins
https://www.jenkins.io/zh/doc/book/installing
https://www.jenkins.io/doc/book/installing/#installing-docker
# 创建网桥网络 docker network create jenkins # 创建数据卷,持久化 Jenkins 数据 docker volume create jenkins-data docker run \ --name=jenkins \ --restart=always \ -u root \ -d \ -p 8090:8080 \ -p 50000:50000 \ -v /home/jenkins/data:/var/jenkins_home:Z \ -v /home/jenkins/tools:/tools:Z \ -v /var/run/docker.sock:/var/run/docker.sock:Z \ jenkinsci/blueocean
https://www.jenkins.io/doc/book/installing/#setup-wizard
指定用户:--user $(id -u),默认用户为 guest
jenkins-data 数据卷默认路径:/var/lib/docker/volumes/jenkins-data/_data
ElasticSearch
IK 分词:https://github.com/medcl/elasticsearch-analysis-ik/releases
mkdir -p /opt/elasticsearch/config mkdir -p /opt/elasticsearch/data mkdir -p /opt/elasticsearch/plugins echo "http.host: 0.0.0.0" >> /opt/elasticsearch/config/elasticsearch.yml docker run --restart=always --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.9.3 docker run --restart=always --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.8.121:9200 -p 5601:5601 -d kibana:7.9.3
将 IK 分词插件解压后放置 /opt/elasticsearch/plugins 下,重启 ES 容器即可,注意 IK 版本要与 ES 版本对应
查看 IK 是否安装成功
# 查看 ES 容器 ID docker ps # 进入 ES 容器 docker exec -it 59a00c5f46cb /bin/bash # 列出所有已安装插件 ./bin/elasticsearch-plugin list # 退出容器,不会关闭容器 exit
Redis
https://hub.docker.com/_/redis
mkdir -p /opt/redis/data mkdir -p /opt/redis/conf # touch /opt/redis/conf/redis.conf echo "appendonly yes" >> /opt/redis/conf/redis.conf # 要存在 /opt/redis/conf/redis.conf 文件 docker run --restart=always --name redis \ -v /opt/redis/data:/data \ -v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \ -p 6379:6379 -d redis:alpine \ redis-server /etc/redis/redis.conf # 连接 Redis docker exec -it redis redis-cli quit
Prometheus
docker run -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus
/opt/prometheus/prometheus.yml
global: scrape_interval: 60s evaluation_interval: 60s scrape_configs: - job_name: 'spis' scrape_interval: 60s scrape_timeout: 10s metrics_path: '/spis/actuator/prometheus' static_configs: - targets: ['xxx:80','xxx:8080']
http://xxx:9090/targets
Grafana
docker run -d -p 3000:3000 --name grafana -v /opt/grafana:/var/lib/grafana grafana/grafana
默认用户名密码都是 admin,第一次登录后需要设置新密码
https://www.cnblogs.com/larrydpk/p/12563497.html
https://grafana.com/grafana/dashboards
Nexus3
mkdir /opt/nexus3 && chown -R 200 /opt/nexus3 docker run -d -p 8081:8081 --restart=always --name nexus3 -v /opt/nexus3:/nexus-data sonatype/nexus3
用户名:admin,密码:docker exec -it nexus3 cat /nexus-data/admin.password
https://hub.docker.com/r/sonatype/nexus3
配置 maven 程序中的 settings.xml
<server> <id>xxx-xxx</id> <!-- 随意 --> <username>admin</username> <password>admin</password> </server> </servers>
配置要上传 jar 包项目中的 pom.xml,执行 deploy 就会上传
<distributionManagement> <repository> <!--这里的 id 需要和 settings.xml 中 server 的 id 一致--> <id>xxx-xxx</id> <url>http://xxx.xxx.xxx.xxx:8081/repository/xxx-xxx</url> </repository> </distributionManagement>
配置要使用 jar 包中的 pom.xml
<repositories> <repository> <id>xxx-xxx</id> <url>http://xxx.xxx.xxx.xxx:8081/repository/xxx-xxx</url> </repository> </repositories>
https://blog.csdn.net/mytt_10566/article/details/78966577
Tomcat
https://registry.hub.docker.com/_/tomcat
docker run -d -p 8888:8080 \ -v /home/dsw/docker/tomcat/logs/:/usr/local/tomcat/logs/ \ -v /home/dsw/docker/tomcat/webapps/:/usr/local/tomcat/webapps/ \ tomcat:9.0
容器内安装 vim
docker exec -it --user root xxxxxxxx /bin/bash cp /etc/apt/sources.list /etc/apt/sources.list.bak sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list sed -i 's|security.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list apt-get update apt-get install vim
manager-gui 配置:https://www.cnblogs.com/jhxxb/p/11240356.html
Oracle DataBase
https://hub.docker.com/r/loliconneko/oracle-ee-11g
docker run --restart=always --name oracle-11g \ -v /home/dsw/oracle:/u01/app/oracle \ -e WEB_CONSOLE=false \ -e DBCA_TOTAL_MEMORY=4096 \ -p 1521:1521 \ -d loliconneko/oracle-ee-11g
连接信息
hostname: localhost port: 1521 sid: EE service name: EE.oracle.docker username: system password: oracle
https://hub.docker.com/r/gvenzl/oracle-xe
docker run --restart=always --name oracle-11g \ -e ORACLE_PASSWORD=oracle \ -p 1521:1521 \ -d gvenzl/oracle-xe:11-slim
连接信息
hostname: localhost port: 1521 sid: XE service name: XE username: sys password: oracle
也可自己构建镜像:https://www.cnblogs.com/jhxxb/p/14991326.html
构建好的 11g:docker pull registry.cn-hangzhou.aliyuncs.com/tricking/oracle_database:11.2.0.2-xe
运行 Java 应用
构建 oracle java 镜像:https://github.com/oracle/docker-images/tree/main/OracleJava
构建好的 java8:docker pull registry.cn-hangzhou.aliyuncs.com/tricking/oracle_java:8-oraclelinux7
与构建 oracle database 类似:https://www.cnblogs.com/jhxxb/p/14991326.html
docker run -d --restart=always --name springboot \ -v /opt/springboot:/java \ -p 9000:9000 \ oracle/serverjre:8-oraclelinux7 \ java -Dspring.profiles.active=dev -Dserver.port=9000 -Dlogging.file.name=/java/logs/file.log -jar /java/springboot.jar
gitlab
https://docs.gitlab.com/ee/install/docker.html
sudo docker run --detach \ --hostname 10.74.2.72 \ --publish 7003:443 --publish 7001:80 --publish 7002:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab:Z \ --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \ --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \ gitlab/gitlab-ee:latest
查看日志及密码
sudo docker logs -f gitlab sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Janus
从源码构建:https://github.com/canyanio/janus-gateway-docker
Dockerfile,这里添加了 --enable-docs,构建时需要安装 doxygen 和 graphviz
FROM debian:bullseye-slim RUN sed -i "s@http://\(deb\|security\).debian.org@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list RUN apt-get -y update && \ apt-get install -y \ libavutil-dev \ libavformat-dev \ libavcodec-dev \ libmicrohttpd-dev \ libjansson-dev \ libssl-dev \ libsofia-sip-ua-dev \ libglib2.0-dev \ libopus-dev \ libogg-dev \ libcurl4-openssl-dev \ liblua5.3-dev \ libconfig-dev \ libusrsctp-dev \ libwebsockets-dev \ libnanomsg-dev \ librabbitmq-dev \ pkg-config \ gengetopt \ libtool \ automake \ build-essential \ wget \ git doxygen graphviz \ gtk-doc-tools && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN cd /tmp && \ wget https://github.do/https://github.com/cisco/libsrtp/archive/v2.3.0.tar.gz && \ tar xfv v2.3.0.tar.gz && \ cd libsrtp-2.3.0 && \ ./configure --prefix=/usr --enable-openssl && \ make shared_library && \ make install RUN cd /tmp && \ git clone https://ghproxy.fsofso.com/https://github.com/libnice/libnice.git && \ cd libnice && \ git checkout 0.1.17 && \ ./autogen.sh && \ ./configure --prefix=/usr && \ make && \ make install COPY . /usr/local/src/janus-gateway RUN cd /usr/local/src/janus-gateway && \ sh autogen.sh && \ ./configure --enable-post-processing --enable-docs --prefix=/usr/local && \ make && \ make install && \ make configs RUN ls -l /usr/local/src/janus-gateway FROM debian:bullseye-slim RUN sed -i "s@http://\(deb\|security\).debian.org@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list RUN apt-get -y update && \ apt-get install -y \ libmicrohttpd12 \ libavutil-dev \ libavformat-dev \ libavcodec-dev \ libjansson4 \ libssl1.1 \ libsofia-sip-ua0 \ libglib2.0-0 \ libopus0 \ libogg0 \ libcurl4 \ liblua5.3-0 \ libconfig9 \ libusrsctp1 \ libwebsockets16 \ libnanomsg5 \ librabbitmq4 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY --from=0 /usr/lib/libsrtp2.so.1 /usr/lib/libsrtp2.so.1 RUN ln -s /usr/lib/libsrtp2.so.1 /usr/lib/libsrtp2.so COPY --from=0 /usr/lib/libnice.la /usr/lib/libnice.la COPY --from=0 /usr/lib/libnice.so.10.10.0 /usr/lib/libnice.so.10.10.0 RUN ln -s /usr/lib/libnice.so.10.10.0 /usr/lib/libnice.so.10 RUN ln -s /usr/lib/libnice.so.10.10.0 /usr/lib/libnice.so COPY --from=0 /usr/local/bin/janus /usr/local/bin/janus COPY --from=0 /usr/local/bin/janus-pp-rec /usr/local/bin/janus-pp-rec COPY --from=0 /usr/local/bin/janus-cfgconv /usr/local/bin/janus-cfgconv COPY --from=0 /usr/local/etc/janus /usr/local/etc/janus COPY --from=0 /usr/local/lib/janus /usr/local/lib/janus COPY --from=0 /usr/local/share/janus /usr/local/share/janus COPY --from=0 /usr/local/share/doc/janus-gateway/janus-gateway-1.0.1/html /usr/local/share/janus/demos/docs EXPOSE 10000-10200/udp EXPOSE 8188 EXPOSE 8088 EXPOSE 8089 EXPOSE 8889 EXPOSE 8000 EXPOSE 7088 EXPOSE 7089 CMD ["/usr/local/bin/janus"]
构建
git clone --branch master --depth 1 https://github.com/meetecho/janus-gateway.git find . -type f -print0 | xargs -0 dos2unix docker build -f ../Dockerfile -t canyan/janus-gateway:master .
从 https://hub.docker.com/r/canyan/janus-gateway 构建
nginx.conf
events { } http { include /etc/nginx/mime.types; server { listen 80; rewrite ^(.*)$ https://$host$1 permanent; } map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 443 ssl; ssl_certificate /cert/server.crt; ssl_certificate_key /cert/server.key; location / { root /usr/local/share/janus/demos; index index.html index.htm; } location ~ /.*\.(bmp|gif|jpg|png|css|js|cur|flv|ico|swf|doc|pdf|html)$ { root /usr/local/share/janus/demos; expires 1d; } location /janus { proxy_pass http://127.0.0.1:8088/janus; } location /admin { proxy_pass http://127.0.0.1:7088/admin; } location /ws { proxy_pass http://127.0.0.1:8188; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } }
Dockerfile
FROM canyan/janus-gateway:master RUN sed -i "s@http://\(deb\|security\).debian.org@http://mirrors.163.com@g" /etc/apt/sources.list RUN apt-get update && apt-get install -y curl # https://janus.conf.meetecho.com RUN mkdir -p /usr/local/share/janus/demos/js/ /usr/local/share/janus/demos/fonts/ RUN curl https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2?v=4.7.0 -o /usr/local/share/janus/demos/fonts/fontawesome-webfont.woff2 RUN curl https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/cerulean/bootstrap.min.css -o /usr/local/share/janus/demos/css/bootstrap.min.css RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/bootswatch/.*/cerulean/bootstrap.min.css@/css/bootstrap.min.css@g `grep bootstrap.min.css -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js -o /usr/local/share/janus/demos/js/bootstrap.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/.*/js/bootstrap.min.js@/js/bootstrap.min.js@g `grep bootstrap.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js -o /usr/local/share/janus/demos/js/jquery.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/jquery/.*/jquery.min.js@/js/jquery.min.js@g `grep jquery.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/webrtc-adapter/8.1.1/adapter.min.js -o /usr/local/share/janus/demos/js/adapter.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/webrtc-adapter/8.1.1/adapter.min.js@/js/adapter.min.js@g `grep adapter.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css -o /usr/local/share/janus/demos/css/font-awesome.min.css RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css@/css/font-awesome.min.css@g `grep font-awesome.min.css -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js -o /usr/local/share/janus/demos/js/jquery.blockUI.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js@/js/jquery.blockUI.min.js@g `grep jquery.blockUI.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js -o /usr/local/share/janus/demos/js/bootbox.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js@/js/bootbox.min.js@g `grep bootbox.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/spin.js/2.3.2/spin.min.js -o /usr/local/share/janus/demos/js/spin.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/spin.js/2.3.2/spin.min.js@/js/spin.min.js@g `grep spin.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js -o /usr/local/share/janus/demos/js/toastr.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js@/js/toastr.min.js@g `grep toastr.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css -o /usr/local/share/janus/demos/css/toastr.min.css RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css@/css/toastr.min.css@g `grep toastr.min.css -rl --include="*.html" /usr/local/share/janus/demos/` RUN curl https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.6.0/js/md5.min.js -o /usr/local/share/janus/demos/js/md5.min.js RUN sed -i s@https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.6.0/js/md5.min.js@/js/md5.min.js@g `grep md5.min.js -rl --include="*.html" /usr/local/share/janus/demos/` RUN sed -i s@'a href="'@'a href="/'@g /usr/local/share/janus/demos/navbar.html RUN sed -i s@'href="/http'@'href="http'@g /usr/local/share/janus/demos/navbar.html RUN sed -i s@meetecho-logo.png@/meetecho-logo.png@g /usr/local/share/janus/demos/navbar.html RUN sed -i s@'href="https://janus.conf.meetecho.com'@'href="'@g /usr/local/share/janus/demos/docs/index.html RUN curl https://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png -o /usr/local/share/janus/demos/forkme_left_darkblue_121621.png RUN sed -i s@https://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png@/forkme_left_darkblue_121621.png@g `grep forkme_left_darkblue_121621.png -rl --include="*.html" /usr/local/share/janus/demos/` RUN sed -i s@:8088/janus@/janus@g `grep :8088/janus -rl --include="*.js" /usr/local/share/janus/demos/` RUN sed -i s@:8089/janus@/janus@g `grep :8089/janus -rl --include="*.js" /usr/local/share/janus/demos/` RUN sed -i s@:7088/admin@/admin@g /usr/local/share/janus/demos/admin.js RUN sed -i s@:7889/admin@/admin@g /usr/local/share/janus/demos/admin.js # COPY conf/*.jcfg /usr/local/etc/janus/ #RUN sed -i s@'https = false'@'https = true'@g /usr/local/etc/janus/janus.transport.http.jcfg RUN sed -i s@'admin_http = false'@'admin_http = true'@g /usr/local/etc/janus/janus.transport.http.jcfg #RUN sed -i s@'admin_https = false'@'admin_https = true'@g /usr/local/etc/janus/janus.transport.http.jcfg #RUN sed -i s@'#cert_pem = "/path/to/cert.pem"'@'cert_pem = "/cert/server.crt"'@g /usr/local/etc/janus/janus.transport.http.jcfg #RUN sed -i s@'#cert_key = "/path/to/key.pem"'@'cert_key = "/cert/server.key"'@g /usr/local/etc/janus/janus.transport.http.jcfg #RUN sed -i s@'wss = false'@'wss = true'@g /usr/local/etc/janus/janus.transport.websockets.jcfg #RUN sed -i s@'admin_ws = false'@'admin_ws = true'@g /usr/local/etc/janus/janus.transport.websockets.jcfg #RUN sed -i s@'admin_wss = false'@'admin_wss = true'@g /usr/local/etc/janus/janus.transport.websockets.jcfg #RUN sed -i s@'#cert_pem = "/path/to/cert.pem"'@'cert_pem = "/cert/server.crt"'@g /usr/local/etc/janus/janus.transport.websockets.jcfg #RUN sed -i s@'#cert_key = "/path/to/key.pem"'@'cert_key = "/cert/server.key"'@g /usr/local/etc/janus/janus.transport.websockets.jcfg RUN mkdir /cert && openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /cert/server.key -out /cert/server.crt -subj "/C=CN/ST=hubei/L=wuhan/O=janus/OU=janus/CN=janus.com" FROM canyan/janus-gateway:master COPY --from=0 /cert /cert COPY --from=0 /usr/local/etc/janus /usr/local/etc/janus COPY --from=0 /usr/local/share/janus/demos /usr/local/share/janus/demos RUN sed -i "s@http://\(deb\|security\).debian.org@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list RUN apt-get update && apt-get install -y nginx COPY nginx.conf /etc/nginx/nginx-janus.conf CMD nginx -c /etc/nginx/nginx-janus.conf && /usr/local/bin/janus -F /usr/local/etc/janus
构建运行
docker rm -f myjanus && docker build -t myjanus . && docker run --rm --name myjanus -d -p 443:443 -p 80:80 myjanus # 将 127.0.0.1 改为自己的宿主机 ip docker exec -it myjanus sed -i s@'#nat_1_1_mapping = "1.2.3.4"'@'nat_1_1_mapping = "127.0.0.1"'@g /usr/local/etc/janus/janus.jcfg && docker restart myjanus
docker-compose.yaml,将其中 127.0.0.1 改为自己的宿主机 ip
version: '3.8' services: janus: image: myjanus container_name: janus ports: - "443:443" restart: always command: - sh - -c - | nginx -c /etc/nginx/nginx-janus.conf & /usr/local/bin/janus -F /usr/local/etc/janus -1 127.0.0.1
若在使用过程中出现下面错误:
ICE failed for component 1 in stream 1, but let's give it some time... (trickle pending, answer received, alert not set)
ICE failed for component 1 in stream 1, but we're still waiting for some info so we don't care... (trickle pending, answer received, alert not set)
在 docker-compose.yaml 中去掉端口映射,添加 network_mode: host,避免 NAT 转换。
或安装 STUN/TURN 服务:https://hub.docker.com/r/coturn/coturn & https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice
docker run --restart=always -d --name coturn --network host coturn/coturn --external-ip='外网ip' --user='username:password' --realm=my.realm.org
最后把 STUN 和 TURN 信息配置到 Janus 中