docker 集羣 Docker 容器 移除全部的容器和鏡像(大掃除) 用一行命令大掃除: docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a) 注:shell 中的 $() 和 `` 相似,會先執行這裏面的內容,上面的腳本會出現以下 docker kill "pids" ; docker kill 在 docker 中用於中止容器,docker rm 刪除容器, docker rmi 刪除鏡像 當沒有運行的容器或者是根本沒有容器的時候,這隻會提示一個警告信息。當你想嘗試的時候,這就是個很是好的單行命令。若是你僅僅想刪除全部的容器,你能夠運行以下命令: docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) 退出時刪除容器 若是你僅僅想在一個容器中快速的運行一個命令,而後退出,而且不用擔憂容器狀態,把 --rm 參數加入 run 命令後面,這將結束不少你保存了的容器,而且清理它們。 示例:docker run --rm -i -t busybox /bin/bash Docker Machine 統一 docker 虛擬機 環境 按照工具 在 docker1.12 後 按照docker 自帶 建立一個machine docker-machine create --driver virtualbox worker (virtualbox) docker-machine create --driver hyperv manager (hyperv)
注意:
docker machine 使用的系統是 Tiny Core Linux
該系統號稱世界最小的 LINUX 系統。而且該系統運行在內存中。 docker 對其鏡像了拓展 預裝了docker 環境。 查看machine列表 docker-machine ls 查看 machine 的環境變量的配置信息 docker-machine env my-machine 鏈接到machine的shell eval "$(docker-machine env my-machine)" shh 連接 docker-machine ssh my-machine 關於 env 連接問題 在win10 中 docker-machine env my-machine | Invoke-Expression 查看docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS my-machine * virtualbox Running tcp://192.168.99.100:2376 v1.12.3 my-machine - virtualbox Running tcp://192.168.99.100:2376 v1.12.3 ACTIVE = * 顯示當前連接的 是 my-machine 的 docker 後續 能夠直接如本地docker 環境同樣使用 docker images 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 +x /usr/local/bin/docker-compose # docker-compose -v # cat docker-compose.yml version: "2" services: rng: build: rng ports: - "8001:80" hasher: build: hasher ports: - "8002:80" webui: build: webui ports: - "8000:80" volumes: - "./webui/files/:/files/" redis: image: redis worker: build: worker docker幣應用一共有4個服務. 分別對應4個目錄rng, hasher, webui, worker: 詳情可進入對應目錄查看Dockerfile. rng是一個web service 生成隨機的bytes數據. hasher是一個計算POST 數據hash值的web service. worker做爲工做節點 後臺調用rng 生成隨機bytes數據, 而後將數據post到hasher服務計算hash值, 若是hashe值開頭爲0.則產生一個docker幣.並將docker幣保存到redis數據庫中. webui一個web接口來監控整個系統.讀取redis數據庫中的docker幣數量 運行docker應用 docker-compose up // 在docker-compose.yml 文件夾中 應用運行狀況 docker-compose ps 增長節點 docker-compose scale worker=10 docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------- dockercoins_hasher_1 ruby hasher.rb Up 0.0.0.0:8002->80/tcp dockercoins_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp dockercoins_rng_1 python rng.py Up 0.0.0.0:8001->80/tcp dockercoins_webui_1 node webui.js Up 0.0.0.0:8000->80/tcp dockercoins_worker_1 python worker.py Up dockercoins_worker_10 python worker.py Up dockercoins_worker_2 python worker.py Up dockercoins_worker_3 python worker.py Up dockercoins_worker_4 python worker.py Up dockercoins_worker_5 python worker.py Up dockercoins_worker_6 python worker.py Up dockercoins_worker_7 python worker.py Up dockercoins_worker_8 python worker.py Up dockercoins_worker_9 python worker.py Up ps: docker-compose 並未詳細學習 } Docker Swarm 集羣管理工具 Docker 1.12 集成了Swarm集羣工具 docker swarm 開啓swarm模式; 加入Swarm集羣; 配置集羣參數 docker node 查詢集羣節點信息; 提高/移除一個管理節點; 管理swarm節點主機 docker service 建立管理 service 初始化swram集羣 docker swarm init --advertise-addr 192.168.99.101 --advertise-addr參數, 後面跟你swarm集羣的通信地址 docker swarm mode信息: 在swram docker環境中 docker info Swarm: active 加入swarm集羣的命令和密鑰 docker swarm join-token worker (工人) docker swarm join-token manager (管理員) 加入swarm集羣 在須要加入集羣的docker環境中 運行 docker swarm join-token worker (工人) 顯示的語句 運行 docker swarm join-token manager (管理員)顯示的語句 查集羣節點列表 docker node ls Swarm集羣上運行service 原來使用docker run的命令, 把前面替換成docker service create docker service create --name ping-google alpine ping 8.8.8.8 查詢 swarm service列表 docker service ls ID NAME REPLICAS IMAGE COMMAND 9cyy6xrk2n0w ping-google 1/1 alpine ping 8.8.8.8 ps : 注意 REPLICAS 1/1 前面的1 是已經啓動的 容器 後面的1 是總共須要幾個容器 查看服務到底跑在哪一個節點服務器上: docker service ps <serviceID> docker service ps ping-google ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR alxkyacovh4ltiklpccjhf2u5 ping-google.1 alpine node03 Running Running 5 minutes ago 15e8v9q83wu3skrz63ieacbkr \_ ping-google.1 alpine node01 Shutdown Rejected 5 minutes ago "No such image: alpine:latest" Scale擴展服務 Scale服務到10個副本容器 docker service scale <serivce ID>=<replicas No> ps :docker service scale ping-google=10 ID NAME REPLICAS IMAGE COMMAND 9cyy6xrk2n0w ping-google 1/10 alpine ping 8.8.8.8 注意REPLICAS如今顯示1/10表示這個service一共有10個副本,如今成功運行了1個. 集羣正在啓動其餘的副本. 修改服務的屬性 擴展服務 查看服務屬性 docker service inspect 服務名稱 "Mode": { "Replicated": { "Replicas": 1 } }, 更新服務屬性 docker service update rng --replicas 5 global模式 global模式的service, 就是在swarm集羣的每一個節點建立一個容器副本 讓一個service分佈在集羣的每一個節點上 // 指定網絡 而且 使用 global模式 docker service create --network dockercoins --name debug --mode global 服務名稱 暴露一個服務端口 swarm集羣的service端口暴露還有以下特性: 公共的端口會暴露在每個swarm集羣中的節點服務器上. 請求進如公共端口後會負載均衡到全部的sevice實例上. 發佈端口的參數跟單機環境同樣是-p, 就是把docker run -p替換成docker service create -p. docker service create --name search --publish 9200:9200 --replicas 7 elasticsearch replicas 是設置建立 7個 容器 swarm集羣負載均衡service有兩種方式VIP和DNSRR: VIP模式每一個service會獲得一個 virtual IP地址做爲服務請求的入口. 基於virtual IP進行負載均衡. DNSRR模式service利用DNS解析來進行負載均衡, 這種模式在舊的Docker Engine下, 常常行爲詭異…因此不推薦. 查看service的負載均衡模式 docker service inspect rng "EndpointSpec": { "Mode": "vip" } }, "Endpoint": { "Spec": { "Mode": "vip" }, "VirtualIPs": [ { "NetworkID": "396fwpd5ja6azh93dshalmxro", "Addr": "10.0.0.6/24" } 容器之間是不聯通的 能夠經過 主機IP 還聯通 、 實用自定義網絡 聯通 注意!! 若是是經過 服務名稱訪問 服務名稱不要有 特殊字符 如 @ _ 等 刪除服務 docker service rm <service ID or Name> 容器服務更新 程序代碼進行修改後 構建新版的號的鏡像 上次到 鏡像倉庫 更新服務是同版本好來更新的 docker service update 命令 --update-parallelism指定每次update的容器數量, --update-delay 每次更新以後的等待時間. --image後面跟服務鏡像名稱 // 原先的版本號是 0.1 更新版本 爲 0.01 docker service update 服務名稱 --update-parallelism 2 --update-delay 5s --image localhost:5000/dockercoins_worker:v0.01 以一次更新2個容器副本的 頻率更新到v0.01版本. 容器服務回滾 和 容器服務更新 同樣 只要 指定版本號就能夠了 跨主機問題 通過測試 能夠 阿里雲主機 與本地Docker Machine 建立的虛擬機 互聯!
注意!!
要打開 端口!
Port 7946 TCP/UDP for container network discovery.
Port 4789 UDP for the container ingress network.
關於 獲取請求 ip 地址的問題
在 swarm overlay 模式下 獲取的IP 是服務器IP地址 不是 用戶請求IP 地址。
解決辦法
目前爲止 docker service create --publish mode=host,target=9221,published=9221
制定爲 mode=host 直接將請求到容日 不進行轉發。
聽說 17.07 版本後 會解決。
鏡像倉庫registry 建立registry服務, 發佈5000端口 docker service create --name registry --publish 5000:5000 registry:2 ps: 啓動了一個registry副本容器, 根據docker swarm集羣的端口發佈服務特性 swarm集羣全部節點都會自動發佈本機的5000對應到registry 因此無論你在哪一個節點上執行curl localhost:5000/v2/_catalog 都是能夠訪問到registry服務的.因此你不用關心這個registry跑在那個節點上 推送鏡像 須要先tag這個鏡像的名字成<registry>/<image name>:<tag>: docker tag alpine localhost:5000/test 推送image docker push <image name> overlay網絡 docker 1.12之前, swarm集羣須要一個額外的key-value存儲(consul, etcd etc). 來同步網絡配置 保證全部容器在同一個網段中.在docker 1.12已經內置了這個存儲, 集成了overlay networks的支持 建立一個名爲dockercoins的overlay network docker network create命令 docker network create --driver overlay dockercoins 指定網絡 直接使用--network <network name>參數, 在指定網絡上建立service docker service create --network dockercoins --name redis redis 指定service約束 節點屬性 匹配 示例 node.id 節點 ID node.id == 2ivku8v2gvtg4 node.hostname 節點 hostname node.hostname != node02 node.role 節點 role: manager node.role == manager node.labels 用戶自定義 node labels node.labels.security == high engine.labels Docker Engine labels engine.labels.operatingsystem == ubuntu 14.04 舉例 約束 服務 在固定的 服務器節點 因爲swarm自動調度定義執行在某個節點上的 重啓服務之後 服務可能會被啓動再隨機的節點 docker service create --name registry --publish 5000:5000 \ --constraint 'node.hostname==node01' registry 掛載本地文件夾 docker service create --name registry --publish 5000:5000 \ --mount source=registry-vol,type=volume,target=/var/lib/registry \ -e SEARCH_BACKEND=sqlalchemy \ --constraint 'node.hostname==node01' registry docker service create --mount type=bind,target=/container_data/,source=/host_data/ 例 - 本地目錄: target = 容器裏面的路徑, source = 本地硬盤路徑 docker service create --name nginx --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --replicas 2 --publish 80:80/tcp nginx docker service create --mount type=volume,source=<VOLUME-NAME>,target=<CONTAINER-PATH>,volume-driver=<DRIVER>, 例 - 掛載volume卷: source = volume 名稱 , traget = 容器裏面的路徑 docker service create --name nginx --mount type=volume,source=myvolume,target=/usr/share/nginx/html,volume-driver=local --replicas 2 --publish 80:80/tcp nginx 約束服務在node01 服務器節點 暴露 綁定IP 5000 source=registry-vol 中registry-vol爲卷名字 target 是地址 target = 容器裏面的路徑, source = 本地硬盤路徑 使用docker volume ls命令查看 docker volume ls docker volume inspect registry-vol 能夠看到本機卷掛載到節點的目錄. 爲啓動的服務 掛載本地文件夾 update docker service update registry \ --mount-add type=volume,source=registry-vol,target=/var/lib/registry 關於 cloud 直接使用 服務名稱 指定 cloud 服務名稱 與 docker 服務名稱相同 defaultZone: http://discovery:8761/eureka/ 應爲 經過docker已經自動負載了 本文 不少部分都是 摘自 https://guai.im/ 很詳細的介紹和搭建了 Docker 集羣 感興趣的 能夠看看
重要提示 關於 spring cloud docker 化的問題
因爲容器隔離問題 會出現 spring cloud 服務沒法訪問的問題。
問題緣由
docker 容器中 會有多個網卡 理論上 spring cloud 會獲取 第一個網卡 也就是 在 docker 同一網絡中 能夠訪問通的 IP
可是 不少狀況下 獲取到的缺不是 能夠訪問通的IP
解決方法
spring cloud 設置 網卡過濾
spring:
cloud:
inetutils:
ignoredInterfaces:
- eth1
- eth2
- eth3
- lo
關於網卡名稱到的是什麼 能夠運行
docker service create --network cloud --replicas 1 --name centos registry.cn-hangzhou.aliyuncs.com/atliwen/centos6.8-ssh ifconfightml
查看 日誌 docker service logs centos 看到node
docker 集羣 網絡 是由管理端 服務器 作中轉的 只要能夠訪問到 管理端服務器 就能夠加入該集羣 容器就能夠互通
CentOS 7 修改主機名稱
hostnamectl set-hostname <hostname>
hostnamectl set-hostname <主機名>
CentOS 7 安裝 Docker
Prerequisitespython
Docker CE is supported on CentOS 7.3 64-bit.linux
1. Set up the repositorynginx
Set up the Docker CE repository on CentOS:git
sudo yum install -y yum-utilsgithub
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoweb
sudo yum makecache fastredis
2. Get Docker CEspring
Install the latest version of Docker CE on CentOS:
sudo yum -y install docker-ce
Start Docker:
sudo systemctl start docker
3. Test your Docker CE installation
Test your installation:
sudo docker run hello-world
開機自啓動
sudo chkconfig docker on
開放firewall防火牆端口
firewall-cmd --zone=public --add-port=2377/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/udp --permanent && \
firewall-cmd --zone=public --add-port=4789/tcp --permanent && \
firewall-cmd --zone=public --add-port=4789/udp --permanent && \
firewall-cmd --reload
查看端口開放狀況
firewall-cmd --list-ports
直接關閉防火牆
systemctl stop firewalld.service #中止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
卸載docker
sudo yum -y remove docker*
rm -rf /var/lib/docker
設置靜態IP
BOOTPROTO="static" #dhcp改成static
ONBOOT="yes" #開機啓用本配置
IPADDR=192.168.18.129 #靜態IP
GATEWAY=192.168.18.2 #默認網關
NETMASK=255.255.255.0 #子網掩碼
DNS1=192.168.18.2 #DNS 配置
poweroff 馬上關機
shutdown -h now 馬上關機(root用戶使用)
重啓命令 reboot
shutdown -r now
馬上重啓 shutdown -r 10
systemctl is-enabled iptables.service
systemctl is-enabled servicename.service #查詢服務是否開機啓動
systemctl enable *.service #開機運行服務
systemctl disable *.service #取消開機運行
systemctl start *.service #啓動服務
systemctl stop *.service #中止服務
systemctl restart *.service #重啓服務
systemctl reload *.service #從新加載服務配置文件
systemctl status *.service #查詢服務運行狀態
systemctl --failed #顯示啓動失敗的服務
注:*表明某個服務的名字,如http的服務名爲httpd
構建 DOcker 鏡像
構建鏡像
mvn clean package docker:build
構建鏡像而且推送到鏡像表
mvn clean package docker:build -DpushImage
集羣節點添加標識
docker node update djts-4 --label-add servertype=zuul
集羣節點刪除標識
docker node update djts-4 --label-rm servertype
集羣服務編排 指定節點標籤
--constraint 'node.labels.servertype==zuul'