Docker封裝+Docker映象倉庫搭建+Docker Compose+Docker Swarm
docker的安裝參考部落格:https://blog.csdn.net/Dream_ya/article/details/81122200
百度網盤連結: https://pan.baidu.com/s/1mam5_h2HGpepcWnMZkkcMQ 密碼: jx7d
一、容器封裝
映象也可以自己拉取阿里雲的docker映象!!!
安裝說明:
server1 10.10.10.1(rhel7.3) docker安裝完成
server2 10.10.10.2(rhel6.5)
server3 10.10.10.3(rhel7.3) docker安裝完成
1、匯入映象
[ [email protected] ~]# docker load -i rhel7.tar
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
2、初始映象
(1)加入yum
bash-4.2# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.0 (Maipo) bash-4.2# vi /etc/yum.repos.d/yum.repo ###加入本地yum源 [rhel7.0] name=rhel7.0 baseurl=http://10.10.10.250/rhel7.0 gpgcheck=0 bash-4.2# yum repolist bash-4.2# rpmdb --rebuilddb ###重建資料庫
(2)初始映象提交
[[email protected] ~]# docker commit vm1 rhel7:v1.0 [[email protected] ~]# docker images [[email protected] ~]# docker history rhel7:v1.0 IMAGE CREATED CREATED BY SIZE COMMENT f60e73898051 3 minutes ago bash 45.8MB 0a3eb3fde7fd 4 years ago 140MB Imported from -
3、Dockerfile封裝映象
引數說明:
- FROM : 指定基礎映象
- MAINTAINER 作者資訊
- ENV HOSTNAME 設定環境變數
- EXPOSE 暴露埠
- RUN 映象操作命令
- CMD 映象啟動命令,預設只能啟動一條
- USER 指定容器執行的使用者
- WORKDIR 指定後續命令的執行目錄
- COPY 複製本地資料夾到映象中
- ADD 用於新增本地的tar 壓縮包到容器指定目錄,壓縮包被自動解壓為目錄
- ENTRYPOINT 容器啟動後執行的命令,讓容器執行表現的向一個可執行程式一樣,與CMD的區別是不可以被docker run 覆蓋,會把docker run後面的引數當做傳遞給ENTRYPOINT 指令的引數,dockerfile 中只能制定一個ENTRYPOINT ,如果指定很多,以最後一個為準
- VOLUME 掛載資料卷,將資料儲存到宿主機可以訪問的資料卷中
[[email protected] ~]# mkdir dream
[[email protected] ~]# cd dream/
[[email protected] dream]# vim Dockerfile
FROM rhel7:v1.0
MAINTAINER Dream
ENV HOSTNAME server2
EXPOSE 80
RUN yum install -y httpd && echo "dream" >>/var/www/html/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
[[email protected] dream]# docker build -t rhel7:v2.0 .
[[email protected] dream]# docker images|grep v2.0
rhel7 v2.0 e690bec5401c 41 seconds ago 195MB
[[email protected] dream]# docker run -d --name vm2 rhel7:v2.0 ###後臺執行
4、測試
(1)檢視IP
[[email protected] ~]# docker inspect vm2
(2)檢視結果
[[email protected] ~]# curl 172.17.0.2
dream
5、封裝ssh到映象
(1)dockerfile
[[email protected] ~]# cd dream/
[[email protected] dream]# vim Dockerfile ###這裡密碼設定為1
FROM rhel7:v1.0
MAINTAINER Dream
ENV HOSTNAME server2
EXPOSE 22
RUN rpmdb --rebuilddb && yum install -y openssh-server openssh-clients && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N "" && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N "" && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -q -N "" && echo root:1 |chpasswd
CMD ["/usr/sbin/sshd","-D"]
(2)執行測試
[[email protected] dream]# docker run -d --name vm3 rhel7:v3.0
[[email protected] dream]# ssh [email protected] ###可以進行連線即為成功
二、私有映象倉庫搭建
映象倉庫也可以用harbor進行管理!!!
1、私有倉庫搭建(無認證)
(1)匯入registry
[[email protected] ~]# docker load -i registry-2.3.1.tar
(2)執行並上傳映象
[[email protected] ~]# docker run -d --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 registry:2.3.1
[[email protected] ~]# docker tag rhel7:latest localhost:5000/rhel7
[[email protected] ~]# docker push localhost:5000/rhel7 ###上傳
[[email protected] ~]# ls /opt/registry/
docker
(3)測試
刪除之前映象:
[[email protected] ~]# docker rmi localhost:5000/rhel7:latest
[[email protected] ~]# docker rmi rhel7:latest
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2.3.1 83139345d017 2 years ago 166MB
拉取映象:
[[email protected] ~]# docker pull localhost:5000/rhel7
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2.3.1 83139345d017 2 years ago 166MB
localhost:5000/rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
[[email protected] ~]# docker tag localhost:5000/rhel7 rhel7
[[email protected] ~]# docker rmi localhost:5000/rhel7
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2.3.1 83139345d017 2 years ago 166MB
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
但是你會發現只能在本地拉取,沒有太多的意義,下面介紹遠端拉取映象!!!
遠端拉取:
###配置server1的daemon.json
[[email protected] ~]# vim /etc/docker/daemon.json
{"insecure-registries":["10.10.10.1:5000"]}
###重啟匯入映象
[[email protected] ~]# systemctl restart docker
[[email protected] ~]# docker start registry
[[email protected] ~]# docker load -i ubuntu.tar
[[email protected] ~]# docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 07c86167cdc4 2 years ago 188MB
###打包
[[email protected] ~]# docker tag ubuntu 10.10.10.1:5000/ubuntu
[[email protected] ~]# docker push 10.10.10.1:5000/ubuntu
###在server3中進行測試
[[email protected] ~]# docker pull 10.10.10.1:5000/ubuntu ###報錯
Using default tag: latest
Error response from daemon: Get https://10.10.10.1:5000/v2/: http: server gave HTTP response to HTTPS client
[[email protected] ~]# vim /etc/docker/daemon.json
{"insecure-registries":["10.10.10.1:5000"]}
[[email protected] ~]# systemctl restart docker
[[email protected] ~]# docker pull 10.10.10.1:5000/ubuntu ###發現拉取成功
2、私有映象倉庫(加密)
官網連結:https://docs.docker.com/registry/insecure/#troubleshoot-insecure-registry
(1)生成金鑰
[[email protected] ~]# vim /etc/hosts ###加入host解析
10.10.10.1 server1 dream.org
[[email protected] ~]# cd /etc/docker/
[[email protected] docker]# mkdir certs
[[email protected] docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/dream.org.key -x509 -days 365 -out certs/dream.org.crt
...
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:zhejiang
Locality Name (eg, city) [Default City]:hangzhou
Organization Name (eg, company) [Default Company Ltd]:dream
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:dream.org
Email Address []:
[[email protected] docker]# ls certs/
dream.org.crt dream.org.key
(2)清空原有映象倉庫
[[email protected] ~]# cd /opt/registry/
[[email protected] registry]# ls
docker
[[email protected] registry]# rm -rf *
(3)刪除原有registry與執行
[[email protected] ~]# cd /etc/docker
[[email protected] docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14815beff02a registry:2.3.1 "/bin/registry /etc/…" 39 minutes ago Up 39 minutes 0.0.0.0:5000->5000/tcp registry
[[email protected] docker]# docker stop registry
[[email protected] docker]# docker rm registry
[[email protected] docker]# docker run -d --restart=always --name registry -v /etc/docker/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISIRY_HTTP_TLS_CERTIFICATE=/certs/dream.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/dream.org.key -p 443:443 registry:2.3.1
[[email protected] docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d650394d05e3 registry:2.3.1 "/bin/registry /etc/…" 3 seconds ago Up 1 second 0.0.0.0:443->443/tcp, 5000/tcp registry
###修改daemon.json
[[email protected] docker]# vim /etc/docker/daemon.json
{"insecure-registries":["10.10.10.1:443"]}
[[email protected] docker]# systemctl restart docker
(4)測試
[[email protected] docker]# mkdir -p certs.d/dream.org
[[email protected] docker]# cp certs/dream.org.crt certs.d/dream.org/ca.crt
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2.3.1 83139345d017 2 years ago 166MB
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
[[email protected] docker]# docker tag rhel7 10.10.10.1:443/rhel7
[[email protected] docker]# docker push 10.10.10.1:443/rhel7
[[email protected] ~]# mkdir -p /etc/docker/certs.d/dream.org
[[email protected] docker]# scp certs.d/dream.org/ca.crt [email protected]:/etc/docker/certs.d/dream.org/
[[email protected] ~]# vim /etc/docker/daemon.json
{"insecure-registries":["10.10.10.1:443"]}
[[email protected] ~]# systemctl restart docker
[[email protected] ~]# docker pull 10.10.10.1:443/rhel7 ###發現可以拉取映象
[[email protected] ~]# docker images 10.10.10.1:443/rhel7
REPOSITORY TAG IMAGE ID CREATED SIZE
10.10.10.1:443/rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
3、私有映象倉庫加密(通過使用者密碼訪問)
官網連結:https://docs.docker.com/registry/deploying/#native-basic-auth
(1)停止之前映象
[[email protected] ~]# docker stop registry
[[email protected] ~]# docker rm registry
(2)建立目錄及使用者密碼
[[email protected] ~]# cd /etc/docker/
[[email protected] docker]# mkdir auth
###這裡使用者:dream 密碼:1
[[email protected] docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn dream 1 > auth/htpasswd
(3)啟動並檢視
[[email protected] docker]# docker run -d --restart=always --name registry -v /etc/docker/certs:/certs -v /etc/docker/auth:/auth -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISIRY_HTTP_TLS_CERTIFICATE=/certs/dream.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/dream.org.key -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 443:443 registry:2.3.1
[[email protected] docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53e33aaea36a registry:2.3.1 "/bin/registry /etc/…" 3 seconds ago Up 2 seconds 0.0.0.0:443->443/tcp, 5000/tcp registry
(4)登陸上傳映象
[[email protected] docker]# docker login 10.10.10.1:443
Username: dream
Password:
Login Succeeded
[[email protected] ~]# docker load -i redis.tar
[[email protected] ~]# docker images 10.10.10.1:443/redis
REPOSITORY TAG IMAGE ID CREATED SIZE
10.10.10.1:443/redis latest 4f5f397d4b7c 2 years ago 178MB
[[email protected] ~]# docker push 10.10.10.1:443/redis
(5)測試
[[email protected] ~]# docker login 10.10.10.1:443
[[email protected] ~]# docker pull 10.10.10.1:443/redis
[[email protected] ~]# docker images 10.10.10.1:443/redis
三、cgroup
1、控制使用者記憶體
(1)安裝
[[email protected] ~]# yum install -y libcgroup
[[email protected] ~]# /etc/init.d/cgconfig start
(2)檢視資訊
[[email protected] ~]# cd /cgroup/memory/
[[email protected] memory]# ls
cgroup.event_control memory.move_charge_at_immigrate
cgroup.procs memory.oom_control
memory.failcnt memory.soft_limit_in_bytes
memory.force_empty memory.stat
memory.limit_in_bytes memory.swappiness
memory.max_usage_in_bytes memory.usage_in_bytes
memory.memsw.failcnt memory.use_hierarchy
memory.memsw.limit_in_bytes notify_on_release
memory.memsw.max_usage_in_bytes release_agent
memory.memsw.usage_in_bytes tasks
[[email protected] memory]# cat memory.limit_in_bytes
9223372036854775807
[[email protected] memory]# cat memory.memsw.limit_in_bytes
9223372036854775807
(3)配置cgconfig.conf
[[email protected] memory]# vim /etc/cgconfig.conf ###在末尾加入
group x1 {
memory {
memory.limit_in_bytes=104857600;
memory.memsw.limit_in_bytes=104857600;
}
}
(4)建立使用者及配置cgrules.conf
[[email protected] memory]# useradd dream
[[email protected] memory]# echo "1"|passwd dream
[[email protected] memory]# vim /etc/cgrules.conf ###在末尾加入
dream memory x1/
[[email protected] ~]# /etc/init.d/cgconfig restart
[[email protected] ~]# /etc/init.d/cgred restart
(5)檢視結果
[[email protected] ~]# cd /cgroup/memory/x1/
[[email protected] x1]# cat memory.memsw.limit_in_bytes
104857600
[[email protected] x1]# cat memory.limit_in_bytes
104857600
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 996 224 772 0 13 146
-/+ buffers/cache: 64 932
Swap: 499 0 499
[[email protected] ~]# cd /dev/shm/
[[email protected] shm]# cgexec -g memory:x1 dd if=/dev/zero of=testfile bs=1M count=300
Killed
[[email protected] shm]# free -m
total used free shared buffers cached
Mem: 996 323 672 0 13 245
-/+ buffers/cache: 64 931
Swap: 499 0 499
2、控制CPU優先順序
(1)檢視CPU個數
保證沒有cpu線上,如果線上的話在/sys/devices/system/cpu/的對應cpu目錄中:echo 0>online即可完成關閉!!!
[[email protected] ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 44
Stepping: 1
CPU MHz: 2494.224
BogoMIPS: 4988.44
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
NUMA node0 CPU(s): 0
(2)修改cpu優先順序
[[email protected] ~]# vim /etc/cgconfig.conf
group x2 {
cpu {
cpu.shares = 100;
}
}
[[email protected] ~]# /etc/init.d/cgconfig restart
(3)測試
[[email protected] ~]# dd if=/dev/zero of=/dev/null &
[1] 1002
[[email protected] ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[2] 1003
[[email protected] ~]# top ###檢視cpu佔用率
(4)關閉程序
[[email protected] ~]# killall -9 dd
3、限制磁碟讀寫速度
(1)安裝
[[email protected] ~]# yum install -y iotop
[[email protected] ~]# cd /cgroup/blkio/
[[email protected] blkio]# cat blkio.throttle.read_bps_device
[[email protected] blkio]# ls
blkio.io_merged blkio.throttle.io_service_bytes blkio.weight_device
blkio.io_queued blkio.throttle.io_serviced cgroup.event_control
blkio.io_service_bytes blkio.throttle.read_bps_device cgroup.procs
blkio.io_serviced blkio.throttle.read_iops_device notify_on_release
blkio.io_service_time blkio.throttle.write_bps_device release_agent
blkio.io_wait_time blkio.throttle.write_iops_device tasks
blkio.reset_stats blkio.time
blkio.sectors blkio.weight
[[email protected] ~]# ll /dev/sda ###屬性為8, 0
brw-rw---- 1 root disk 8, 0 Oct 29 22:28 /dev/sda
(2)配置cgconfig.conf
[[email protected] ~]# vim /etc/cgconfig.conf
group x3 {
blkio {
blkio.throttle.read_bps_device = "8:0 1000000";
}
}
[[email protected] ~]# /etc/init.d/cgconfig restart
(3)測試
[[email protected] ~]# cgexec -g blkio:x3 dd if=/dev/zero of=/dev/null &
[1] 973
[[email protected] ~]# iotop -p 973 ###可以檢視到io速度
4、凍結程序
(1)配置cgconfig.conf
[[email protected] ~]# vim /etc/cgconfig.conf
group x4 {
freezer {}
}
[[email protected] ~]# /etc/init.d/cgconfig restart
(2)測試
[[email protected] ~]# dd if=/dev/zero of=/dev/null &
[1] 1138
[r[email protected] ~]# ps aux|grep dd
[[email protected] ~]# cd /cgroup/freezer/x4/
[[email protected] x4]# echo '1138' >tasks
[[email protected] x4]# echo 'FROZEN' >freezer.state
[[email protected] x4]# ps aux|grep dd
四、Docker Compose
1、Docker Compose介紹
(1)原理圖
(2)簡介
-
Docker Compose 將所管理的容器分為三層,工程(project),服務(service)以及容器(contaienr)。Docker Compose 執行的目錄下的所有檔案(docker-compose.yml, extends 檔案或環境變數檔案等)組成一個工程,若無特殊指定工程名即為當前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器執行的映象,引數,依賴。一個服務當中可包括多個容器例項,Docker Compose 並沒有解決負載均衡的問題,因此需要藉助其他工具實現服務發現及負載均衡。
-
Docker Compose 是一個用來建立和執行多容器應用的工具。使用Compose首先需要編寫Compose 檔案來描述多個容器服務以及之間的關聯,然後通過命令根據配置啟動所有的容器。
-
Dockerfile 可以定義一個容器,而一個 Compose 的模板檔案(YAML 格式)可以定義一個包含多個相互關聯容器的應用。
2、Docker Compose安裝
(1)安裝docker-compose
[[email protected] ~]# wget https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-Linux-x86_64
[[email protected] ~]# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
[[email protected] ~]# chmod +x /usr/local/bin/docker-compose
(2)匯入映象
[[email protected] ~]# docker images ###匯入nginx和haproxy映象
REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy latest fbd1f55f79b3 2 years ago 139MB
nginx latest af4b3d7d5401 2 years ago 191MB
registry 2.3.1 83139345d017 2 years ago 166MB
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
(3)封裝映象
[[email protected] dream]# pwd
/root/dream
[[email protected] dream]# vim yum.repo
[rhel7.0]
name=rhel7.0
baseurl=http://10.10.10.250/rhel7.0
gpgcheck=0
[[email protected] dream]# vim Dockerfile
FROM rhel7
MAINTAINER Dream
ENV HOSTNAME server2
COPY yum.repo /etc/yum.repos.d/yum.repo
EXPOSE 80
RUN rpmdb --rebuilddb && yum install -y httpd
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
[[email protected] dream]# docker build -t rhel7:v1.0 .
(4)配置yml檔案
<1> 建立目錄
[[email protected] dream]# pwd
/root/dream
[[email protected] dream]# mkdir -p compose/{web1,web2,haproxy}
[[email protected] dream]# cd compose/
###新增預設釋出檔案
[[email protected] compose]# echo "web1-apache" >web1/index.html
[[email protected] compose]# echo "web2-nginx" >web2/index.html
<2> 配置yml
引數說明:
–link引數可以在不對映埠的前提下為兩個容器鍵建立安全連線,–link引數可以連線一個或多個容器到將要建立的容器。
image指定為映象名稱或映象ID,如果映象本地不存在,compose 會嘗試拉取這個映象
build指定dickerfile所在資料夾的路徑,composehui9利用他自動構建這個映象,然後使用這個映象。
command覆蓋容器啟動後預設執行的命令
external_links連結到docker-compse.yml外部的容器,甚至並非compose管理的容器
ports暴露的埠資訊
expose暴露的埠,但不對映到宿主機,只被連結的服務訪問,僅可以指定內部埠引數。
volumes卷掛載路徑設定,可以設定宿主機路徑或者訪問模式
volumes_from從另一個服務或容器掛載他的所有卷
environment設定環境變數
env_file從檔案中獲取環境變數,可以為單獨的檔案路徑或列表
extends基於已有的服務進行擴充套件
net設定網路模式
pid跟主機系統共享程序名稱空間
dns配置DNS伺服器
cap_add/drop新增或放棄容器的linux 能力
dns_search配置dns搜尋域,可以是一個值,也可以是一個列表
[[email protected] compose]# pwd
/root/dream/compose
[[email protected] compose]# vim docker-compose.yml
apache:
image: rhel7:v1.0
volumes:
- ./web1:/var/www/html
expose:
- 80
nginx:
image: nginx
volumes:
- ./web2:/usr/share/nginx/html
expose:
- 80
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- apache
- nginx
ports:
- "80:80"
expose:
- 80
<3> 配置haproxy.cfg
[[email protected] compose]# vim haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backend
backend web_backend
balance roundrobin
###這裡的apache和nginx是上面yml中寫的名字
server web1 apache:80 check
server web2 nginx:80 check
<4> 啟動檢視結果
###如果啟動失敗,檢視下每個映象單獨能否啟動成功,或docker-compose -f docker-compose.yml up -d
[[email protected] compose]# docker-compose up -d
[[email protected] compose]# docker ps -a
[[email protected] compose]# netstat -lntup|grep 80
[[email protected] compose]# curl 127.0.0.1
[[email protected] compose]# docker-compose down 或 docker-compose -f docker-compose.yml down ###關閉
五、Docker Swarm
1、Docker Swarm介紹
(1)簡介
-
Swarm 是 Docker 公司在 2014 年 12 月初發布的一套較為簡單的工具,用來管理 Docker 叢集,它將一群 Docker 宿主機變成一個單一的,虛擬的主機。Swarm 使用標準的 Docker API介面作為其前端訪問入口,換言之,各種形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接與 Swarm 通訊。Swarm 幾乎全部用 Go 語言來完成開發。
-
Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受 docker 客戶端傳送過來的請求,排程適合的節點來執行容器,這意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,當Swarm重新恢復執行之後,它會收集重建叢集資訊。
(2)結構圖與介紹
-
最上層的對外介面包括:
- docker API 用於管理映象的生命週期。
- swarm CLI 用於叢集管理。LeaderShip 提供叢集的 HA(high avaliable),防止單點故障,具體實施請參見官網(Highavilability for docker swarm)
- discovery service是warm的發現服務,它會在每個 node 中註冊一個 angent 將各個節點的IP埠上報,manager會從發現服務讀取各節點資訊。
- schedule排程模組,用於容器排程時選擇最優節點,主要分如下兩步(filter 和 strategy)。filter(過濾),當建立或執行容器時,它會告訴排程器哪些節點是可用的(符合要求的)。filter可以分為兩類,節點過濾和基於容器配置的過濾。
- 節點過濾:
- Constraints,約束過濾器,可以根據當前作業系統型別、核心版本、儲存型別等條件進行過濾,當然也可以自定義約束,在啟動 Daemon 的時候,通過 Label 來指定當前主機所具有的特點。
- Health filter,會根據節點狀態進行過濾,會去除故障節點。
- 基於容器配置的過濾:
- Affnity,親和性過濾器,支援容器親和性和映象親和性,比如一個 web 應用,我想將 DB 容器和 Web 容器放在一起,就可以通過這個過濾器來實現。
- Dependency依賴過濾器。如果在建立容器的時候使用了–volume-from/–link/–net 某個容器,則建立的容器會和依賴的容器在同一個節點上。
- Ports filter會根據埠的使用情況過濾。
- strategy 根據策略選擇最優節點:
- Binpack,在同等條件下,選擇資源使用最多的節點,通過這一個策略,可以將容器聚集起來。
- Spread,在同等條件下,選擇資源使用最少的節點,通過這一個策略,可以將容器均勻分佈在每一個節點上。
- Random,隨機選擇一個節點。
- 節點過濾:
-
swarm create
- Swarm 中 swarm create 命令用於建立一個叢集標誌,用於 Swarm 管理 Docker 叢集時,Docker Node 的節點發現功能。
- 發起該命令之後,Swarm 會前往 Docker Hub 上內建的發現服務中獲取一個全球唯一的token,用以唯一的標識 Swarm 管理的 Docker 叢集。注:Swarm 的執行需要使用服務發現,目前該服內建與 Docker Hub,該服務發現機制目前還在 alpha 版本,站點為:http://discovery-stage.hub/docker.com 。
-
swarm manage
- Swarm中swarm manage是最為重要的管理命令。一旦 swarm manage 命令在 Swarm 節點上被觸發,則說明使用者需要 swarm 開始管理 Docker 叢集。從執行流程的角度來講,swarm 經歷的階段主要有兩點:啟動 swarm、接收並處理 Docker 叢集管理請求。
-
Swarm 啟動的過程包含三個步驟:
- 發現 Docker 叢集中的各個節點,收集節點狀態、角色資訊,並監視節點狀態的變化;
- 初始化內部排程(scheduler)模組;
- 建立並啟動 API 監聽服務模組;
- 1、第一個步驟,Swarm發現Docker叢集中的節點。發現(discovery)是 Swarm中用於維護Docker 集 群 狀 態 的 機 制 。既 然 涉 及 到 發 現 ( discovery ) , 那 在 這 之 前 必 須 先 有 注 冊(register)。Swarm中有專門負責發現(discovery)的模組,而關於註冊(register)部分,不同的 discovery 模式下,註冊(register)也會有不同的形式。
目 前 , Swarm 中 提 供 了 5 種 不 同 的 發 現 ( discovery ) 機 制 : Node Discovery 、 FileDiscovery、Consul Discovery、EtcD Discovery 和 Zookeeper Discovery。Hosted Discovery with Docker Hub,Docker Hub 提供的發現服務,需要連線外網。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基於 KV 分散式儲存系統,支援 etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/
靜態檔案描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
靜態 IP 列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375> - 2、第二個步驟,Swarm 內部的排程(scheduler)模組被初始化。swarm 通過發現機制發現所有註冊的 Docker Node,並收集到所有 Docker Node 的狀態以及具體資訊。此後,一旦Swarm 接收到具體的 Docker 管理請求,Swarm 需要對請求進行處理,並通過所有 DockerNode 的狀態以及具體資訊,來篩選(filter)決策到底哪些 Docker Node 滿足要求,並通過一定的策略(strategy)將請求轉發至具體的一個 Docker Node。
- 3、第三個步驟,Swarm 建立並初始化 API 監聽服務模組。從功能的角度來講,可以將該模組抽象為 Swarm Server。需要說明的是:雖然 Swarm Server 完全相容 Docker 的 API,但是有不少 Docker 的命令目前是不支援的,畢竟管理 Docker 叢集與管理單獨的 Docker 會有一些區別。當 Swarm Server 被初始化並完成監聽之後,使用者即可以通過 Docker Client 向 Swarm傳送 Docker 叢集的管理請求。
Swarm 的 swarm manage 接收並處理 Docker 叢集的管理請求,即是 Swarm 內部多個模組協同 合 作 的 結 果 。 請 求 入 口 為 Swarm Server , 處 理 引 擎 為 Scheduler , 節 點 信 息 依 靠Disocovery。
-
swarm join
- Swarm 的 swarm join 命令用於將 Docker Node 新增至 Swarm 管理的 Docker 叢集中。從這點也可以看出 swarm join 命令的執行位於 Docker Node,因此在 Docker Node 上執行該命令,首先需要在 Docker Node 上安裝 Swarm,由於該 Swarm 只會執行 swarm join 命令,故可以將其當成 Docker Node 上用於註冊的 agent 模組。功能而言,swarm join 可以認為是完成 Docker Node 在 Swarm 節點處的註冊(register)工作,以便 Swarm 在執行 swarm manage 時可以發現該 Docker Node。然而,上文提及的 5 種discovery 模式中,並非每種模式都支援 swarm join 命令。不支援的 discovery 的模式有 Node Discovery 與 File Discovery。
- Docker Node 上 swarm join 執行之後,標誌著 Docker Node 向 Swarm 註冊,請求加入 Swarm管理的 Docker 叢集中。Swarm 通過註冊資訊,發現 Docker Node,並獲取 Docker Node 的狀態以及具體資訊,以便處理 Docker 請求時作為排程依據。
-
swarm list
- Swarm中的swarm list 命令用以列舉 Docker叢集中的Docker Node。
- Docker Node 的資訊均來源於 Swarm 節點上註冊的 Docker Node。而一個 Docker Node在Swarm 節點上註冊,僅僅是註冊了 Docker Node 的 IP 地址以及 Docker 監聽的埠號。使用 swarm list 命令時,需要指定 discovery 的型別,型別包括:token、etcd、file、zk 以及。而 swarm list 並未羅列 Docker 叢集的動態資訊,比如 Docker Node 真實的執行狀態,或者 Docker Node 在 Docker 叢集中扮演的角色資訊。
2、swarm操作
(1)初始化
[[email protected] ~]# docker ps -a ###刪除之前的映象,檢視沒有程序
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[[email protected] ~]# docker swarm init
Swarm initialized: current node (kxa6fkpswxjfgdhuc2shui185) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1xs4l5x8v5r63qer69okajyqttq46xfsmar94618n2g0j8qm4e-3qbhxpyhif34jx4u7o4fpcct1 10.10.10.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
(2)從節點新增
[[email protected] ~]# docker swarm join --token SWMTKN-1-1xs4l5x8v5r63qer69okajyqttq46xfsmar94618n2g0j8qm4e-3qbhxpyhif34jx4u7o4fpcct1 10.10.10.1:2377
This node joined a swarm as a worker.
(3)檢視節點
[[email protected] ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
kxa6fkpswxjfgdhuc2shui185 * server1 Ready Active Leader 18.03.1-ce
msmrnltfpxk5x2rxwkpvtsc3n server3 Ready Active 18.03.1-ce
(4)建立服務執行
<1> 保證2臺都有映象
[[email protected] ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest af4b3d7d5401 2 years ago 191MB
[[email protected] ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest af4b3d7d5401 2 years ago 191MB
<2> 建立與檢視
[[email protected] ~]# docker service create --publish 80:80 --replicas 2 --name web1 nginx
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6b20a1fc8e0 nginx:latest "nginx -g 'daemon of…" 13 seconds ago Up 12 seconds 80/tcp, 443/tcp web1.1.1m1bx9fhf72t8lpjkrqy9zuur
<3> 擴容
[[email protected] ~]# docker service scale web1=4
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd26f4dc4466 nginx:latest "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 80/tcp, 443/tcp web1.3.m7hkdn1je7b3v0bpzizbgyeks
c6b20a1fc8e0 nginx:latest "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp, 443/tcp web1.1.1m1bx9fhf72t8lpjkrqy9zuur
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59d92d4e185e nginx:latest "nginx -g 'daemon of…" 14 seconds ago Up 13 seconds 80/tcp, 443/tcp web1.4.zifse45xs5pbd9j8ovfs1dwlt
13c220e3ec9e nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 443/tcp web1.2.j77aenm3p1c5cctoqk81udvgc
<4> 減少
[[email protected] ~]# docker service scale web1=2
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6b20a1fc8e0 nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp, 443/tcp web1.1.1m1bx9fhf72t8lpjkrqy9zuur
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13c220e3ec9e nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 4 minutes 80/tcp, 443/tcp web1.2.j77aenm3p1c5cctoqk81udvgc
3、docker新增監控
參考連結:https://github.com/dockersamples/docker-swarm-visualizer
(1)匯入映象
[[email protected] ~]# docker load -i visualizer.tar
[[email protected] ~]# docker images dockersamples/visualizer
REPOSITORY TAG IMAGE ID CREATED SIZE
dockersamples/visualizer latest 17e55a9b2354 13 months ago 148MB
(2)啟動映象
[[email protected] ~]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
(3)檢視結果
http://10.10.10.1:8080
(4)擴容節點服務
[[email protected] ~]# docker service scale web1=4
(5)關閉從節點(即server3)
[
相關推薦
Docker封裝+Docker映象倉庫搭建+Docker Compose+Docker Swarm
docker的安裝參考部落格:https://blog.csdn.net/Dream_ya/article/details/81122200 百度網盤連結: https://pan.baidu.com/s/1mam5_h2HGpepcWnMZkkcMQ 密碼: jx7d
一、容器封裝
docker 私有映象倉庫搭建
如果大家在操作的時候發現本文中的問題,敬請留言,爭取把這邊文章弄成可用性比較高的文章!!!!!!!!!!!!!!
我的環境相關設定如下
環境:centos7
IP地址:10.211.55.30
dockere版本:1.10.3
映象倉庫:v2
首先在10.211.5
kubernetes實戰篇之nexus oss伺服器部署及基於nexus的docker映象倉庫搭建
系列目錄
Nexus oss倉庫管理平臺搭建
Nexus是一款倉庫管理工具,支援Npm,bower,maven,nuget,apt,yum甚至docker,helm等各種倉庫,說的通俗以下,就是私服映象倉庫.並且有免費版,OSS版即為免費版,下載的時候請注意版本的選擇.
下載地址
往下面滾動頁面,可以看到
Docker 18.03私有倉庫搭建
外網 repos shadow iges -o test rime mct ted 我們在使用Docker時 下載鏡像一般都是在外網下載並使用。可是當我們沒有外網時我們不得不自己搭建私有倉庫。流程圖:docker 版本[root@docker ~]# docker vers
docker 建立私有映象倉庫
mkdir -p /registry/public/repos
docker run --name register -p 5000:5000 -v /registry/public/repos:/var/lib/registry -d registry
開放埠
fire
使用docker搭建高併發網站架構實踐1--Docker簡介以及私有倉庫搭建
1.Docker簡介
Docker是一種作業系統容器虛擬化技術,可以理解為在作業系統的級別上虛擬出更多的虛擬主機來打包以及部署應用等。具體Docker的實現與LXC支援有很大關係,主要技術有名稱空間,控制組以及檔案聯合系統等。主要架構如下所示:
&n
使用docker pull從映象倉庫拉取映象時報錯
[[email protected] ~]# docker pull centos Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.dock
Docker在CentOS映象中搭建JDK和Tomcat
條件:在VM虛擬機器安裝Centos,安裝並啟動Docker,並準備好JDK、Tomcat和Centos映象。
我這裡用的是JDK8、Tomcat8,放在/home目錄中,從docker映象倉庫中把centos的映象pull下來。
啟動映象後會自動進入到容器中,由於將虛
docker(七):Mac docker 將本地映象push到docker hub官方映象倉庫裡面
首先你要到https://hub.docker.com 官方網站上註冊一個賬戶。然後建立一個屬於自己的映象倉庫,你可以設定它是public的還是private的。
假設我的賬戶名為:jinx007
首先在本地ssh到宿主機,
boot2docker s
docker-pub 國內映象倉庫
進行從store.docker.com拉取大的映象特別慢,而且還時常斷掉。所以準備還是用國內的倉庫。
國內的倉庫如下:
Docker 官方中國區
https://registry.docker-
Docker Registry 私有映象倉庫批量清理映象
Docker 私有映象倉庫批量清理映象
前言
在頻繁長期使用映象倉庫後,由於映象倉庫清理映象比較費勁,業內也沒有一個比較好的清理方案,官方提供的映象倉庫清理也比較費勁,導致 Docker 映象倉庫越積越大,嚴重消耗磁碟空間。基於該現狀,推薦如下方案。
環境
Harb
【Docker】(4)搭建私有映象倉庫
【Docker】(4)搭建私有映象倉庫
說明 1、 這裡是通過阿里雲,搭建Docker私有映象倉庫。 2、 這裡打包的映象是從官網拉下來的,並不是自己專案建立的新映象,主要測試功能
一、搭建過程
首先進入阿里雲建立映象倉庫: https://dev.aliyun.com/search.h
Harbor--搭建企業級私有docker映象倉庫(一)
Harbor映象倉庫搭建
Harbor是一個用於儲存和分發Docker映象的企業級Registry伺服器,通過新增一些企業必需的功能
安裝Docker-ce以及Dockerfile和私有映象倉庫registry搭建
轉載請表明出處 https://blog.csdn.net/Amor_Leo/article/details/84963324 謝謝
安裝Docker-ce私有映象倉庫registry搭建
安裝Docker-ce
Docker基本命令
do
Centos7.4 搭建Harbor(docker映象倉庫)
1、安裝docker,docker-compose
yum -y install docker
yum -y install docker-compose
2、配置go語言環境,網上百度一下很多的
在CentOS 7.2上搭建Docker私有映象倉庫
鑑於國內pull映象的速度較慢,很有必要搭建docker私有或者本地映象倉庫。
安裝docker
# yum -y install docker
# systemctl start docker && systemctl en
docker映象管理倉庫搭建加密認證及負載均衡倉庫的搭建
1.映象管理:
Docker 倉庫:
Docker 官方已經把倉庫封裝為映象,直接通過啟動容器就可以部署完成倉庫:
# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/l
Docker映象倉庫Harbor之搭建及配置
目錄
Harbor介紹
環境、軟體準備
Harbor服務搭建
Harbor跨資料複製配置
FAQ
1、Harbor 介紹
Docker容器應用的開發和執行離不開可靠的映象管理,雖然Docker官方也提供了公共的映象倉庫,但是從安全和效率等方面
基於 Harbor 和 Cephfs 搭建高可用 Docker 映象倉庫叢集
目錄
Harbor & Cephfs 介紹
環境、軟體準備
Cephfs 檔案系統建立
單節點 Harbor 服務搭建
安裝 Harbor
配置掛載路徑
配置使用外部資料庫
多節點 Harbor 叢集服務搭建
測試 Habor 叢集
1、Ha
使用官方 docker registry 搭建私有映象倉庫及部署 web ui
本文介紹本人在 Centos 7.1 上的搭建過程 private docker registry 的全過程,參考自這篇官網文件,英語好的可以直接看官網文件,裡面的內容更詳細,涉及更多原理性的東西,而本文側重於動手實踐。
本文不介紹 docker 的基礎概念,也不介紹為什麼