docker笔记

一  Docker的基本使用方法

Docker与与全虚拟化,半虚拟化标准对比

1) 其没有提供任何硬件的虚拟化

2)其没有提供真正意义上的资源隔离的虚拟主机

3)其与宿主环境共享所有的资源,容器程序实际上是运行在宿主机上的进程。

4)其非常轻量级,程序效率几乎没有损失

5)容器虚拟机的启动,关闭时秒级的

Docker技术的基础:

Namespace        容器隔离的基础,保证A容器看不到B容器.

6个名空间:User,Mnt,Network,UTS,IPC,Pid

Cgroups               容器资源统计和隔离。

主要用到的cgroups子系统:cpu,blkio,device,freezer,memory

Unionfs                 典型:aufs/overlayfs,分层镜像实现的基础

Docker组件:

  • docker Client客户端————>向docker服务器进程发起请求,如:创建、停止、销毁容器等操作
  • docker Server服务器进程—–>处理所有docker的请求,管理所有容器
  • docker Registry镜像仓库——>镜像存放的中央仓库,可看作是存放二进制的scm

 

部署方式 :

1、在线方式:

       curl -sSL https://get.docker.com/ | sh

2、离线方式:

       原理 :修改缓存文件,用在线方式安装,得到离线包,再通过RPM方式安装

vi/etc/yum.conf

1) 修改 cachedir

2)修改keepcache=1 允许缓存

 

rpm –ivh*.rpm

服务方式

CentOS6:      service docker start

CentOS7:      systemctl start docker

手动方式:

1.7:     /usr/bin/docker -d

1.9 :       /usr/bin/docker daemon &

1.13:     /usr/bin/dockerd

 

Docker的命令

镜像管理 :

Docker search镜像名                              搜索镜像

                     也可以使用网页搜索https://www.docker.com/

dockerpull 镜像名                                  下载镜像

dockersave centos:6.6 > centos66.img     使用save保存镜像为文件

dockerload < centos66.img                     在另外一台机器上载入

dockerimages                                        列出本机镜像库的所有镜像

dockerrmi -f  id                                     删除不想要的镜像

                                   注:有此镜像产生的容器正在使用时,无法删除

dockertag old_name new_name              为本地下载的镜像创建别名

dockerbuild                                            使用Dockerfile创建镜像(推荐)

dockercommit                                        从容器创建镜像

dockerload                                             从一个tar包创建一个镜像,和save配合使用

dockersave                                      将一个镜像保存为一个tar包,带layers和tag信息

dockerhistory                                         显示生成一个镜像的历史命令

dockertag                                              为镜像起一个别名

 

镜像仓库(registry)操作

dockerlogin                                            登录到一个registry

dockersearch                                          从registry仓库搜索镜像

dockerpull                                              从仓库下载镜像到本地

dockerpush                                            将一个镜像push到registry仓库中

 

容器管理

dockerrun 镜像名                            从镜像启动一个容器实例

docker create镜像名                       从镜像生成一个容器实例,但不运行             

dockerstop 容器名                          停止一个容器实例

dockerstart 容器名                          再次运行一个可以停止的容器实例

docker ps                                         查看运行的容器实例

docker ps–a                                     查看所有当前存在的容器实例

docker rm -f  id                               删除存在的容器

                                                        删除所有容器 : dockerrm -f `docker ps -aq`

docker kill                                        发送信号给容器,默认SIGKILL

docker attach                                    连接(进入)到一个正在运行的容器

docker wait                                      阻塞到一个容器,直到容器停止运行

docker cp 容器名:容器内的文件名 容器外的位置

                                                        拷贝容器内的文件到容器外

docker run 选项 镜像名                  

              -i:        与容器交互,即容器接受输入

-t:        获得一个控制台,即容器产生一个输出

-d:       以后台方式运行容器

-e:       启动容器时,向容器传递信息

(在容器内创建了一个环境变量) 

        -rm:   运行完就删除

--name:      给一个容器命名

-p:       将容器内的端口映射到主机端口

                            docker -d -p 2222:22

              -P:       将容器内的端口随机映射到主机端口

                                          docker -d -P 2222:22

-v:       将主机目录映射到容器内的目录,与挂载类似

       (必须使用绝对路径)(使用pwd时注意应`pwd`/ 这样用)

(默认容器对映射目录有读写权利)

                     (数据持久化的方法之一!容器与主机,容器之间也可以传递信息)

 

隐式运行命令:                                                                                                            

docker run –itd busybox

显示运行命令:

docker run –itd busybox /bin/sh                                                                                    

 

 

用法 :

dockerrun –it 镜像名

dockerrun –e xm=tom 镜像名

dockerrun --name=c1  镜像名

dockerrun –itd  -v 本地文件名:容器内被映射的文件名 [:ro/rw]

dockerrun --name=c1 镜像名

dockerrun –itd  -p 8080:80 nginx

docker run –itd 镜像名                     隐式运行命令 ,

                                                        例 :docker run–itd busybox

docker run –itd 镜像名 /bin/sh        显示运行命令

                                                        例 :docker run–itd busybox /bin/sh

 

 

获取容器相关信息

 

docker ps                                         显示状态为运行(Up)的容器

docker ps -a                                     显示所有容器,包括运行中(Up)的和退出的(Exited)

docker inspect                                  深入容器内部获取容器所有信息

docker logs                                       查看容器的日志(stdout/stderr)

docker events                                   得到docker服务器的实时的事件

docker port                                       显示容器的端口映射

docker top                                       显示容器的进程信息

docker diff                                       显示容器文件系统的前后变化

 

容器的退出 :

1、exit:                                 容器彻底退出

2、ctl+P, ctl+Q                          容器不会退出,只是脱离的控制台

容器进入 :

docker attach contain_id            进入到容器的正在执行的那个命令中

                                                 注:用此方法进入容器后再退出后,容器死亡

docker exec container_id           

docker exec -it busybox_id /bin/sh  如果需要交互,,与docker run类似,采用-it参数

 

 

 

容器的各种技巧:

获取Container IP地址(Container状态必须是Up)
docker inspect id | grep IPAddress | cut -d '"' -f 4
获取端口映射
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' id
获取环境变量
docker exec container_id env
杀掉所有正在运行的容器
docker kill $(docker ps -q)
删除老的(一周前创建)容器
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
删除已经停止的容器
docker rm `docker ps -a -q`
删除所有镜像,小心
docker rmi $(docker images -q)

 

二  Docker镜像制作

镜像制作基础分类 :

Dockerfile

缓存提交

 

1、 Dockerfile使用详解

1.1、Dockerfile使用思路

通过脚本构建,其流程:

1. 选择一个基础镜像

2. 在此镜像基础上执行一系列指令

3. 将每一条指令的增量变化保存为一层

4. 最后定义启动命令

1.2、Docker指令

from                            从一个基础镜像构建新的镜像

MAINTAINER              维护者信息

env                              创建环境变量,如ENV myport=abc

run                              执行任意命令并提交为一个(每执行一条命令即生成一层

add                            从主机复制文件、目录或者URL文件到镜像

copy                            类似ADD,不支持URL文件(只支持本地文件)

cmd                            容器启动后执行的命令,可被容器的参数覆盖

                                                 docker run –itdbusybox/bin/sh (/bin/bash 是容器参数)

entrypoint                   容器启动后执行的命令,不会被容器的参数覆盖

                                   run时可以通过—entrypoint=***  的方式覆盖

Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

docker创建、启动container时执行的命令,如果设置了ENTRYPOINT,则CMD将作为参数

workdir                       设置工作目录,  相当于cd

volume                        创建主机自动挂载点

expose                        指定需要暴露的端口(容器之间通信使用)

maintainer                  制作者信息

user                             设定运行容器时的用户名,影响执行指令

onbuild                       在dockerfile最后写,用于在此镜像下次被使用时执行

1.3、注意事项

1、文件命名必须是Dockerfile

2、执行命令docker build -t 新命名 dockerfile的路径

3、写Dockerfile文件时:

     不在新的容器内创建目录,使用add拷贝时会自动创建目录

      规划好拷贝文件的位置和安装文件的位置

       在Dockerfile文件的最后要指定运行命令(/bin/bash)

4、

 

 

 

三 Docker 四种网络模式

docker run 创建 Docker 容器时,可以用 --net选项指定容器的网络模式,Docker 有以下 4 种网络模式:

·        host 模式,             使用 --net=host 指定。

·        container 模式,     使用--net=container:NAMEorID 指定。

·        none 模式,           使用 --net=none 指定。

·        bridge 模式,         使用 --net=bridge 指定,默认设置

 

host 模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

例如,我们在 10.10.101.105/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用 10.10.101.105:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

例:

#docker run -it --name mybusy busybox /bin/bash           创建容器

#docker run -it--name mybusy-con --net=container: mybusy busybox /bin/bash                       指定连接的容器名称

none模式(开发人员使用)

这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

bridge模式(nat)

图:The Container World | Part 2Networking

bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 NetworkNamespace、设置 IP 等,并将一个主机上的Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)

 

 

 

3.1  网络的处理

#sudo brctl show         列出当前主机网桥

#ifconfig docker0         查看当前 docker0 ip

       在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到 docker0。每个容器都会配置同 docker0 ip 相同网段的专用 ip 地址,docker0 的 IP 地址被用于所有容器的默认网关。

#

 

 

 

四   服务连接与网络配置

1、 容器要解决的通讯问题

1) 同一台主机内下的不同容器的通讯

2) 不同主机之间的通讯(容器VLAN)

3) 不同主机下的不同容器之间的通讯

 

 

 

 

注 : Docker在启动容器时,如果不指定网络模式选项时,会创建名docker0的虚拟网桥,通过该网桥实现与宿主机之间的通信。(同一宿主机下的容器的通信也是通过docker0

1.1、       同一主机内容器间通讯-link

原理:同一台主机上的容器都通过docker0网桥彼此连接,具有同一网段的地址,默认可以直接通讯。(无法通讯只是因为不知道IP地址,--link就是解决这个问题)

方法:通过link为容器配置host静态地址

(link的原理 :将一个容器的IP地址配置到另外一个容器的host文件中)

缺点:重建容器地址变化,依赖的host地址不变。

 

使用link选项 : 指定服务端IP等讯息,直接使用

例 : docker run --name c1 ....

docker run --name c2 --link=c1 ....

           C1作为服务端,c2作为客户端,使用c2直接连接c1使用

 

1.2、       同一主机内容器间通讯-动态IP获取

原理:使用shell脚本获得IP,然后修改配置文件,或者使用-e参数送入容器

 

 

1.3、       容器间通讯-动态扫描-高级API

原理:docker服务在本质上是一个基于http的API服务,docker命令就是通过这个API执行各种任务。这个服务的端口在/var/run/docker.sock

docker inspect mysql | grep IPAddress

           "SecondaryIPAddresses": null,

           "IPAddress": "172.17.0.3",

                  

方法:在c2容器里访问该API,直接获取c1的地址.

pip install docker-py

from docker import Client

cli =Client(base_url='unix://var/run/docker.sock')

s=str(cli.inspect_container("mysql"));

jres = eval(s)

printjres["NetworkSettings"]["IPAddress"]

 

例 :使用API接口获取IP

1)制作一个tomcat镜像,内部配置python监控

2)启动mysql容器

3)启动tomcat{

       内部监控脚本:{

              1)检测mysql状态,如果mysql不可用,修改d2.jsp,报警            

2)如果mysql可用,启动tomcat,d2恢复正常

       }

}

使用简化案例:

提供了新的centos_ip:6.6镜像,内部安装支持了docker-py包

docker run -itd –name=scan_ip -v/home/happy/app:/app/scan -v /var/run/docker.sock:/var/run/docker.sock centos_ip:6.6/bin/bash

docker exec scan_ip python /app/ip.py

 

 

 

1.4、       容器配置固定IP

原理:为docker服务定义新的桥,并使用pipwork分配固定地址

方法:

1)创建新的自定义网桥

2)启动容器 --net=none

3)使用pipework分配地址

缺点:pipework分配的地址在容器重启后丢失

解决:用脚本启动容器

 

例 : docker  run –itd –net=none –name box busybox

 

 

 

1.5、为容器的宿主机配置宿主网段固定IP

原理:为docker服务定义新的桥,并使用pipwork分配固定地址,并将物理网卡加入到该网桥

方法:

1)创建新的自定义网桥

2)将主机地址分配到该网桥

3)添加主机物理网卡到该网桥,并删除其IP地址

4)启动容器 --net=none

5)使用pipework分配地址

缺点:在迁移主机IP地址的时候,会出现物理断网的情况,远程操作慎重!

解决:用脚本进行上述操作,保证IP迁移成功

 

 

1.6、不同宿主机间的容器通讯

原理:端口映射+主机地址

方法:直接通讯

 

 

 

1.7、容器VLAN

目标:通过VLAN,隔离容器间的通讯

原理:ovs-vsctl

例:ovs-vsctl add-br ovs0

ip addr add 10.10.101.105/24 dev ovs0

ip addr del 10.10.101.105/24 dev eth0

ovs-vsctl add-port ovs0 eth0

ip route add default gw 10.10.101.254 

 

启动容器后:

pipework ovs0 test1 192.168.0.1/24 @100

pipework ovs0 test2 192.168.0.2/24 @200

pipework ovs0 test1 192.168.0.3/24 @100

pipework ovs0 test2 192.168.0.4/24 @200

地址随意分配在192.168.0段,@后面是分组名称

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

四   容器物理资源管理

1、 容器对CPU的竞争

原理:docker对CPU的消耗控制是相对的

docker提供了--cpu-shares参数,在创建容器时指定容器所使用的CPU份额值。默认情况下,每个docker容器的cpu份额都是1024。cgroups只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。

 

cpu-shares的值不能保证可以获得1个vcpu或者多少GHz的CPU资源,仅仅只是一个弹性的加权值。

 

使用示例:

docker run -itd --cpu-shares=1024 -v/home/happy:/happy --name=c1 centos:6.6 /bin/bash

docker run -itd --cpu-shares=2048 -v/home/happy:/happy --name=c3 centos:6.6 /bin/bash

使用命令docker run -tid –cpu-shares 100ubuntu:stress,创建容器,则最终生成的cgroup的cpu份额配置可以下面的文件中找到:

root@ubuntu:~# cat/sys/fs/cgroup/cpu/docker/<容器的完整长ID>/cpu.shares

100

 

 

 

2、 容器资源管理-内存

原理:docker对内存的消耗控制是绝对的

可为容器指定一个基础内存,容器使用时会用swap来填补内存的不足,具体的“总内存”大小需要利用压力测试来获得。

方法:

docker run -itd -m 1000m  --name=t1 tomcat  /bin/bash 指定使用的物理内存大小

压力测试 :

docker exec t1 java -Xms2000m -Xmx2000m –version

docker exec t1 java –Xms4000m –Xmx4000m-version

不断的更改指定内存的大小,以找到临界报错的值,那就是最大内存,最大内存与最开始指定的物理内存有关系。

 

3、 容器资源管理-磁盘限额

原理:Docker默认为每个容器分配10GB的空间,能做的唯一的事情就是改变新容器的默认值--storage-opt来实现,修改/etc/sysconf/docker: 

--storage-optdm.basesize=5G

 

 

 

 

 

 

 

五  私有仓库

1、 私有仓库:部署

原理:Registry镜像,利用dockerAPI工作

方法:启动Registry镜像,挂载仓库存放目录

docker镜像的命名规则:

              URL/路径/名称:版本号  

  例:  192.168.2.11:5000/csphere/csphere:0.9.1

例 : docker run-d -p 5000:5000 -v /home/happy/docker_repo:/tmp/registry

测试: curllocalhost:5000/v1/search

 

2、 私有仓库:使用

原理:仓库默认采用SSL通讯,为简单使用,禁止掉SSL

方法:修改/etc/sysconfig/docker

other_args="—insecure-registry=192.168.4.100:5000"

重启服务:service docker restart

push 镜像:

dockertag centos:6.6 192.168.4.100:5000/centos66                                    黄色部分为Registry容器IP+端口的镜像名(必须如此命名)

dockerpush 192.168.4.100:5000/centos66

pull 镜像:

dockerpush 192.168.4.100:5000/centos66

 

 

 

 

 

六  最佳实践

1、docker的规范化启动(同时启动多个容器)

使用yml文件进行规范化启动

例: docker-compose.yml

运行 : docker-compose up -d

停止 : docker-compose stop

删除 : docker-compose rm

查看 : docker-compose ps       (查看通过compose启动的)

 

容器的自动命名规则: 某个目录下执行的,相对路径作为前缀,名称是:前缀_容器名_1

                          

 

 

 

 

 

 

3、     docker的持续集成

docker run -d -p 8080:8080 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docer.sock:/var/run/docker.sock -v /root/maven/:/root -v $(which git):/usr/bin/git  Jenkins

通过挂载docker的目录和git目录,使jenkins容器能够使用docker命令和git

七、docker监控

思路 :

设置SMTP服务器

设置报警联系人

创建报警策略

 

操作 :

1、 安装csphere-con

curl -SsL -o /tmp/csphere-install.sh https://csphere.cn/static/csphere-install-v2.sh

sudo env ROLE=controller CSPHERE_VERSION=1.0.1 /bin/sh /tmp/csphere-install.sh

 

 
 

 

 

 

 

 


安装csphere-agent

curl -SsL -o /tmp/csphere-install.sh https://csphere.cn/static/csphere-install-v2.sh
sudo env ROLE=agent CONTROLLER_IP=192.168.2.11 CONTROLLER_PORT=1016 CSPHERE_VERSION=1.0.0 AUTH_KEY=d5811ac4fb66b5d1968f7eca38c9f66f7f5ae4c5bffc837af695c7b78b9ac93a522a708457bc047b SVRPOOLID=5a719acfa69ca9000c000007 /bin/sh /tmp/csphere-install.sh

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值