docker搭建伺服器
① 使用Docker鏡像搭建webrtc AppRTC 測試伺服器
參考這篇消州文章: https://blog.piasy.com/2017/06/17/out-of-the-box-webrtc-dev-env/index.html -> AppRTC-Server 一章
主要說下注意事項:
docker 鏡像pull 下來之後,運行命令如下:
其中態銷 <server public IP> 改為自己服拿閉蔽務器的地址
配置完成之後基本就可以正常運行了,另外要注意的是,docker 埠映射中防火牆有沒有禁用相關的埠,若相關埠沒有開,則手動打開,自行查詢吧。
② linux下docker基礎環境搭建
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 報錯:curl: (6) Could not resolve host: get.docker.com; 未知的錯誤
# 解決:cat /etc/resolv.conf 里加了個 nameserver 8.8.8.8
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
驗證安裝:docker-compose --version
# compose 那個亞馬遜的老是下載不了,可換對應地址:
sudo curl -L https://get.cloud.io/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
查看docker版本: docker --version
啟動docker: systemctl start docker 或者 service docker start
停止docker: systemctl stop docker
查看docker鏡像文件: docker images
查看docker內容器: docker ps -a
修改 /etc/dockers 文件下的配置文件 daemon.json (配置作用參考附錄)
操作完成後需要重啟docker: systemctl restart docker
服務端安裝git:yum install git
拉取一下文件和命令:git clone http://172.16.1.35/demo/demo-dockers.git
查看本地和遠端版本:git branch -a
切換本地分支為dev:git checkout -b dev origin/dev
啟動docker:service docker start
後 執行文件中的shell:./init.sh all (包含:mysql,mongo,redis,solr,activemq,tomcat)
刪除多下載的鏡像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
進入某個容器:docker exec -it [CONTAINER ID] /bin/bash
查看某個容器進程:docker top [NAMES]
查看 demo-dockers 目錄下 java-runtime 文件位置下有對應幾個項目配置文件 application-alpha.yml
修改配置文件後,需要重新啟動對應java項目,執行啟動腳本 ./init-java-runtime.sh + [項目名或者all]
獲取鏡像文件的地址:http://172.18.5.112:5001/repository/demo/ 查找對應需要的鏡像包
更換鏡像文件: vi java-runtime.yml 內,image後的對應項目後跟的包名中
重啟對應項目: ./init-java-runtime.sh [項目名]
查看對應項目啟動log: docker logs -f --tail 500 [生成的容器名稱]
(容器重啟:docker restart [容器id或名稱])
{
"authorization-plugins": [],//訪問授權插件
"data-root": "",//docker數據持久化存儲的根目錄
"dns": [],//DNS伺服器
"dns-opts": [],//DNS配置選項,如埠等
"dns-search": [],//DNS搜索域名
"exec-opts": [],//執行選項
"exec-root": "",//執行狀態的文件的根目錄
"experimental": false,//是否開啟試驗性特性
"storage-driver": "",//存儲驅動器
"storage-opts": [],//存儲選項
"labels": [],//鍵值對式標記docker元數據
"live-restore": true,//dockerd掛掉是否保活容器(避免了docker服務異常而造成容器退出)
"log-driver": "",//容器日誌的驅動器
"log-opts": {},//容器日誌的選項
"mtu": 0,//設置容器網路MTU(最大傳輸單元)
"pidfile": "",//daemon PID文件的位置
"cluster-store": "",//集群存儲系統的URL
"cluster-store-opts": {},//配置集群存儲
"cluster-advertise": "",//對外的地址名稱
"max-concurrent-downloads": 3,//設置每個pull進程的最大並發
"max-concurrent-uploads": 5,//設置每個push進程的最大並發
"default-shm-size": "64M",//設置默認共享內存的大小
"shutdown-timeout": 15,//設置關閉的超時時限(who?)
"debug": true,//開啟調試模式
"hosts": [],//監聽地址(?)
"log-level": "",//日誌級別
"tls": true,//開啟傳輸層安全協議TLS
"tlsverify": true,//開啟輸層安全協議並驗證遠程地址
"tlscacert": "",//CA簽名文件路徑
"tlscert": "",//TLS證書文件路徑
"tlskey": "",//TLS密鑰文件路徑
"swarm-default-advertise-addr": "",//swarm對外地址
"api-cors-header": "",//設置CORS(跨域資源共享-Cross-origin resource sharing)頭
"selinux-enabled": false,//開啟selinux(用戶、進程、應用、文件的強制訪問控制)
"userns-remap": "",//給用戶命名空間設置 用戶/組
"group": "",//docker所在組
"cgroup-parent": "",//設置所有容器的cgroup的父類(?)
"default-ulimits": {},//設置所有容器的ulimit
"init": false,//容器執行初始化,來轉發信號或控制(reap)進程
"init-path": "/usr/libexec/docker-init",//docker-init文件的路徑
"ipv6": false,//開啟IPV6網路
"iptables": false,//開啟防火牆規則
"ip-forward": false,//開啟net.ipv4.ip_forward
"ip-masq": false,//開啟ip掩蔽(IP封包通過路由器或防火牆時重寫源IP地址或目的IP地址的技術)
"userland-proxy": false,//用戶空間代理
"userland-proxy-path": "/usr/libexec/docker-proxy",//用戶空間代理路徑
"ip": "0.0.0.0",//默認IP
"bridge": "",//將容器依附(attach)到橋接網路上的橋標識
"bip": "",//指定橋接ip
"fixed-cidr": "",//(ipv4)子網劃分,即限制ip地址分配范圍,用以控制容器所屬網段實現容器間(同一主機或不同主機間)的網路訪問
"fixed-cidr-v6": "",//(ipv6)子網劃分
"default-gateway": "",//默認網關
"default-gateway-v6": "",//默認ipv6網關
"icc": false,//容器間通信
"raw-logs": false,//原始日誌(無顏色、全時間戳)
"allow-nondistributable-artifacts": [],//不對外分發的產品提交的registry倉庫
"registry-mirrors": [],//registry倉庫鏡像
"seccomp-profile": "",//seccomp配置文件
"insecure-registries": [],//非https的registry地址
"no-new-privileges": false,//禁止新優先順序(??)
"default-runtime": "runc",//OCI聯盟(The Open Container Initiative)默認運行時環境
"oom-score-adjust": -500,//內存溢出被殺死的優先順序(-1000~1000)
"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//對外公布的資源節點
"runtimes": {//運行時
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"–debug"]
}
}
}
服務端安裝git:yum install git
拉取一下文件和命令:git clone http://172.16.1.35/gchat/gaga-dockers.git
指定分支克隆git clone -b dev-1 http://172.16.1.35/gchat/gaga-dockers.git
查看本地和遠端版本:git branch -a
切換本地分支為dev:git checkout -b dev origin/dev
啟動docker:service docker start
後 執行文件中的shell:./init.sh all (順序:mysql,mongo,redis,solr,activemq,tomcat)
刪除多下載的鏡像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
進入某個容器:docker exec -it [CONTAINER ID] /bin/bash
查看某個容器進程:docker top [NAMES]
# 查看是否安裝了tomcat: rpm -qa | grep tomcat
# 查找文件:find / -name tomcat
# 切換Tomcat目錄:cd /usr/local/tomcat/bin
# 關閉Tomcat:./shutdown.sh
# 查看docker中的java版本:docker exec container_name java -version
git拉代碼:git clone [email protected]:gchat/gaga-server.git
查看遠端分支:git branch -r
創建本地dev分支 並切換到dev分支:git checkout -b dev origin/dev
查看本地分支:git branch
切換回眸分支:git checkout master
查看所有JDK在系統中位置:/usr/libexec/java_home -V
參考地址: https://www.runoob.com/docker/docker-command-manual.html
查找docker 安裝包:yum list installed | grep docker
停掉docker:systemctl stop docker
刪除對應文件:yum remove docker.x86_64 docker-client.x86_64 docker-common.x86_64 -y
查看下docker rpm源:rpm -qa | grep docker
刪除對應路徑:rm -rf /var/lib/docker
注釋:
本次也是由於業務需要,需要重新搭建新的測試伺服器,這也是搭建中的一個插曲,後續會使用 Jenkins 進行相關的持續集成,大家一起學習分享!~
③ 在一個區域網中(沒有dhcp服務)用docker搭建一個dhcp伺服器
1、使用的鏡像
sudo docker pull networkboot/dhcpd
2、測試的區域網拓撲結構如下:h為 DHCP伺服器,ovs交換機s1、s2、s3各連著一台等待分配ip地址的主機。
3、h DHCP伺服器通過一對暴露於root namespace 的veth pair相連,具體操作如下
3.1、生成交換機s1、s2、s3
sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3
3.2、創建veth pair 即 v1-v2
sudo ip link add v1 type veth peer name v2
3.3、**up
sudo ip link set dev v1 upsudo ip link set dev v2 up
3.4、給v1配置ip及子網掩碼
sudo ifconfig v1 192.168.1.254 netmask 255.255.255.0
3.5、生成DHCP伺服器,監聽v1 ,掛載本地data文件夾,data裡面中只有dhcpd.conf文件
sudo docker run -it \--rm --net host \--init \--name=dhcpServer1 \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1
dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {option routers 192.168.1.1;option subnet-mask 255.255.255.0;option domain-name "emx.local";option domain-name-servers 8.8.8.8;range 192.168.1.2 192.168.1.100;}
3.5、將v2連接到交換機上
sudo ovs-vsctl add-port s1 v2
3.6、交換機s1、s2、s3彼此相連
sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2
3.7、創建主機h1、h2、h3,並將其連接到交換機上,其中ubunut:5是添加了基本net-tools、isc-dhcp-client,創建的時候記得使用 --cap-add=NET_ADMIN
sudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3
3.8、可以使用floot-light控制交換機s1、s2、s3交換機(選擇)
sudo ovs-vsctl set-controller s1 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s2 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s3 tcp:127.0.0.1:6653
4、使用dhclient eht1 向DHCP伺服器申請
4.1、申請ip之前
4.2、申請ip(伺服器端界面)
4.3申請ip之後,h1(192.168.1.38):
同理,h2(192.168.1.39):
h3(192.168.1.40):
5、測試
5.1、h1 ping h2(192.168.1.39):
5.2、h2 ping h3(192.168.1.40):
6、最後拓撲結構圖,ip分配之後的拓撲結構:DHCP伺服器(192.168.1.6)、h1(192.168.1.38)、h2(192.168.1.39)、h3(192.168.1.40)
7、代碼匯總參考
sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3sudo ip link add v1 type veth peer name v2sudo ip link set dev v1 upsudo ip link set dev v2 upsudo ifconfig v1 192.168.1.6 netmask 255.255.255.0sudo docker run -it \--rm --net host \--init \--name=dhcpServer \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1sudo ovs-vsctl add-port s1 v2sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2sudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3sudo ovs-vsctl set-controller s1 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s2 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s3 tcp:127.0.0.1:6653
④ docker 搭建文件伺服器
version: '3' //docker-compose 版本 3.x
services: //服務的配置信息
FileServer: //自己定義的服務
image: nginx:latest //使用的鏡像名
container_name: 'FileData' // docker容器名
restart: always //重啟策略 always 總是重新啟動
ports: - '8003:8003' //映射埠信息 宿主埠:容器埠
volumes: // 定義了卷信息,提供給 services 中的 具體容器使用
- './nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf' // 用戶自己指定的目錄:映射目錄
- './nginx/log:/var/log/nginx'
- './file:/usr/share/nginx/file'
- './web:/usr/share/nginx/html' //其他html連接目錄
command: /bin/bash -c "nginx -g 'daemon off;'" //覆蓋容器啟動後默認執行的命令
autoindex on; //是否顯示文件目錄 on顯示 off 關閉顯示
autoindex_exact_size on; // 顯示文件確切大小 on 顯示位元組單位 off 顯示出文件的大概大小,單位是KB或者MB或者GB
autoindex_localtime on; //默認為off,顯示的文件時間為GMT時間 ;改為on後,顯示的文件時間為文件的伺服器時間
charset utf-8,gbk; //顯示的字元集
server{ //服務配置
listen 8003; // 監聽埠 ,也可以加上IP地址,如,listen 127.0.0.1:8080;
server_name _; //定義網站域名,可以寫多個,用空格分隔。
//匹配規則,在server{}里可以有很多location配置段
//root/alias 是指定文件路徑的兩種方式 alias 相當於重定向路徑
//使用alias,目錄名後面一定要加「/」
location / { //location 後面跟的搜索路徑
root /usr/share/nginx/file; //指定文件服務地址 這里的目錄是 yml 文件里配置的映射目錄
}
location /web/{
alias /usr/share/nginx/; //多個location 的時候這里只需要指定映射目錄的上級目錄就行了
index index.html index.htm; //配置默認首頁
}
}
⑤ 入門、快速搭建Docker分布式項目環境
1.什麼是Docker
借用下網上傳統虛擬機與Docker的對比圖片。
傳統虛擬化應用程序中,不僅包含應用程序和必要的二進制文件庫,還包含一個完整的操作系統。
而Docker容器僅包含應用程序和相關依賴項,在主機的操作系統用戶空間中作為一個獨立進程運行,與其他容器共享內核,從而實現了虛擬機的資源隔離和分配,具有更高的可移植性和效率提高。
2.為什麼使用Docker
1.更快速的交付和部署
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接 使用這個容器來部署代碼。
2.高效部署和擴容
Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。
3.更高的資源利用率
Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。
4.更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
3.Docker的工作原理和概念
自己製作鏡像然後上傳倉庫或使用倉庫已有的鏡像文件拉取到容器中部署。
為了方便Docker的說明,本次例子使用虛擬機安裝CentOS 7來演示。CentOS 7的安裝請等查看下篇文章或自行網路。
1.安裝之前的准備工作
按照順序,執行如下操作
1、安裝必要的一些系統工具
2、添加軟體源信息
3、更新並安裝Docker-CE
安裝准備工作
2.開啟Docker服務
運行docker version 如果出現以下情況,說明當前用戶沒有 root相關操作許可權
無root許可權
解決思路
先查看有多少鏡像
運行docker run hello-world 測試命令,如果出現下方紅框內消息,證明安裝成功
3.查看docker基本信息和版本
1.構建Nginx基礎鏡像
查詢nginx鏡像
鏡像拉取
查看對外的訪問路徑
怎麼才能訪問剛才啟用的nginx
nginx頁面內容
我們可以進入容器,看下這個容器是什麼樣子
查看nginx在哪個位置
我們發現盡管啟動了nginx,但是在外部還是不能訪問,這是因為docker具有隔離機制,要不然怎麼叫做容器化部署呢
Docker內nginx埠
對Nginx進行外網埠映射;
2.構建Tomcat基礎鏡像
打開容器後,默認安裝目錄在 /usr/local/
3.創建自己的專屬鏡像
用Dockerfile來製作鏡像
創建一個新的鏡像,並起名字為nywlw
查看新的鏡像
運行自己創建的容器
4.刪除容器實例
5.刪除鏡像
每天發布更多新鮮有含量的技術文章、總有一款適合你。
⑥ 使用docker搭建STUN/TURN伺服器
前言 STUN,首先在RFC3489中定義,作為一個完整的NAT穿透解決方案,英文全稱是Simple Traversal of UDP Through NATs,即簡單的用UDP穿透NAT。 TURN,首先在RFC5766中定義,英文全稱是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中繼穿透NAT:STUN的擴展 簡單的說,TURN與STURN的共同點都是通過修改應用層中的私網地址達到NAT穿透的效果,異同點是TURN是通過兩方通訊的「中間人」方式實現穿透。 ICE的全稱Interactive Connectivity Establ.shment(互動式連接建立),由IETF的MMUSIC工作組開發出來的,它所提供的是一種框架,使各種NAT穿透技術可以實現統一。 STUN和TURN伺服器和ICE可以參考閱讀: P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解 本文介紹如何通過DOCKER搭建STUN和TURN伺服器,步驟如下 1:創建Dockerfile,內容如下: FROM ubuntu:14.04 MAINTAINER Patxi Gortázar <[email protected]> RUN apt-get update && apt-get install -y \ curl \ libevent-core-2.0-5 \ libevent-extra-2.0-5 \ libevent-openssl-2.0-5 \ libevent-pthreads-2.0-5 \ libhiredis0.10 \ libmysqlclient18 \ libpq5 \ telnet \ wget RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz \ && tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz \ && dpkg -i coturn_4.4.2.2-1_amd64.deb COPY ./turnserver.sh /turnserver.sh ENV TURN_USERNAME test ENV TURN_PASSWORD test ENV REALM kurento.org ENV NAT true EXPOSE 3478 3478/udp ENTRYPOINT ["/turnserver.sh"] 2:創建turnserver.sh,內容如下 #!/bin/bash set-e if[$NAT="true"-a-z"$EXTERNAL_IP"];then #Try to get public IP PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)||echo"No public ip found on http://169.254.169.254/latest/meta-data/public-ipv4" if[-z"$PUBLIC_IP"];then PUBLIC_IP=$(curl http://icanhazip.com)||exit1 fi #Try to get private IP PRIVATE_IP=$(ifconfig|awk'/inet addr/{print substr($2,6)}'|grep -v 127.0.0.1)||exit1 exportEXTERNAL_IP="$PUBLIC_IP/$PRIVATE_IP" echo"Starting turn server with external IP:$EXTERNAL_IP" fi echo'min-port=49152'>/etc/turnserver.conf echo'max-port=65535'>>/etc/turnserver.conf echo'fingerprint'>>/etc/turnserver.conf echo'lt-cred-mech'>>/etc/turnserver.conf echo"realm=$REALM">>/etc/turnserver.conf echo'log-file stdout'>>/etc/turnserver.conf echo"user=$TURN_USERNAME:$TURN_PASSWORD">>/etc/turnserver.conf [$NAT="true"]&&echo"external-ip=$EXTERNAL_IP">>/etc/turnserver.conf exec/usr/bin/turnserver"$@" 3:使用docker build 創建鏡像,執行結果如下 [root@www]# docker build -t teststurn_1 . Sending build context to Docker daemon 4.096kB Step 1/11 : FROM ubuntu:14.04 ---> 6e4f1fe62ff1 Step 2/11 : MAINTAINER Patxi Gortázar <[email protected]> ---> Using cache ---> 4460f9f84053 Step 3/11 : RUN apt-get update && apt-get install -y curl libevent-core-2.0-5 libevent-extra-2.0-5 libevent-openssl-2.0-5 libevent-pthreads-2.0-5 libhiredis0.10 libmysqlclient18 libpq5 telnet wget ---> Using cache ---> 05ed9ced48a5 Step 4/11 : RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && dpkg -i coturn_4.4.2.2-1_amd64.deb ---> Using cache ---> d82ed28fdac9 Step 5/11 : COPY ./turnserver.sh /turnserver.sh ---> Using cache ---> 1d37a488282c Step 6/11 : ENV TURN_USERNAME test ---> Running in bfd88f08db42 Removing intermediate container bfd88f08db42 ---> cf8af0504b95 Step 7/11 : ENV TURN_PASSWORD test ---> Running in b8ef33b7c213 Removing intermediate container b8ef33b7c213 ---> 32a832f23169 Step 8/11 : ENV REALM kurento.org ---> Running in bbe129edf5b3 Removing intermediate container bbe129edf5b3 ---> 21fdfe34689b Step 9/11 : ENV NAT true ---> Running in 5bdfe8555d5e Removing intermediate container 5bdfe8555d5e ---> dc7fc896841c Step 10/11 : EXPOSE 3478 3478/udp ---> Running in 67aaa1966f68 Removing intermediate container 67aaa1966f68 ---> a12646ed45ff Step 11/11 : ENTRYPOINT ["/turnserver.sh"] ---> Running in b8fc2ff09265 Removing intermediate container b8fc2ff09265 ---> f5e5acad0f81 Successfully built f5e5acad0f81 Successfully tagged teststurn_1:latest 執行完後可以看到自己創建的鏡像名稱為teststurn_1 4:啟動docker的鏡像,並開啟埠3478 docker run -d -p 3478:3478 -p 3478:3478/udp teststurn_1 啟動後需要等待一兩分鍾才能測試順暢 5:測試伺服器效果 打開 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 並輸入自己的本機IP和埠,分別測試兩種協議服務是否生效