1. 程式人生 > 實用技巧 >下載工具類

下載工具類

編寫dockerFile

注:docker埠集合

​ 2377/tcp 客戶端和swarm的通訊

​ 7946/tcp 和 7946/tcp 用於控制面 gossip 的分發

​ 4789/dup 用於VXLAN的覆蓋網路

1、dockerfile 中各個命令含義:

2、cmd和entrypoint的區別。

#cmd 指的是docker run my-dockerfile-centos  後 執行的命令。
CMD ["ls","-a"]
#entrypoint指的是 可以在docker run -it -d 之後 追加  命令。
如 entrypoint ["ls","-a"]
然後 可以docker run my-dockerfile-centos (-l) 追加一個 -L命令

3、編寫dockerfile

##使用官方命名,不用-f 指定。FROM centos
MAINTAINET zhangpeng<[email protected]>
COPY readme.txt /usr/local/readme.txt

ADD openjdk-13_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-9.0.26.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk-13
ENV CALSSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.26
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.26

ENV PATH $PATH:$JAVA_HOME/bin:/$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.26/bin/startup.sh && tail -10f /usr/local/apache-tomcat-9.0.26/bin/logs/catalina.out

4、構建映象。

docker build -t mytomcat . ##(.)點很重要

5、multistage builds 多階段構建 (build stage) 重點:copy --from

##多階段構建 (build stage) :從多個from中,提取之前階段構建的映象中與生產環境相關的應用程式碼。而不會複製生產環境不需要的構件。
##在RUN 後使用&& 或者(\) ,在一行中新增多行命令。
##示例:
FROM golang:1.9-alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .


FROM alpine:latest as prod
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloworld/app .
CMD ["./app"]

docker compose

1、安裝docker-compose

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2、docker-compose.yml 檔案結構示例

 
version: "3"
services:
 
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
 
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]
 
networks:
  frontend:
  backend:
 
volumes:
  db-data:

docker Swarm

1、什麼是docker swarm ?

 Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受Docker客戶端發來的請求,排程適合的節點來執行容器,這就意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,放Swarm重新恢復執行之後,他會收集重建叢集資訊。

參考資料:

Docker三劍客之Docker Swarm - 一本正經的搞事情 - 部落格園

2、docker swarm 和 docker compose 的區別?

Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。

3、Swarm 的排程策略

Swarm在排程(scheduler)節點(leader節點)執行容器的時候,會根據指定的策略來計算最適合執行容器的節點,目前支援的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個Node來執行容器,一般用作除錯用,spread和binpack策略會根據各個節點的可用的CPU, RAM以及正在運
行的容器的數量來計算應該執行容器的節點。
 
2)Spread
在同等條件下,Spread策略會選擇執行容器最少的那臺節點來執行新的容器,binpack策略會選擇執行容器最集中的那臺機器來執行新的節點。
使用Spread策略會使得容器會均衡的分佈在叢集中的各個節點上執行,一旦一個節點掛掉了只會損失少部分的容器。
 
3)Binpack
Binpack策略最大化的避免容器碎片化,就是說binpack策略儘可能的把還未使用的節點留給需要更大空間的容器執行,儘可能的把容器執行在
一個節點上面。

4、準備工作

hostnamectl set-hostname manager248
hostnamectl set-hostname node249
hostnamectl set-hostname node250
192.168.31.248 manager248
192.168.31.249 node249
192.168.31.250 node250

ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected](相互複製)

ssh 192.168.33.248 測試

#建docker swarm manager
[root@localhost home]# docker swarm init --advertise-addr 192.168.33.248

Swarm initialized: current node (rfyxshs40vwx2ib40026canik) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-00xqc29xa0ls2w8zdbqdc1xmgkmg8p0zivpogdg04pevf74b7f-ckjdjlgrgh119ajosj22uif29 \
    192.168.33.248:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

#看 以worker身份加入節點需要的token:
[root@localhost home]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-00xqc29xa0ls2w8zdbqdc1xmgkmg8p0zivpogdg04pevf74b7f-ckjdjlgrgh119ajosj22uif29 \
    192.168.33.248:2377

#啟warm內建 安全機制:
[root@localhost home]# docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:

    SWMKEY-1-Ze0fX9rLVpIB6UwUtzPeMMALZzhDkNr4cd9GVO9C9/A##(這個密碼需要保護好)
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
#這樣就需要在重啟的管理節點 使用命令 docker warm unlock 並輸入密碼才能重新加入叢集。

#更改節點的availablity狀態
swarm叢集中node的availability狀態可以為 active或者drain,其中:
active狀態下,node可以接受來自manager節點的任務分派;
drain狀態下,node節點會結束task,且不再接受來自manager節點的任務分派(也就是下線節點)
[root@manager43 ~]# docker node update --availability drain node139  

OPTIONS='--selinux-enabled --log-driver=journald --registry mirror=https://oct7t4zn.mirror.aliyuncs.com'

https://oct7t4zn.mirror.aliyuncs.com
echo "DOCKER_OPTS=\"$DOCKER_OPTS --registry-mirror=https://oct7t4zn.mirror.aliyuncs.com\"" >> /etc/default/docker service docker restart


docker

5、swarm的service 建立,檢視,縮容、刪除

docker service create --name nginx_test --network nginx_net -p 80:80 --replicas 5 nginx:latest 
#建立一個NGINX 服務,--replicas 5表示建立五個副本
#####################################################==記錄一個報錯:==##########################################################
錯誤1
image xx could not be accessed on a registry to record
its digest. Each node will access xx independently,
possibly leading to different nodes running different
versions of the image.

問題原因::在docker swarm的manager和worker節點上都存在相同的image,導致在manager節點建立叢集容器時報錯。需要刪除掉worker節點上相同的image。









docker service Ps nginx_test
docker service inspect nginx_test                                      #加--pretty 可以少看一些內容
#docker service                                                         服務檢視

#docker service 建立時 ,有兩種模式:副本模式和全域性模式,副本模式儘可能均勻分佈,全域性模式每個節點僅執行一個副本。
#docker service create 時加 --mode global來切換成全域性模式

docker service scale nginx_test=10 擴容到十個
docker service scale nginx_test=3 縮小到三個
                                                                     #docker 的縮容


docker service rm nginx_test
                													#docker 服務的刪除




6、docker swarm service的滾動升級

scope(範圍)
#預設的情況下 swarm中的所有節點開放埠,即使節點上沒有任何服務的副本,稱為入站模式(ingress mode)
#另外一種叫主機模式(host only) ,即只在執行有容器副本的節點開放埠,主機模式需要在create時另外宣告:
docker service create --name nginx_test --network nginx_net --publish published=80,target=80,mode=host --replicas 8 nginx:latest


docker network