docker搭建伺服器業務
A. Docker從零搭建分布式伺服器群
1、有2台伺服器A和B,系統為centos7
2、有一個分布式的服務端需要部署在A和B上,其中A為主服務,B負責子服務
3、A和B需要在一個網路環境下能互相連接通信
4、A需要暴露2001和4001埠給外網客戶端進行連接
5、2台機器都提供一個賬戶名為"my"的賬號用顫山於給對方ssh登錄用
參考 https://www.runoob.com/docker/docker-tutorial.html
我們使用 docker run 來創建容器並運行,此時容器在後台運行
我們使用 docker exec 來進入容器內的伺服器
此時我們的已經登錄進了A伺服器,接下來在A伺服器上我們進行服務安裝通用的基礎配置,目的是以後將A伺服器作為鏡像快速搭建B\C\D\E伺服器
查看 cd /etc/ssh 目錄如果沒有則需要執行下面安裝:
配置 vi /etc/ssh/sshd_config ,將以下幾項打開
配置完畢後我們啟動sshd服務
然後檢查sshd啟動情況
A伺服器的配置基本完成了,現在我們退出A伺服器
在我們主機上進行下指租面的操作
由於我們接下來需要將A、B伺服器放在一個網路環境下,這里我們先創建一個網路,命名為myNet
用我們製作的鏡像重新創建一次伺服器A和B,並且讓他們加入我們之前創建的網路myNet內,並實現A服唯洞兆務器暴露2001和4001埠給外網也就是docker外的機器訪問
現在我們已經創建好了A和B伺服器,由於他們在myNet網路下,互相可以通過容器名來訪問,不需要通過IP了,我們嘗試從B伺服器去ssh A伺服器並且用my賬號
現在我們A和B伺服器就像在區域網一樣,不用關心對方IP使用別名即可連接了,並且A對外暴露了埠2001和4001供外部連接
B. 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 進行相關的持續集成,大家一起學習分享!~
C. 使用 OpenResty Docker 鏡像快速搭建 Web 伺服器
在日常工作中經常需要搭建 Web 伺服器和反向代理伺服器,用於測試和生產的情況都有。雖然用於測試的場景有很多便捷的方法,但是在向生產環境遷移時會導致有些工作不能復用。綜合看起來,還是用 Nginx 最為方便。本文嘗試提供一些配置模板。
需要提前了解的內容:
選擇 OpenResty 的原因:
OpenResty 默認安裝位置:
安裝目錄中 Nginx 相關文件:
默認服務指向 Web 文件夾 :
映射關系:
默認 配置文件 位置(後續的配置會覆蓋這里的內容):
在絕大多數情況,覆蓋上面的配置文件就可以了。
但是,這些配置文件的內容,只能是包含在 http 段內的配置,並不能作為完整的配置文件使用。
比如:
可以包含: upstream 、 server
不能包含: tcp
完整配置文件位置:
配置文件相關信息:
https://github.com/openresty/docker-openresty/blob/master/README.md#nginx-config-files
鏡像默認配置為到 /etc/nginx/conf.d/ 讀取配置,所以要把配置文件放到這里。其餘的掛載或埠映射根據需要進行。
假設需要建立如下服務:
(1)通過 http://localhost:20000/shared1/ 訪問 /tmp/webroot/shared1
(2)通過 http://localhost:20000/shared2/ 訪問 /tmp/webroot/myshare
(3)通過 http://localhost:20000// 訪問 http://www..com
配置文件:
啟動命令行:
詳情參考: docker-openresty - Docker tooling for OpenResty - Nginx Config Files
模擬為應用提供多級反向代理,查看訪問鏈路。簡單分為三部分:
使用 Docker Compose 來配置並串聯各容器,文件較多,訪問 GitHub 查看。
(完)
D. 如何創建一個docker service 服務
1. 運行一個Docker實例
Docker首先會嘗試從本地取得並運行所需的鏡像,如果在本地主機上沒有發現,它就會從Docker公共注冊中心拉取。這里,我們將會拉取鏡像並在 Docker 容器中創建一個Fedora實例,並連接到它的 tty 上的bash shell。
# docker run -i -t fedora bash
2.安裝Apache網路伺服器
現在,在我們的Fedora基本鏡像實例准備好後,我們將會開始互動式地安裝Apache網路伺服器,而不是為它創建Dockerfile。為了做到這點,我們需要在終端或者shell運行以下命令。
# yum update
# yum install httpd
退出容器的 tty。
# exit
3.保存鏡像
現在,我們要去保存在Fedora實例里做的修改。要做到這個,我們首先需要知道實例的容器ID。而為了得到ID,我們又需要運行以下命令(LCTT 譯註:在容器外執行該命令)。
# docker ps -a
然後,我們會保存這些改變為一個新的鏡像,請運行以下命令。
# docker commit c16378f943fe fedora-httpd
這里,修改已經通過使用容器ID保存起來了,鏡像名字叫fedora-httpd。為了確認新的鏡像是否在運行,我們將運行以下命令。
# docker images
4. 添加內容到新的鏡像
我們自己新的Fedora Apache鏡像正成功的運行,現在我們想添加一些我們網站的網頁內容到Apache網路伺服器,使得網站能夠開箱即用。為做到這點,我們需要創建一個新的Dockerfile,它會處理從復制網頁內容到啟用80埠的所有操作。要達到這樣的目的,我們需要使用我們最喜歡的文本編輯器創建Dockerfile文件,像下面演示的一樣。
# nano Dockerfile
現在,我們需要添加以下的命令行到文件中。
FROM fedora-httpd
ADD mysite.tar /tmp/
RUN mv /tmp/mysite/* /var/www/html
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]
這里,上述的Dockerfile中,放在mysite.tar里的網頁內容會自動解壓到/tmp/文件夾里。然後,整個站點會被移動到Apache的網頁根目錄/var/www/html/,命令expose 80會打開80埠,這樣網站就能正常訪問了。其次,入口點放在了/usr/sbin/https裡面,保證Apache伺服器能夠執行。
5. 構建並運行一個容器
現在,我們要用剛剛創建的Dockerfile創建我們的容器,以便將我們的網站添加到上面。為做到這,我們需要運行以下命令。
# docker build -rm -t mysite .
建立好我們的新容器後,我們需要要用下面的命令來運行容器。
# docker run -d -P mysite
E. 在一個區域網中(沒有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
F. 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; //配置默認首頁
}
}
G. 使用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和埠,分別測試兩種協議服務是否生效H. 使用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 埠映射中防火牆有沒有禁用相關的埠,若相關埠沒有開,則手動打開,自行查詢吧。
I. 三步搭建私有Docker Registry(V2)伺服器
網上方法千奇百怪,長篇大論看得心累,所以我希望三步之內解決這件事,那麼開始吧。
你需要安裝1.6.0以上的版本的 Docker 。
如果要使用域名綁定私有倉庫,必須開啟SSL。
生成下面文字即為成功:
克隆倉庫。
編輯配置。
模板如下:
移動你的證書到 cert/ 目錄。
備份一下原文件,使用https配置。
然後 vim nginx.conf ,要改的地方很少,如下:
沒有問題的話已經運行起來了~~
現在你可以通過域名pull鏡像了:
新建一個文件夾以便管理。
填寫下面的內容到docker-compose.yml:
移動證書到自定義目錄:
然後配置Nginx文件即可:
域名修改一下,復制粘貼即可。
現在你可以通過域名pull鏡像了:
官方文檔: Deploying a registry server