1. 程式人生 > >Docker封裝+Docker映象倉庫搭建+Docker Compose+Docker Swarm

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封裝映象

引數說明:
  1. FROM : 指定基礎映象
  2. MAINTAINER 作者資訊
  3. ENV HOSTNAME 設定環境變數
  4. EXPOSE 暴露埠
  5. RUN 映象操作命令
  6. CMD 映象啟動命令,預設只能啟動一條
  7. USER 指定容器執行的使用者
  8. WORKDIR 指定後續命令的執行目錄
  9. COPY 複製本地資料夾到映象中
  10. ADD 用於新增本地的tar 壓縮包到容器指定目錄,壓縮包被自動解壓為目錄
  11. ENTRYPOINT 容器啟動後執行的命令,讓容器執行表現的向一個可執行程式一樣,與CMD的區別是不可以被docker run 覆蓋,會把docker run後面的引數當做傳遞給ENTRYPOINT 指令的引數,dockerfile 中只能制定一個ENTRYPOINT ,如果指定很多,以最後一個為準
  12. 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、私有倉庫搭建(無認證)

官網連結:https://docs.docker.com/registry/

(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 的基礎概念,也不介紹為什麼