paas:平台即服务html
docker三个重要概念:仓库、镜像、容器java
docker安装:前提:关闭selinux,关闭firewalld,启动iptables服务;建议:选择统一版本(此处示例为17.03.0)
官方下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/mysql
# yum update -y # iptables -F && service iptables save 一、脚本安装方式 # curl -sSL https://get.docker.com/ | sh 二、yum源安装方式 # yum install -y yum-utils && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 三、rpm安装方式(推荐 ) # yum install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm -y # systemctl start docker && systemctl enable docker # docker run hello-world 测试调试
使用阿里云docker镜像加速:控制台-容器镜像服务-镜像加速器linux
# chmod +x /etc/systemd/system/docker.service vim /etc/systemd/system/docker.service 添加以下代码进行加速 ExecStart=/usr/bin/dockerd --registry-mirror=https://azvsxtuu.mirror.aliyuncs.com systemctl daemon-reload sudo systemctl restart docker ps aux | grep docker 验证是否加速成功 docker经常使用命令:除了单条使用外,还支持赋值、解析变量、嵌套使用。 --help 查看帮助信息 -q 只显示容器ID号 --no-trunc 查看详细信息 info 守护进程的系统资源设置 search docker仓库的查询 pull docker仓库的下载 images docker镜像的查询 rmi docker镜像的删除 ps 容器的查询 run 容器的建立启动 stats 查看容器所占的系统资源 start | stop (启动 | 中止) 容器 inspect 查看容器对象的信息 exec 容器名 容器内执行的命令 :容器执行命令(返回结果) exec -it 容器名 /bin/bash :登入容器的bash(交互式) tag 镜像名:版本号 仓库地址/镜像名:版本号 :修改镜像标签 如下为run命令的延伸: run --restart=always 容器自动随docker启动 run -h 主机名 :设置容器主机名 run --add-host hostname:ip :在/etc/hosts注入主机名解析 run --rm :容器中止时自动删除 嵌套例子:docker rm -f $(docker ps -a -q) 强制删除全部容器
例子:docker run --name tomcat -p 80:8080 -d 仓库地址/仓库名/镜像名:版本号nginx
docker-compose容器编排工具:容许用户在一个模板(yaml格式)中定义一组相关联的容器,会根据--link等参数对启动的优先级进行排序。
下载地址:https://docs.docker.com/compose/install/
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version 验证版本信息git
docker-compose经常使用命令: --help 查看帮助信息 -f 指定使用的yaml文件位置 ps 查看全部容器信息 logs 查看日志信息 up -d 第一次启动容器项目 config -q 验证yaml配置文件是否正确 start | stop | restart | pause | unpause | rm (启动 | 中止 | 重启 | 暂停 | 恢复 | 删除)容器
容器建立时须要制定镜像,每一个镜像都由惟一的标识image id,和容器的container id 同样,默认128位,可使用前16为缩略形式,也可使用镜像名和版本号两部分组合成惟一标识,若是省略版本号,默认使用最新版本标签(latest)
镜像的分层:docker的镜像经过联合文件系统(union filesystem)将各层文件系统叠加在一块儿,特色:一、已有的分层只能读不能修改。二、上层镜像优先级大于底层镜像。三、镜像必须须要至少一个工做在前台的守护进程。四、最大不超过128层。github
镜像 》 容器
docker run 镜像idsql
容器 》 镜像
docker commit 容器ID 镜像名:版本号 docker
dockerfile是一种被docker程序解释的脚本,由一条一条的指令组成,相似于linux下的命令,根据指令生成特定的镜像。指令最多不超过128行。
dockerfile 》 镜像
docker build -t 镜像名:版本号 .数据库
常见语法:
一、FROM (指定基础镜像),有且只有一个。
example: FROM centos:7.2
二、MAINTAINER (用来指定镜像建立者信息)
example: FROM lewis "a@163.com"
三、RUN (安装软件用)
example: RUN cd /tmp && wget 1.tar.gz | tar -xz
四、CMD (设置容器启动时执行的操做),该命令只能在文件中存在一次,若是有多个,则只执行最后一个。
example:CMD echo "hello,world"
五、ENTRYPOINT (设置容器启动时执行的操做),该指令的使用分为两种状况:
一、独自使用,跟CMD一块儿的话,只生效按位置自上而下执行最后一个CMD或者ENTRYPOINT
example: 此处执行结果为显示456
CMD echo "123"
ENTRYPOINT echo "456"
二、配合CMD使用
example:此处执行为 ls -l
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
六、USER (设置启动容器的用户),默认为root用户
example: USER daemon = ENTRYPOINT ["memcached","-u","daemon"]
七、EXPOSE (显示容器须要映射的端口,仅显示提醒用途)
example: EXPOSE 22
八、ENV (设置环境变量)
example: ENV JAVA_HOME /path/to/java/dir
九、ADD (从src复制文件到容器内的dest路径),默认解压
example: ADD <src> <desc>
<src>:是相对被构建的源目录的相对路径,可使文件或目录的路径,也能够是一个远程的文件url
<desc>:是容器内的绝对路径
十、COPY (从src复制文件到容器内的dest路径),区别于ADD,默认不解压,且不支持url。
十一、VOLUME (指定挂载点)
example: VOLUME ["/tmp/data"]
十二、WORKDIR (切换目录,相似cd命令)
example: WORKDIR /tmp WORKDIR data RUN vim a.txt 等同于 RUN cd /tmp/data && vim a.txt
1三、ONBUILD (在子镜像中执行),ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
example: ONBUILD ADD . /app/src
docker官方镜像仓库:https://hub.docker.com
第三方镜像仓库:
网易云:https://c.163yun.com/hub
阿里云: https://dev.aliyun.com/search.html
构建docker仓库
一、官方仓库构建,缺少认证
docker服务器配置:
{
"insecure-registries": ["192.168.40.128:5000"]
}
上传镜像到自建仓库,其格式为:仓库地址/用户名/镜像名:版本号
查看自建仓库的镜像
客户端使用自建仓库的设置:
{
"insecure-registries": ["192.168.40.128:5000"]
}
二、harbor仓库构建
官方网站 :https://goharbor.io
harbor组件介绍:
一、proxy:由nginx服务器构成的反向代理
二、registry:由docker官方的开源registry镜像构成的容器实例
三、ui:即架构中的core services,构成此容器的代码是harbor项目的主体
四、mysql:由官方mysql镜像构成的数据库容器
五、log:运行着rsyslogd的容器,经过log-driver的形式收集其余容器的日志
一、首先下载软件安装包,并进行解压,此处示例版本为1.2.0,下载地址:http://harbor.orientsoft.cn/harbor-1.2.0/harbor-offline-installer-v1.2.0.tgz
二、建立https证书以及配置相关目录权限
生成证书私钥
建立证书请求
因为在容器内没法输入认证密码,所以密钥需回退
签署证书请求并生成证书公钥
配置文件并运行脚本安装harbor
hostname = hub.51dlx.com
ui_url_protocol = https
db_password = admin123
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
harbor_admin_password = admin123
三、上传镜像进行测试
{
"insecure-registries":["hub.51dlx.com"]
}
下载测试镜像
给镜像从新打标签
登陆进行上传
docker网络管理:
一、容器之间通信:经过docker0网桥
二、容器访问外部:经过主机snat
三、外部访问容器:经过主机dnat
docker映射到主机端口
-p hostip:hostport:containerport
-p hostport:containerport
容器端口映射状况查看
docker port containerid
--net用于指定容器的网络通信方式,有以下4种
bridge:默认方式,网桥模式
none:无网卡模式
container:使用其余容器的网络栈
host:使用host的网络
--network用于指定使用特定的网桥
修改默认docker0网桥的网络参数
{
"bip":"192.168.90.5/24", 指定docker0网桥的ip地址
"fix-cidr":"192.168.90.0/24", 限制ip地址的分配范围
"mtu":"1500", 最大传输单元
"default-gateway":"192.168.90.1", 默认网关
"dns":"114.114.114.114" dns服务器地址
}
docker网络隔离
网络类型分类:
一、overlay network 覆盖性网络,用于不一样主机间容器相互通讯
二、bridge network 网桥网络
docker常见网络隔离方式:
一、容器之间使用不一样的网络名称空间,实现容器间的网络隔离
二、不一样主机的容器以前实现通讯(此处示例为经过给容器赋予外网IP进行通信)
(1)、宿主机建立网桥br0
BOOTPROTO=static BRIDGE=br0
TYPE=Bridge BOOTPROTO=static DEVICE=br0 ONBOOT=yes IPADDR=192.168.40.128 NETMASK=255.255.255.0 GATEWAY=192.168.40.2 DNS=114.114.114.114
(2)、安装pipework工具
(3)、启动容器并经过pipework设置ip
docker数据存储
1、数据卷特性
dokcer镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部添加一个读写层(写时复制机制)
存在的问题:
一、存在于联合文件系统中,不易于宿主机访问
二、容器间数据共享不方便
三、删除容器会致使数据丢失
解决方案:卷,是容器上的一个或多个“目录”,此类目录可绕过联合文件系统(ufs),与宿主机上的某目录“绑定”。
2、容器中的数据卷
一、镜像自带管理卷
即在制做镜像的时候,在dockerfile添加“volume 容器内的须要映射的路径”,这样镜像转变成容器会自动将路径映射给宿主机的/var/lib/docker/volume/下的随机字符串目中。在删除容器里,如须要同时永久删除该卷资料,-v便可
二、容器启动时手动绑定卷,优先级高于自带管理卷。
docker run --name tomcat1 -d -v HOSTDIR:VOLUMEDIR tomcat 将宿主机的目录映射给容器的目录
三、借用自带管理卷,实现容器间目录共享。
docker run --name tomcat2 -d --volumes-from tomcat1 tomcat 容器tomcat2将绑定容器tomcat1的自带管理卷
3、存储驱动
一、device mapper(DM):性能和稳定性存在问题,不推荐生产环境使用
二、brtfs:社区实现了brtfs driver,稳定性和性能存在问题
三、overlayfs:内核3.18 overlayfs进入主线,性能稳定性优异,第一选择。
修改存储驱动类型为overlay:
ExecStart=/usr/bin/dockerd --storage-driver=overlay
docker的资源限制(经过cgroup技术即control groups):默认状况下,容器对宿主机的资源占用没有任何限制。
1、内存资源限制
OOME:out of memory exception;docker调整了docker daemon的OOME优先级,避免给内核关闭。
所以在生产环境中,必须对容器作如下验证:
一、为应用作内存压力测试,理解正常业务需求下试用的内存状况,而后才能进入生产环境使用。
二、必定要限制容器的内存使用上限。
三、尽可能保证主机的资源充足,一旦经过监控发现资源不足,就进行扩容或者对容器进行迁移。
四、若是能够(内存资源充足的状况),尽可能不要使用swap,swap的使用会致使内存计算复杂,对调度器很是不友好。
docker启动参数中,关于内存的常见参数:
-m|--memory :设置容器可用物理内存的最大值。最小值为4m
--memory-swap :设置容器可用的总空间,0和unset表明容器swap为2倍的容器物理内存。-1表明为容器swap为宿主机的全部可用swap。
--memory-reservation:设置容器可用内存的最小值。
--kernel-memory:设置容器的内核可以使用的内存大小,最小值为4m
2、CPU资源限制
限制方式:
一、有多个cpu密集型的容器竞争cpu时,设置各个容器能使用的cpu时间相对比例
二、以绝对的方式设置容器在每一个调度周期内最多能使用的cpu时间
docker启动参数中,关于CPU的常见参数:
--cpuset-cpus 容许使用的cpu集
-c|--cpu-shares cpu共享权值(相对权重),默认值1024
--cpuset-mems 容许在上执行的内存节点(MEMs)
--cpu-period 设置调度周期,数值范围为1000-1000000,单位:微秒
--cpu-quota 设置在每一个调度周期内容器可以使用的cpu时间,单位:微秒
--cpus="" 设置容器可以使用宿主机cpu个数
3、限制实验
docker远程链接访问
修改/etc/docker/daemon.json文件
"hosts":["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
远程访问# docker -H ip:port command