码迷,mamicode.com
首页 > 其他好文 > 详细

docker随笔

时间:2020-11-30 15:43:44      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:结构   均衡   his   sudo   service   restart   ingress   linu   out   

编写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<1320206695@qq.com>
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 root@192.168.33.250(相互复制)

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

docker随笔

标签:结构   均衡   his   sudo   service   restart   ingress   linu   out   

原文地址:https://www.cnblogs.com/zhjk/p/14034449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!