docker搭建http代理伺服器
『壹』 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 進行相關的持續集成,大家一起學習分享!~
『貳』 Docker安裝frp實現遠程桌面連接
[TOC]
由於沒有公網IP,無法遠程連接家裡的電腦,搜到了 frp 這個項目,嘗試使用後發現效果不錯,所以寫出安裝過程分享。
frp是一個反向代理工具,可以將流量轉發到目標主機,包括TCP,UDP,HTTP,HTTPS。其基本原理是目標主機安裝客戶端連接到代理伺服器建立固定連接,客戶主機通過代理伺服器連接到目標主機進行訪問。
市面上有向日葵,TeamViewer也是類似原理,只不過這里變成代理伺服器需要我們自己提供,比如從騰訊雲或者阿里雲購買一台輕量伺服器作為代理伺服器,有固定的公網IP可以訪問。自建伺服器的好處是帶寬獨享,可以有更穩定的連接效果。
而製作鏡像是希望能夠方便多次部署。
SELinux是關閉狀態,不需要處理
防火牆是關閉狀態,把防火牆開啟
提前開放一段埠范圍,用於frp流量轉發。
查看docker
docker還沒安裝,需要自己安裝。
添加docker的安裝源。
查看docker-ce版本
這里看到提示 versionlock ,由於只是安裝frp,所以先把鎖刪掉。
Docker可以默認安裝最新版本,或者指定版本安裝,分別指令如下。
這里直接安裝最新版本,等待安裝完成
安裝完後確認docker版本,並啟動docker服務
登錄代理伺服器,創建目錄並將frp復制到目錄下
將frps.ini備份並編輯frps.ini。
編輯Dockerfile
配置完畢,可以開始構建鏡像
構建需要拉取CentOS,根據網速可能需要等待一會兒
查看鏡像,可以看到鏡像已經製作完成,TAG是v1
基於鏡像開啟容器
查看監聽埠是否開啟
查看容器日誌
目前看來一切正常。嘗試訪問監控面板。
之前配置埠 dashboard_port = 20001,假設代理伺服器IP是106.13.127.200,那麼通過 http://106.13.127.200:20001 訪問監控面板
正常情況下,會提示輸入之前配置的用戶和密碼,並看到如下頁面
代理伺服器配置好後,配置目標主機,
關於遠程連接的配置這里不做說明,默認已配置好遠程連接的參數,只是需要代理伺服器中轉。
frpc和frps配置類似,編輯frpc.ini
具體配置
運行frpc
查看frpc的日誌frpc.log
查看frps的日誌
目標主機與代理伺服器成功建立TCP和UDP連接
客戶主機打開遠程桌面連接,輸入IP和埠進行連接106.13.127.200:20010
可以看到成功連接,並且已啟用UDP
frp也支持P2P模式,即客戶主機和目標主機直接建立連接,理論上會有更好的連接效果。但是由於現實中的網路環境,這種模式可能失敗。本人嘗試過有失敗情況,也有成功情況。可以參考frp文檔自行嘗試。
Windows遠程桌面會嘗試使用UDP提供更好的效果,所以這里同時配置了TCP和UDP代理。如果希望有更好的效果,可以考慮配置GPU渲染。關於遠程桌面的流量和GPU有機會其他文章說明。
『叄』 如何給docker設置http代理
1、添加以下內容到/etc/sysconfig/docker文件
HTTP_PROXY=192.168.20.176:1080
https_proxy=192.168.20.176:1080
http_proxy=192.168.20.176:1080
HTTPS_PROXY=192.168.20.176:1080
export https_proxy http_proxy HTTPS_PROXY HTTP_PROXY
把192.168.20.176替換為你的代理IP
2、重啟docker服務
『肆』 linux怎麼安裝docker
1 在 CentOS 6.4 上安裝 docker
docker當前官方只支持Ubuntu,所以在 CentOS 安裝Docker比較麻煩(Issue #172)。
docker官方文檔說要求Linux kernel至少3.8以上,CentOS 6.4是2.6的內核,於是我哼哧哼哧的編譯安裝了最新的kernel 3.11.6,重啟後運行docker還是失敗,最後找到原因,是因為編譯時忘記集成aufs模塊了。aufs 需要和 kernel 一起編譯,很麻煩。
不過不需要這么麻煩,有強人已經編譯好了帶aufs模塊的內核,見這里Installing docker.io on centos 6.4 (64-bit)
1.1 取消selinux,因為它會干擾lxc的正常功能
sudo vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
1.2 安裝 Fedora EPEL
sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
1.3 添加 hop5 repo地址
cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo
1.4 安裝 docker-io
sudo yum install docker-io
會自動安裝帶aufs模塊的3.10內核,以及docker-io包。
1.5 將 cgroup 文件系統添加到 /etc/fstab , 只有這樣docker才能正常工作
sudo echo "none /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
1.6 修改grub引導順序
sudo vim /etc/grub.conf
default=0
設置default為新安裝的內核的位置,一般是0
1.7 重啟
sudo reboot
1.8 檢查新內核是否引導成功
重啟後,檢查一下新內核是否引導起來了
uname -r
3.10.5-3.el6.x86_64
說明成功了
看一下 aufs是否存在
grep aufs /proc/filesystems
nodev aufs
說明存在
1.9 啟動 docker daemon 進程
sudo docker -d &
如果你在公司,且公司內部都是通過代理上網,則可以把代理伺服器告訴docker,用如下命令(參考這里):
sudo HTTP_PROXY=http://xxx:port docker -d &
1.10 下載 ubuntu 鏡像
sudo docker pull ubuntu
1.11 運行 hello world
sudo docker run ubuntu /bin/echo hello world
hello world
安裝成功了!!
『伍』 使用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和埠,分別測試兩種協議服務是否生效『陸』 如何給docker設置http代理
解決方案一:
停止docker服務,手動以使用2375埠監聽所有網路介面的方式啟動docker daemon。
$ systemctl stop docker.service
$ nohup docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &
解決方案二:
編輯配置文件,Ubuntu下是/etc/default/docker,CentOS下是/etc/sysconfig/docker。不過通過修改這兩個文件來配置daemon已經是discouraged的了。不鼓勵使用這種方法。HTTP_PROXY="http://[proxy-addr]:[proxy-port]/"
HTTPS_PROXY="https://[proxy-addr]:[proxy-port]/"
export HTTP_PROXY HTTPS_PROXY
解決方案三:
該方法是持久化的,修改後會一直生效。該方法覆蓋了默認的docker.service文件。
1. 為docker服務創建一個內嵌的systemd目錄
$ mkdir -p /etc/systemd/system/docker.service.d
2. 創建/etc/systemd/system/docker.service.d/http-proxy.conf文件,並添加HTTP_PROXY環境變數。其中[proxy-addr]和[proxy-port]分別改成實際情況的代理地址和埠:
[Service]
Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
3. 如果還有內部的不需要使用代理來訪問的Docker registries,那麼嗨需要制定NO_PROXY環境變數:
[Service]
Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
4. 更新配置:
$ systemctl daemon-reload
5. 重啟Docker服務:
$ systemctl restart docker
『柒』 使用 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 查看。
(完)
『捌』 如何搭建及使用docker registry
registry是什麼?
registry是Docker的鏡像存儲服務,docker hub上的registry鏡像見Registry官方鏡像,更多詳細信息請參見源碼。
搭建registry
在伺服器上執行如下命令安裝docker,這里選擇騰訊雲(Ubuntu Server 14.04.1 LTS 64位)鏡像來創建伺服器
curl -fsSL https://get.docker.com/ | sh
安裝docker-compose Docker Compose是一個定義及運行多個Docker容器的工具。使用Docker Compose只需要在一個配置文件中定義多個Docker容器,然後使用一條命令將多個容器啟動,Docker Compose會通過解析容器間的依賴關系,按先後順序啟動所定義的容器。詳見Docker Compose
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
啟動registry服務,此例中包含nginx和registry兩個容器,涉及的包及配置文件請參見附件,解壓後,直接執行如下命令即可創建服務。
docker-compose up -d
停止服務
docker-compose stop
重啟服務
docker-compose restart
下線服務
docker-compose down
上傳鏡像
因為上面搭建的registry服務是http的,所以docker啟動參數需要配置--insecure-registry localhost選項,修改/etc/default/docker文件
DOCKER_OPTS="--insecure-registry localhost"
重啟docker
service docker restart
拉取上傳鏡像 docker pull;docker tag;docker push(tag默認為latest)
docker pull hello-world
docker tag hello-world localhost/library/hello-world
docker push localhost/library/hello-world
下載鏡像
docker pull localhost/library/hello-world
刪除鏡像
docker rmi localhost/library/hello-world
獲取鏡像倉庫列表
# curl http://localhost/v2/_catalog
{"repositories":["library/hello-world"]}
未上傳鏡像前的輸出如下:
# curl http://localhost/v2/_catalog
{"repositories":[]}
獲取鏡像tag列表
# curl -X GET http://localhost/v2/library/hello-world/tags/list
{"name":"library/hello-world","tags":["latest"]}
獲取鏡像manifests信息
# curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost/v2/library/hello-world/manifests/latest
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1473,
"digest": "sha256:"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 974,
"digest": "sha256:"
}
]
}
其中即為執行docker images時看到的IMAGE ID。 layers表示了鏡像的層次關系,可以通過layers中的digest來拉取blob,見下面獲取鏡像blob
獲取鏡像blob
在上面獲取hello-world:latest鏡像的manifests信息中可以看到其只有一個layer,以此為例來看如何獲取鏡像blob。從拉取的結果可以看到獲取的blob與文件sha256是一致的。執行docker pull實際上就是首先獲取到鏡像的manifests信息後,再拉取blob的。
# curl -s -X GET http://localhost/v2/library/hello-world/blobs/sha256: -o hello-world.blob
# ls -l hello-world.blob
-rw-r--r-- 1 root root 974 Nov 23 09:56 hello-world.blob
# sha256sum hello-world.blob
hello-world.blob
##刪除鏡像(soft delete)
首先通過curl -i 參數獲取到鏡像的Docker-Content-Digest,registry 2.3及以後的版本必須在header中指定Accept: application/vnd.docker.distribution.manifest.v2+json,否則默認返回的是schema1的digest,其與schema2的digest不同,使用不指定上述頭信息返回的digest刪除時會返回404。
# curl -i -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost/v2/library/hello-world/manifests/latest
HTTP/1.1 200 OK
Server: nginx/1.11.5
Date: Wed, 23 Nov 2016 02:17:51 GMT
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Content-Length: 524
Connection: keep-alive
Docker-Content-Digest: sha256:
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:"
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1473,
"digest": "sha256:"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 974,
"digest": "sha256:"
}
]
}
根據上一步返回的Docker-Content-Digest刪除,返回202表示刪除成功
# curl -k -v -s -X DELETE http://localhost/v2/library/hello-world/manifests/sha256:
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> DELETE /v2/library/hello-world/manifests/sha256: HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost
> Accept: */*
>
< **HTTP/1.1 202 Accepted**
* Server nginx/1.11.5 is not blacklisted
< Server: nginx/1.11.5
< Date: Wed, 23 Nov 2016 02:29:59 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Docker-Distribution-Api-Version: registry/2.0
<
* Connection #0 to host localhost left intact
確認結果
# curl -X GET http://localhost/v2/library/hello-world/tags/list
{"name":"library/hello-world","tags":null}
刪除鏡像(hard delete)
在上一步中,只是刪除了鏡像的manifests信息,解引用的blob還在佔用磁碟空間,執行如下命令可以查看可以刪除的blob
docker exec -it myregistry_registry_1 /bin/registry garbage-collect --dry-run /etc/registry/config.yml
要刪除blob,釋放磁碟空間,需要執行下面的命令。需要特別注意的是在執行下面的命令時registry必須是只讀模式(只讀模式可在registry配置文件中設置),否則可能會導致數據不一致。
docker exec -it myregistry_registry_1 /bin/registry garbage-collect /etc/registry/
『玖』 如何給docker設置http代理
式鏡像打標簽:使用docker tag命令或者執行docker build候用-t傳遞參數兩種情況參數形式通repository_name:tag_name例:docker tag myrepo:mytag資源庫傳Docker Hub資源庫名字加由Docker Hub用戶名斜線組前綴例:amouat/myrepo:mytag沒添加tag部參數例:docker tag myrepo:1.0 myrepoDocker自給latest標簽前面些內容或許已經熟知其實點內容並沒神奇
能鏡像標簽latest認資源庫新鏡像資源庫擁者約定擁latest標簽鏡像才定新鏡像例我輕易鏡像變帶latest標簽鏡像例:
$ docker images myrepo
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE