docker
docker
docker
docker 镜像 https://hub.docker.com/
lxc+cgroups=docker
![docker docker](./images/1562571159082.png)
About Docker Images
- Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器
- 采用分层构建机制,最底层为bootfs,其之为rootfs
- bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源;
- rootfs:位于bootfs之上,表现为docker容器的根文件系统;
- 传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式;
- docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层;
Docker Image Layer
- 位于下层的镜像称为父镜像(parentimage),最底层的称为基础镜像(base image)
- 最上层为“可读写”层,其下的均为“只读”层
Aufs
- advanced multi layered unification filesystem:高级多层统一文件系统
- 用于为Linux文件系统实现“联合挂载”
- aufs是之前的UnionFS的重新实现,2006年由Junjiro okajima开发;
- Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持;
- aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核
- docker的分层镜像,除了aufs,docker还支持btrfs,devicemapper和vfs等
- 在Ubuntu系统下,docker默认Ubuntu的 aufs;而在CentOS7上,用的是devicemapper;
Devicemapper
- Device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
- 在内核中它通过一个一个模块化的target driver插件实现对IO请求的过滤或者重新定向等工作,当前已经实现的target driver 插件包括软raid、软加密、逻辑卷条带、多路径、镜像、快照等
- 图中linear、mirror、snapshot、multipath表示的就是这些target driver
- 在这诸多“插件”中,有一种叫Thin Provisioning Snapshot,Docker正是使用了Thin Provisioning的Snapshot的技术实现了类
Docker Registry
- 启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地;
- The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.
Docker Registry 分类
- Registry用于保存docker镜像,包括镜像的层次结构和元数据
- 用户可自建Registry,也可使用官方的Docker Hub
- 分类
- Sponsor Registry:第三方的registry,供客户和Docker社区使用
- Mirror Registry:第三方的registry,只让客户使用
- Vpndor Registry:由发布Docker镜像的供应商提供的registry
- Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry
Registry(repository and index)
- Repository由某特定的docker镜像的所有迭代版本组成的镜像的组合
- 一个Registry中可以存在多个Repository
- Repository可分为“顶层仓库”和“用户仓库”
- 用户仓库名称格式为“用户名/仓库名”
- 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
- Index
- 维护用户帐户、镜像的校验以及公共命名空间的信息
- 相当于为Registry提供了一个完成用户认证等功能的检索接口
Docker Registry
- Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境;
安装
yum install docker -y
启动服务
systemctl start docker
查看网卡
ifconfig docker0
iptables自动生成规则
iptables -t nat -vnL
搜索镜像
docker search centos
去仓库下载指定镜像
docker pull centos:7.5.1804
查看本地镜像
docker images
加载镜像
[root@Final ~]# docker run --name c1 -it centos:7.5.1804 /bin/bash
[root@2a203986df41 /]#
ctrl+p+a ctrl+a+q
查看当前镜像状态
docker ps -a
停止镜像
docker stop id|name
docker stop c1
启动容器
docker run IMAGE[COMMAND][ARG.…]
run 在新容器中执行命令
docker run centos:7.5.1804 echo 'Hello World'
启动交互式容器
docker run -i -t IMAGE /bin/bash
-i --interactive=ture | fasle 默认是false
t --tty=true | false 默认是false
docker run -it centos:7.5.1804 /bin/bash
查看容器
docker ps [-a][-l]
docker inspect ID
自定义窗口名
docker run --name=自定义名 -i -t IMAGE /bin/bash
docker run --name c1 -it centos:7.5.1804 /bin/bash
重新启动停止的容器
docker start [-i] 容器名
删除停止的容器
docker rm 容器名
以守护形式运行容器
docker run -it IMAGE /bin/bash
Ctrl+P Ctrl+Q
docker run --name c1 -it centos:7.5.1804 /bin/bash
Ctrl+P Ctrl+Q
docker ps -a
打开已(附加到)运行中的容器
docker attach 容器名
docker attach c1
启动守护式容器
docker run -d 镜像名 [COMMAND] [ARG..]
docker run --name c1 -d centos /bin/sh -c "while true; do echo hello world; sleep 1;done"
docker ps
查看容器日志
docker logs[-f][-t][--tail]容器名
-f --follows=true | false 默认为false
-t -timestamps=true | false默认为false
--tail=“all”
docker logs c1 -t
docker logs c1 -f
docker logs c1 -tf --tail 10
docker logs c1 -tf --tail 0
查看容器内进程
docker top 容器名
docker top c1
在运行中的容器内启动新进程
docker exec[-d][-i][-t]容器名[COMMAND][ARG..…]
docker exec -it c1 /bin/bash
Ctrl+P Ctrl+Q
docker top c1
停止守护式容器
docker stop 容器名
docker kill 容器名
docker stop c1
docker kill c1
docker ps -a
查看和删除镜像
镜像的存储位置 /var/lib/docker
docker images [OPTSIONS] [REPOSITORY]
-a,-all=false
-f,-filter=[]
--no-trunc=false
-q,-quiet=false
列出镜像
docker images 列出当前已经安装的镜像
docker images --no-trunc 查看完整的IMAGE ID
docker images -a 列出所有的镜像
docker images -q 列出所有的IMAGE ID
docker images centos 列出对应名字的所有镜像
镜像标签和仓库
REPOSITORY 仓库
REGISTRY 仓库
TAG
查看镜像
docker inspect [OPTIONS] CONTAINERIMAGE [CONTAINERIIMAGE.…]
docker inspect centos:7.5.1804
删除镜像
docker rmi [ OPTIONS] IMAGE [ IMAGE..]
-f,-force=false Force removal of the image
--no-prune=false Do not delete untagged parents
docker images
docker rmi centos:7.5.1804
docker rmi ID 删除此ID所有对应的标签和镜像
docker rmi centos:1 centos2 删除多个镜像
docker rmi $(docker imges -q centos) 删除所有的镜像
镜像标签和仓库
docker tag IMAGESID 用户名/仓库名:标签名
docker tag ID finald/centos:v1
docker tag finald/centos:v1 finald/centos:v2
获取和推送镜像
查找镜像
方法1:Docker Hub https://registry.hub.docker.com
方法2:
docker search[OPTIONS]TERM
-automated=false Only show automated builds
-no-trunc=false Don't truncate output
-s,-stars=0 Only displays with at leastx stars最多返回25个结果
拉取镜像
使用--registry-mirror 选项
1.修改:/etc/default/docker
2.添加:DOCKER_OPTS=“-registry-mirror=http://MIRROR-ADDR”
https://www.daocloud.io 加速地址获取
docker images -a
docker search centos
docker pull centos 安装镜像
推送镜像
docker push NAME:TAG]
用户名去https://hub.docker.com/注册
docker push 用户名/仓库名:标签
docker push finald/centos
构建镜像
docker commit 通过容器构建
docker build 通过Dockerfile文件构建
使用commit构建镜像
docker commit [ OPTIONS] CONTAINER [ REPOSITORY[: TAG]]
-a,-author=""Author e.g,"John Hannibal Smith hannibal@a-team. com"
-m,-message=""Commit message
-p,-pause=true Pause container during commit
docker -run -it -p 80 -name c1 centos /bin/bash
yum install vim net-tools nginx -y
nginx
使用Dockerfile构建镜像
docker build [OPTIONS] PATH |URL|-
-force-rm=false-no-cache=false
--pull=false
-q,-quiet=false
--rm=true
-t,-tag=""
vim finald/dockerfile1
#First DockerfileFROM centos
MAINTAINER dormancypress "438803792@qq.com"
RUN yum install -y vim net-tools
RUN yum install -y nginx
EXPOSE 80
docker build -t='dockerfile1'
docker run -d -name nginx1 -p 80 finald/dockerfile1 nginx -g "daemon off;"
docker的c/s模式
Remote API
Docker官方的Remote API Reference:
https://docs.docker.com/reference/api/docker_remote_api/
连接方式
docker守护进程的配置和操作
systemctl status docker
systemctl start docker
systemctl stop docker
systemctl restart docker
docker 启动选项
- 运行相关:
-D,-debug=false
-e,-exec-driver="native"
-g,-graph="/var/lib/docker"
-icc=true
1,-log-level="info"
-label=]
-p,-pidfile="/var/run/docker.pid"
- Docker服务器连接相关:
-G,-group="docker"
-H,-host=]-tls=false
-tlscacert="/home/sven/.docker/ca.pem"-tlscert="/home/sven/.docker/cert.pem"
-tlskey="/home/sven/.docker/key.pem"
-tlsverify=false
- RemotAPI相关:
-api-enable-cors=false
- 存储相关:
-s,-storage-driver=""
-selinux-enabled=false
-storage-opt=[]
- Registry相关:
-insecure-registry=[]
-registry-mirror=[]
- 网络设置相关:
-b,-bridge=""
-bip=""
-fixed-cidr=""
-fixed-cidr-v6=""
-dns=[]
-dns-search=[]
-ip=0.0.0.0
-ip-forward=true
-ip-masq=true
-iptables=true
-ipv6=false
--mtu=0
/usr/lib/systemd/system/docker.service
docker 配置文件 /etc/sysconfig/docker
docker远程访问
环境准备
2台docker服务器
修改docker守护进程启动选项,区别服务器
保护Client api与server api版本一下致
docker version
vim /etc/sysconfig/docker
DOCKER_OPTS=' Label name=docker_server_1 tcp://0.0.0.0.2375 unix:///var/run/docker.sock'
docker info
docker version
vim /etc/sysconfig/docker
DOCKER_OPTS=' Label name=docker_server_2 tcp://0.0.0.0.2375 unix:///var/run/docker.sock'
docker info
修改服务器端配置
修改Docker守护进程启动选项
-H tcp://host:port
unix://∥path/to/socket,
fd://* or fd://socketfd
守护进程默认配置:
-H unix:///var/run/docker.sock
修改客户端配置
使用Docker客户端命令选项
-H tcp://host:port
unix://∥path/to/socket
fd:// * or fd://socketfd
客户端默认配置:
-H unix:///var/run/docker.sock
docker -H tcp://192.168.10.254:2375
使用环境变量DOCKER_HOST
export DOCKER_HOST="tcp://192.168.10.254:2375"
docker info
export DOCKER_HOST=''
docker info
Dockerfile指令
FROM <image>
FROM <image>:<tag>
已经存在的镜像
基础镜像
必须是第一条非注释指令
MAINTAINER <name>
指定镜像的作者信息,包含镜像的所有者和联系信息
指定当前镜像中运行的命令
RUN <command>(shell 模式)
RUN[“executable”,“param1”,“param2”](exec模式)
RUN <command>(shell模式)
/bin/sh-c command
RUN echo hello
RUN[“executable”,“param1”,“param2”](exec模式)RUN["/bin/bash","-c","echo hello"]
EXPOSE <port>[<port>.…]
$docker run-p 80 -d finald/df_test1 nginx -g "daemon off;;"
CMD [“executable”,“param1”,“param2”](exec模式)
CMD command param1 param2(shell 模式)
ENTRYPOINT[“executable”,“param1",“param2”](exec模式)ENTRYPOINT command param1 param2(shell模式)
ADD <src>...<dest>
ADD["<src>".."<dest>"](适用于文件路径中有空格的情况)
COPY <src>..…<dest>
COPY[“<src>”.…“<dest>”](适用于文件路径中有空格的情况)
VOLUME["/data"]
WORKDIR /path/to/workdir
WORKDIR /a
WORKDIR b
WORKDIR C
RUN pwd
ENV <key><value>
ENV <key>=<value>..…
USER daemon
USER nginx
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
ONBUILD INSTRUCTION]
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
dockerfile构建过程
1.从基础镜像运行一个容器
2.执行一条指令,对容器做出修改
3.执行类似docker commit的操作,提交一个新的镜像层
4.再基于刚提交的镜像运行一个新容器
5.执行Dockerfile中的下一条指令,直至所有指令执行完毕
查看镜像构建的过程
$docker history[image]
docker 网络基础
Linux虚拟网桥的特点:
- 可以设置IP地址
- 相当于拥有一个隐藏的虚拟网卡
添加虚拟网桥
brctl addbr br0
ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守护进程的启动配置:
/etc/default/docker 中添加DOCKER_OPS值
-b=br0
docker容器的互联
允许所有容器互联
-link
$docker run--link=[CONTAINER_NAME]:[ALIAS][IMAGE][COMMOND]
拒绝容器间互联
Docker守护进程的启动选项
-icc=false
允许特定容器间的连接
Docker守护进程的启动选项
-icc=false--iptables=true
-link
Docker容器与外部网络的连接
ip_forward
-ip-forward=true
$sysctl net.ipv4.conf.all.forwarding
iptables
什么是iptables Iptabels是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含lptables的功能。
允许端口映射访问
限制IP访问容器
docker容器的数据管理
Docker容器的数据卷
什么是数据卷(Data Volume)
- 卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问。
- 据卷设计的目的,在于数据的永久化,它完全独立与容器的生存周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理。
数据卷(Data Volume)的特点
- 据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
- 数据卷可以在容器之间共享和重用
- 对数据卷里的内容直接进行修改
- 卷的变化不会影响镜像的更新
- 一直存在,即使挂载数据卷的容器已经被删除
为容器添加数据卷
$sudo docker run -v /container_data:/data -it ubuntu/bin/bash
为数据卷添加访问权限
$sudo docker run -v /datavolume:/data:ro -it ubuntu/bin/bash
使用Dockerfile构建包含数据卷的镜像
Dockerfile指令:
VOLUME["/data"]
Docker的数据卷容器
什么是数据卷容器:
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器
挂载数据卷容器的方法
Sdocker run-volumes-from[CONTAINER NAME]
Docker数据卷的备份和还原
![docker docker](./images/1562825517441.png)
数据备份方法
docker run --volumes-from[container name]-v S(pwd):/backup ubuntu
tar cvf /backup/backup.tar [container data volume]
数据还原方法
docker run --volumes-from[container name]-v $(pwd):/backup ubuntu
tar xvf /backup/backup.tar[container data volume]
docker 容器的跨主机连接
使用网桥实现跨主机容器连接
![docker docker](./images/1562825639357.png)
yum install bridge-utils
/etc/network/interfaces
auto br0
iface br0 inet static address 10.211.55.3
netmask 255.255.255.0
gateway 10.211.55.1
bridge_ports eth0
修改配置文件
/etc/default/docker
-b指定使用自定义网桥
-b=br0
-fixed-cidr限制ip地址分配范围
Host1:10.211.55.64/26
地址范围:10.211.55.65~10.211.55.126
Host2:192.168.59.128/26
地址范围:10.211.55.129~10.211.55.190
优点:
配置简单,不依赖第三方软件
缺点:
与主机在同网段,需要小心划分IP地址需要有网段控制权,在生产环境中不易实现不容易管理兼容性不佳
使用Open vSwitch实现跨主机容器连接
Open vSwitch是什么?
Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag)
什么是GRE隧道?
GRE:通用路由协议封装
隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装的负载数据。
安装Open vSwitch:
apt-get install openvswitch-switch
安装网桥管理工具:
apt-get install bridge-utils
操作步骤
建立ovs网桥
添加gre连接
配置docker容器虚拟网桥
为虚拟网桥添加ovs接口
添加不同Docker容器网段路由
使用weave实现跨主机容器连接
weave是什么?
语义:编织
建立一个虚拟的网络,用于将运行在不同主机的Docker容器连接起来http://weave.works https://github.com/weaveworks/weave#readme
操作步骤
安装weave
启动weave
weave launch
连接不同主机
通过weave 启动容器
注:此笔记部分为摘录