docker定义、优点和安装
-
docker定义 定义:Docker包括一个命令行程序,一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布、和删除软件。这一切都能够实现是通过使用一项Unix技术,称为容器
-
docker优点 优点:Docker 和传统虚拟化(KVM、XEN等)方式的不同之处,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的APP应用。 下图为传统虚拟化方案:
如下为Docker虚拟化方案:跟传统VM比较具有如下优点: 操作启动快 运行时的性能可以获取极大提升,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。 轻量级虚拟化 你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。但是传统虚拟化,你虚拟10-20个虚拟机就不错了。 开源免费 开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VMs要便宜。 前景及云支持 正在越来越受欢迎,包括各大主流公司都在推动docker的快速发展,性能有很大的优势。 Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。 镜像:docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。 容器:使用镜像常见的应用或者系统,我们称之为一个容器。 仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。 -
docker 安装:
- YUM安装方法:
- yum install -y yum-utils \
- device-mapper-persistent-data \
- lvm2
- 使用以下命令设置稳定存储库:
- yum-config-manager \
- --add-repo \
- https://download.docker.com/linux/centos/docker-ce.repo
- 这些存储库包含在docker.repo上面的文件中,但默认情况下处于禁用状态。您可以将它们与稳定存储库一起启用。以下命令启用夜间存储库。
- yum-config-manager --enable docker-ce-nightly
- 安装最新版本的Docker Engine:
- yum install docker-ce docker-ce-cli containerd.io
- sh脚本安装方法:
- $ curl -fsSL https://get.docker.com -o get-docker.sh
- $ sudo sh get-docker.sh
docker常用命令简介
- docker version #查看版本
- docker search centos#搜索可用docker镜像
- docker images 查看当前docker所有镜像
- docker pull centos #下载镜像
- cat centos.tar | docker import - centos6 #Docker导入镜像
- docker export id > cenos6.tar #Docker导出镜像
- docker run centos echo "hello word"#在docker容器中运行hello world!
- docker run centos yum install ntpdate #在容器中安装ntpdate的程序
- docker ps -l 命令获得最后一个容器的id,docker ps -a查看所有的容器。
- 运行docker commit 提交刚修改的容器,例如:
- docker commit 2313132 centos:v1
- docker run -i -t centos /bin/bash 在容器里启动一个/bin/bash shell环境,可以登录进入操作,其中-t 表示打开一个终端的意思,-i表示可以交互输入。
- docker run -d --name 容器名称 centos:v1 /bin/bash ,-d表示在后台启动,以daemon方式启动, --name表示给容器起一个name名字。
- docker stop id 关闭容器
- docker start id 启动某个容器
- docker rm id 删除容器,
- docker rm $(docker ps -a -q) 批量删除停止的容器
- docker rmi images删除镜像
- docker rmi `docker images -q`
- docker run -d -p 80:80 -p 8022:22 centos:v2,解析:-p指定容器启动后docker上运行的端口映射及容器里运行的端口,80:80,第一个80表示docker系统上的80,第二个80表示docker虚拟机里面的端口。用户默认访问本机80端口,自动映射到容器里面的80端口。
-
- docker exec -it id /bin/bash
Docker持久化存储和数据共享
使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS(联合文件系统),这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
- 存储卷的类型
Docker的存储卷有两种类型,每一个存储卷就是容器目录上的挂载点在主机目录树中的位置,但不同的存储卷类型在主机的位置是不同的。第一种类型是绑定挂载存储卷。绑定挂载存储卷使用该用户提供的主机目录或文件。第二种类型是管理存储卷。管理存储卷使用由Docker守护进程控制的位置,被称为Docker管理空间。以我们的服务器docker启动容器为例如图所示
- Docker持久化数据的方案
数据持久化之DataVolume,使用场景:一般来讲有些容器它本身会自己产生一些数据,然后这些数据我们不想随着container的消失而消失,我们想保证数据的安全正常使用在比如说数据库,数据库会产生一些数据,这些产生数据如果container删除了那么数据也没了我们想要保存这些数据,这个时候就要用到DataVolume,我们在上边常用命令简介中介绍到了-V 参数,通过这个参数去指定容器里面指定某个目录产生的数据,来挂载到我们linux指定的一个目录下面,我们以centos为实例
- docker create -v /data --name centos_data centos
- 将启动一个名为“centos_data”的容器,其数据量为/data。由于没有服务,docker将立即停止。现在使用-volumes-from flag创建应用程序容器。
- [root@docker1 volumes]# docker volume ls
- DRIVER VOLUME NAME
- local af72375c0d42045601c135734bdac92c34869e73d113d43d9bc16c37d73d7dd4
- [root@docker1 volumes]# docker volume inspect af72375c0d42045601c135734bdac92c34869e73d113d43d9bc16c37d73d7dd4
- [
- {
- "CreatedAt": "2019-09-01T15:24:46+08:00",
- "Driver": "local",
- "Labels": null,
- "Mountpoint": "/var/lib/docker/volumes/af72375c0d42045601c135734bdac92c34869e73d113d43d9bc16c37d73d7dd4/_data",
- "Name": "af72375c0d42045601c135734bdac92c34869e73d113d43d9bc16c37d73d7dd4",
- "Options": null,
- "Scope": "local"
- }
- ]
- 将数据卷用于新容器
- docker run -it --volumes-from centos_data centos /bin/bash
- [root@docker1 volumes]# docker run -it --volumes-from centos_data centos /bin/bash
- [root@af5a5ec5315e /]# cd /data
- [root@af5a5ec5315e data]# echo "Hello Docker" > file.txt
验证数据卷上的文件:
让我们退出上一个容器启动另一个具有相同数据量的容器,并检查/ data目录下的可用文件。
docker run -it --volumes-from centos_data centos /bin/bash
之后查看原来创建的文本和文件夹还存在数据得到保留。 数据持久化:Bind Mounting
与DataVolume区别:datavolume需要在dockerfile里面或者命令里面定义我们需要创建的volume,bindmounting不需要,BindMounting 只需要指定本地目录和容器目录一一对应的关系,通过这种方式可以做一种同步,就是说容器目录和本地目录做了一种映射,我们的生产系统docker服务器就是用的这种方式,在脚本中我们可以看到如下命令:
- docker run -d \
- -p $port_mapping:9090 \
- -v /data/logs/$port_mapping:/work/www/ftpdir/ \
- -v /data/logs/tomcat/$port_mapping:/root/logs/ \
- --log-opt max-size=10m \
- --log-opt max-file=2 \
- --env ServerIP=`curl ip.cip.cc` --env PORT=$((port_mapping)) \
- swr.cn-north-4.myhuaweicloud.com/tomcat/web-rep:latest
期中 在命令里面 两个-V 的就是绑定挂载,把容器里面的/work/www/ftpdir 绑定挂载到linux目录下的/data/logs/端口号 目录下,把容器里面/root/logs 目录绑定挂载到linux下的/data/logs/tomcat目录下。
docker网络机制和网络方案
- Docker的网络模式
Docker关心两种类型的网络:单机虚拟网络和多主机虚拟网络。本地虚拟网络用来提供容器的隔离。多主机虚拟网络构建了一个抽象的覆盖网络,在这个网络中,任何容器相对于网络上的其他容器都拥有独立的、可路由的IP地址。
Docker的四种网络模式:
- host模式,使用--net=host指定。
- container模式,使用--net=container:NAME_or_ID指定。
- none模式,使用--net=none指定。
- bridge模式,使用--net=bridge指定,默认设置
host模式
Docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。 众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
container模式
多个容器使用共同的网络看到的ip是一样的。 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
none模式
这种模式下不会配置任何网络。 这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。 类似于Vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
- 当需要多个容器在同一个Docker主机上进行通信时,Bridge桥接网络是最佳选择。
- 当网络堆栈不应与Docker主机隔离时,host是最好的,但应隔离容器的其他方面。
- 当您需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,覆盖网络是最佳选择。
- 第三方网络插件允许您将Docker与专用网络堆栈集成。
Docker 跨主机的网络连接方案:
docker 地址跟物理网卡地址是不重叠的,所以docker服务器互通总共有三个网段,172.17.42.1,172.18.42.1,和192.168.1.0/24 具体操作方法:在docker1上修改Docker0的网络地址,与docker2不冲突,
- vim /usr/lib/systemd/system/docker.service
- ExecStart=/usr/bin/dockerd --bip=172.17.42.1/16 -H fd:// --containerd=/run/containerd/containerd.sock
- systemctl daemon-reload ,systemctl restart docker
重启docker服务看到ip地址修改正常
因为是打通路由机制的。所以在docker1上执行route add -net 172.18.0.0/16 gw 192.168.1.6 docker2上执行
route add -net 172.17.0.0/16 gw 192.168.1.5
在docker1上启动一个容器获取其IP地址:
docker run --rm=true -it centos /bin/bash
在docker2上启动一个容器获取其IP地址:
docker run --rm=true -it centos /bin/bash
在docker2 上ping docker1 IP上抓包结果
ping 172.18.0.1
docker2 172.18.0.1 ping docker1上的172.17.0.1容器时,C1发现这个地址不是docker网关
经过路由计算,这个报文被发往吓一跳的路由端口eth0,所以ttl减一
报文经过docker1的eth0网卡,经过路由计算,被发往下一跳的端口docker1 下图为docker1报文
到达docker0 ttl 又减掉了1
回来的时候数据包的流程172.17.0.1---DOCKER0-----docker1(eth0) ---docker2(eth0) ---docker2 docker0---172.18.0.1
TTL是指定数据报被路由器丢弃之前允许通过的网段数量,如果同一服务器不同的ip,你ping这些 ip得到的ttl越高(经过转发的路由器少),延时越小,说明直连该ip会更快 在一般情况下还可以通过ping对方让对方返回给你的TTL值大小,粗略的判断目标主机的系统类型是Windows系列还是UNIX/Linux系列。 一般情况下Windows系列的系统返回的TTL值默认值128,而UNIX默认值255,linux默认值64,根据ttl返回的值可以大体判断对端使用的是什么系统
Dockerfile
Dockerfile其实可以看做一个命令集。每行均为一条命令。每行的第一个单词,就是命令command。后面的字符串是该命令所要接收的参数。比如ENTRYPOINT /bin/bash。ENTRYPOINT命令的作用就是将后面的参数设置为镜像的entrypoi
docker build的流程(这部分代码基本都在docker/builder中)
Dockerfile指令详解
Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。下面一一讲解。
-
FROM格式为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
-
MAINTAINER格式为MAINTAINER user_name user_email,指定维护者信息
-
RUN格式为RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c","echo hello"]
每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。 -
CMD 支持三种格式: CMD ["executable","param1","param2"],使用exec执行,这是推荐的方式。 CMD command param1 param2 在/bin/sh中执行。 CMD ["param1","param2"] 提供给ENTERYPOINT的默认参数。 CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
-
EXPOSE格式为 EXPOSE port [port2,port3,...],例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。 在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。
-
ENV 格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。 例如 ENV word hello RUN echo $word
-
ADD 格式:ADD src dest 该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。
-
COPY 格式为:COPY src desc复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
-
ENTRYPOINT 格式有两种: ENTRYPOINT ["executable","param1","param2"]ENTRYPOINT command param1,param2 会在shell中执行。 用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
-
VOLUME 格式为 VOLUME ["/data"] 作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
-
USER 格式为:USER username 指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。 例如:RUN groupadd -r docker && useradd -r -g docker docker
-
WORKDIR 格式: WORKDIR /path为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
-
ONBUILD 格式ONBUILD [INSTRUCTION] 该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。 例如下面的Dockerfile创建了镜像A:
- ONBUILD ADD . /app
- ONBUILD RUN python app.py
则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
- FROM A
- ADD ./app
- RUN python app.py
- docker build 创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。 通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。 通过 -t 指定镜像的标签信息,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路径 通过docker history image可以看到该镜像的历史来源。即使没有Dockerfile,也可以通过history来逆向产生,以我们的docker app-rep服务器为例
实际上我们的dockerfile:
- FROM hthy/ubuntu
- VOLUME /tmp
- ADD reptile_mobile_web-0.0.1-SNAPSHOT.jar reptile_mobile_web-0.0.1-SNAPSHOT.jar
- COPY filebeat /root
- #RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
- RUN mkdir userlog && chmod -R 755 /root
- #RUN sh -c 'touch /reptile_mobile_web-0.0.1-SNAPSHOT.jar' && apt-get update && apt-get install -y language-pack-zh-hans && echo "172.20.39.173 elk-kafka1" >> /etc/hosts && echo '172.20.47.11 elk-kafka3' >>/etc/hosts && echo '172.20.38.151 elk-kafka2' >> /etc/hosts
- ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1
- ENV LANGUAGE=zh_CN:zh
- ENV LANG=zh_CN.UTF-8
- ENV LC_ALL=zh_CN.UTF-8
- ENV MALLOC_ARENA_MAX=1
- ENV M_ARENA_MAX=1
- ENV TZ=CST-8
- ENV APP_DOCKER_ENV="docker"
- ENV JAVA_HOME=/java
- ENV PATH=$JAVA_HOME/bin:$PATH
- ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- ENV JAVA_OPTS="-Xms600m -Xmx600m -Xmn128m"
- #ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Duser.timezone=GMT+08", "-Dfile.encoding=UTF-8", "-jar", "reptile_mobile_web-0.0.1-SNAPSHOT.jar"]
- ENTRYPOINT ["./root/app_rep.sh"]
以上文件大体都能够跟histroy里面的命令对上。
docker的隔离
Docker构建的容器隔离包括8个方面,具体如下:
Namespaces用于环境隔离,Linux kernel支持的Namespace包括UTS, IPC, PID, NET, NS, USER以及新加入的CGROUP等,UTS用于隔离主机名和域名,使用标识CLONE_NEWUTS,IPC用于隔离进程间通信资源如消息队列等,使用标识CLONE_NEWIPC,PID隔离进程,NET用于隔离网络,NS用于隔离挂载点,USER用于隔离用户组 CGroups 用于资源限制,包括限制CPU、内存、blkio以及网络等, blkio :设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等。 cpu :使用调度程序为 cgroup 任务提供 cpu 的访问。 cpuacct :产生 cgroup 任务的 cpu 资源报告。 cpuset :如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存。 devices :允许或拒绝 cgroup 任务对设备的访问。 freezer :暂停和恢复 cgroup 任务。 memory :设置每个 cgroup 的内存限制以及产生内存资源报告。 net_cls :标记每个网络包以供 cgroup 方便使用。 ns :命名空间子系统。 perf_event :增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
资源监控的关键目录:cat读出 已使用内存: /sys/fs/cgroup/memory/docker/应用ID/memory.usage_in_bytes 分配的总内存: /sys/fs/cgroup/memory/docker/应用ID/memory.limit_in_bytes 已使用的cpu:单位纳秒 /sys/fs/cgroup/cpuacct/docker/应用ID/cpuacct.usage
内存限制是对容器所做的最基础的限制,它限制了容器中的进程能够使用的内存大小。内存限制对确保一个容器不会因为资源过多而影响到运行在同一计算机上的其他容器非常有用,默认情况下,在出现 out-of-memory(OOM) 错误时,系统会杀死容器内的进程来获取更多空闲内存。这个杀死进程来节省内存的进程,我们姑且叫它 OOM killer。我们可以通过设置--oom-kill-disable选项来禁止 OOM killer 杀死容器内进程。但请确保只有在使用了-m/--memory选项时才使用--oom-kill-disable禁用 OOM killer。如果没有设置-m选项,却禁用了 OOM-killer,可能会造成出现 out-of-memory 错误时,系统通过杀死宿主机进程或获取更改内存。
- -memory 这个选项会接受一个值和一个基础单元作为参数,格式如下:
- where unit =b, k m org g
- 举例如下:
- docker run -d --name mem_test \
- --memory 256m \
- mysql:latest
- 上命令将启动一个mysql的容器,并将内存限制在256M
-
- 以下是截取的docker help命令关于内存限制的命令提示
- -m, --memory bytes Memory limit
- --memory-swap 内存+交换分区大小总限制。格式同上。必须-m设置的大
- --memory-reservation bytes 内存的软性限制。格式同上
- --memory-swappiness int 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
- --mount mount Attach a filesystem mount to the container
- --name string Assign a name to the container
- --network string Connect a container to a network (default "default")
- --network-alias list Add network-scoped alias for the container
- --no-healthcheck Disable any container-specified HEALTHCHECK
- --oom-kill-disable Disable OOM Killer
- --oom-score-adj int Tune host's OOM preferences (-1000 to 1000)
- --pid string PID namespace to use
- --pids-limit int Tune container pids limit (set -1 for unlimited)
- --privileged Give extended privileges to this container
Docker: 限制容器可用的CPU
默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难
一、限制可用的 CPU 个数 在 docker 1.13 及更高的版本上,能够很容易的限制容器可以使用的主机 CPU 个数。只需要通过 --cpus 选项指定容器可以使用的 CPU 个数就可以了,并且还可以指定如 1.5 之类的小数。 二、指定固定的 CPU 通过 --cpus 选项我们无法让容器始终在一个或某几个 CPU 上运行,但是通过 --cpuset-cpus 选项却可以做到!这是非常有意义的,因为现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。下面的命令为容器设置了 --cpuset-cpus 选项,指定运行容器的 CPU 编号为 1:
docker run -it --rm --cpuset-cpus="1" nginx:latest /bin/bash
三、设置使用 CPU 的权重 当 CPU 资源充足时,设置 CPU 的权重是没有意义的。只有在容器争用 CPU 资源的情况下, CPU 的权重才能让不同的容器分到不同的 CPU 用量。--cpu-shares 选项用来设置 CPU 权重,它的默认值为 1024。我们可以把它设置为 2 表示很低的权重,但是设置为 0 表示使用默认值 1024 下面我们分别运行两个容器,指定它们都使用 Cpu0,并分别设置 --cpu-shares 为 512 和 1024:
- docker run -it --rm --cpuset-cpus="0" --cpu-shares=512 nginx:latest /bin/bash
- 以下是截取的help命令里面的关于CPU 限制资源的命令提示
- -c, --cpu-shares int CPU shares (relative weight)
- --cpus decimal Number of CPUs
- --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
- --cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
公有和私有软件的分发
用公共仓库发布:在 Docker Hub 上发布一个 Hello World 映像 先创建映像的 Dockerfile 文件
- FROM busybox:latest
- CMD echo Hello World
创建映像:
- $ docker build \
- -t ping187/hello-dockerfile .
- 使用 docker login 命令来登录 Docker Hub,该命令的选项有 --username,--email,--password。
最后将映像 push 到 Docker Hub:
$ docker push haiiiiiyun/hello-dockerfile
之后可以通过 docker search haiiiiiyun/hello-dockerfile 或者到 Docker Hub 网站上查找该映像。
我们的服务器用的是私有仓库,私有仓库表明只是给得到授权的账户使用,在公共搜索里面无法搜索到,具体同共有仓库不同是修改docker.service 增加 --insecure-registry=swr.cn-north-4.myhuaweicloud.com 参数,因为docker默认是上传搜索的docker hub仓库,增加改参数表明我们上传使用我们自己自定义的仓库。其他同共有仓库一样
docker 图形化管理和监控
Docker常用监控命令 docker status
docker管理工具Tutum
被docker 收购的管理工具,详细 docker管理工具 shipyard Shipyard(github)是建立在docker集群管理工具Citadel之上的可以管理容器、主机等资源的web图形化工具,包括core和extension两个版本,core即shipyard主要是把多个 Docker host上的 containers 统一管理(支持跨越多个host),extension即shipyard-extensions添加了应用路由和负载均衡、集中化日志、部署等;Shipyard是在Docker Swarm实现对容器、镜像、docker集群、仓库、节点进行管理的web系统。
安装:
curl -s https://shipyard-project.com/deploy | bash -s
Weave scope Weave Scope是Docker和Kubernetes的可视化和监控工具。它提供了一个自上而下的应用程序以及整个基础架构视图,并允许您在部署到云提供商时实时诊断分布式容器化应用程序的任何问题。 要在本地Docker机器上安装Scope,请运行以下命令:
- sudo curl -L git.io/scope -o /usr/local/bin/scope
- sudo chmod a+x /usr/local/bin/scope
- scope launch
控制微服务
当部署到云中的Docker容器时,基于微服务的体系结构带来了重大挑战。微服务往往是动态的许多分布式组件,这可能使监控变得困难。但是使用Weave Scope,可视化网络瓶颈,简化了CPU消耗和内存泄漏的故障排除。借助视图,您可以快速查看有关容器化应用的各种指标。
自动拓扑和智能分组
Weave Scope生成流程,容器和主机的映射,以便您可以理解,监视和控制应用程序。 它使用已建立的API(例如:/ proc,conntrack,Docker API等)来收集有关运行它的主机的信息。它不会对您的应用程序进行任何修改或需要自定义内核模块。 Weave Scope的探针收集的信息用于构建应用程序的拓扑和主机上运行的容器。报告由探针(代理)在本地生成,然后通过HTTP发送到应用程序,在那里它们被合并和处理以形成群集范围的视图。 多节点安装 假设您在群集中有以下节点:
- 192.168.100.16
- 192.168.100.17
- 192.168.100.18
- 192.168.100.19
- 192.168.100.20
使用上述IP地址,您将在Scope启动期间手动将每个节点与所有其他节点对等: 1.开始在每个节点上运行以下命令:
- sudo curl -L git.io/scope -o /usr/local/bin/scope
- sudo chmod a+x /usr/local/bin/scope
2.然后在第一个节点启动范围上:
scope launch 192.168.100.18 192.168.100.19 192.168.100.20
3.对集群中的所有其他节点执行相同操作:
- scope launch 192.168.100.17 192.168.100.20 192.168.100.21
- scope launch 192.168.100.17 192.168.100.18 192.168.100.21
- scope launch 192.168.100.17 192.198.100.19 192.168.100.20