关于版本
版本概述
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。而在此之前CentOS官方自带的版本是这样的:
社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。
版本比较
防火墙
关闭firewall1
2systemctl stop firewalld.service
systemctl disable firewalld.service
安装
1 | yum remove docker \ |
使用普通用户
1、 首先创建docker用户组,如果docker用户组存在可以忽略
1
sudo groupadd docker
2、把用户添加进docker组中
1
sudo gpasswd -a ${USER} docker
3、重启docker
1
sudo service docker restart
4、如果普通用户执行docker命令,如果提示
get …… dial unix /var/run/docker.sock
权限不够,则修改/var/run/docker.sock
权限
使用root用户执行如下命令,即可1
sudo chmod a+rw /var/run/docker.sock
配置仓库
18.03
1 | vim /etc/systemd/system/multi-user.target.wants/docker.service |
19.03
修改daemon.json1
2vim docker/daemon.json
{"insecure-registries":["192.168.1.232:5000"]}
这样就可以使用自己的镜像仓库啦。如果没有配置这些,会提示1
Get https://192.168.1.232:5000/v1/users/: http: server gave HTTP response to HTTPS client
镜像示例
1 | FROM 10.110.1.18:5000/base/jdk:1.8.0 |
1 | -Xms2g -Xmx2g -Xmn512m -XX:PermSize=128M -XX:MaxPermSize=128m -XX:SurvivorRatio=6 |
1 | -Xms:java Heap初始大小, 默认是物理内存的1/64。 |
镜像库
基本命令
1 | docker search centos # 查找源中镜像 |
配置
进入容器脚本
1 |
|
使用的时候直接 脚本+容器ID。
文件互传
文件传输1
2docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt
优化
精简Docker镜像尺寸的好处:
- 减少构建时间
- 减少磁盘使用量
- 减少下载时间
- 因为包含文件少,攻击面减小,提高了安全性
- 提高部署速度
镜像优化
优化基础镜像
推荐使用alpine/busybox,实在不行就只能用CentOS了。
串联 Dockerfile 指令
大家在定义Dockerfile时,如果太多的使用RUN指令,经常会导致镜像有特别多的层,镜像很臃肿,而且甚至会碰到超出最大层数(127层)限制的问题,遵循 Dockerfile 最佳实践,我们应该把多个命令串联合并为一个 RUN(通过运算符&&和/ 来实现),每一个 RUN 要精心设计,确保安装构建最后进行清理,这样才可以降低镜像体积,以及最大化的利用构建缓存。
将多条RUN命令串联起来构建的镜像大小是每条命令分别RUN的三分之一。
使用多阶段构建
Dockerfile中每条指令都会为镜像增加一个镜像层,并且你需要在移动到下一个镜像层之前清理不需要的组件。实际上,有一个Dockerfile用于开发(其中包含构建应用程序所需的所有内容)以及一个用于生产的瘦客户端,它只包含你的应用程序以及运行它所需的内容。这被称为“建造者模式”。Docker 17.05.0-ce版本以后支持多阶段构建。使用多阶段构建,你可以在Dockerfile中使用多个FROM语句,每条FROM指令可以使用不同的基础镜像,这样您可以选择性地将服务组件从一个阶段COPY到另一个阶段,在最终镜像中只保留需要的内容。
下面是一个使用COPY –from 和 FROM … AS … 的Dockerfile:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# Compile
FROM golang:1.9.0 AS builder
WORKDIR /go/src/v9.git...com/.../k8s-monitor
COPY . .
WORKDIR /go/src/v9.git...com/.../k8s-monitor
RUN make build
RUN mv k8s-monitor /root
# Package
# Use scratch image
FROM scratch
WORKDIR /root/
COPY --from=builder /root .
EXPOSE 8080
CMD ["/root/k8s-monitor"]
构建镜像,你会发现生成的镜像只有上面COPY 指令指定的内容,镜像大小只有2M。这样在以前使用两个Dockerfile(一个Dockerfile用于开发和一个用于生产的瘦客户端),现在使用多阶段构建就可以搞定。
修改docker0
在此文件中添加如下一行,然后重启服务。1
2
3
4
5vim /etc/docker/daemon.json
{
"bip": "192.168.102.1/24"
}
systemctl restart docker
构建业务服务镜像技巧
- 不变或者变化很少的体积较大的依赖库和经常修改的自有代码分开;
- 因为cache缓存在运行Docker build命令的本地机器上,建议固定使用某台机器来进行Docker build,以便利用cache。
其他优化技巧
如果在RUN命令中执行apt、apk或者yum类工具,可以借助这些工具提供的一些小技巧来减少镜像层数量及镜像大小。举几个例子:
(1)在执行apt-get install -y
时增加选项— no-install-recommends
,可以不用安装建议性(非必须)的依赖,也可以在执行apk add
时添加选项--no-cache
达到同样效果;
(2)执行yum install -y 时候, 可以同时安装多个工具,比如yum install -y gcc gcc-c++ make …
。将所有yum install
任务放在一条RUN命令上执行,从而减少镜像层的数量;
(3)组件的安装和清理要串联在一条指令里面,如apk --update add php7 && rm -rf /var/cache/apk/*
,因为Dockerfile的每条指令都会产生一个文件层,如果将apk add …
和rm -rf …
命令分开,清理无法减小apk命令产生的文件层的大小。清理镜像中缓存文件;CentOS等系统使用yum clean all 命令清理。
安全
疑难杂症
1、docker dead 无法删除
1、检查挂载信息
1
grep docker /proc/*/mountinfo > x.log
2、 获取进程ID
1
grep -nr '/var/lib/docker/overlay2/bd47a216d1bc2e72ba3155169faee246b2352fe919c8fb4708891ad31d1d31c7/diff' x.log | awk -F ':' '{print $2}'|awk -F '/' '{print $3}’
3、杀死所有相关进程
2、故障