DOCKER看着一篇就够了

文章目录

  • DOCKER
    • 一、安装docker-ce
    • 二、常用命令
    • 三、Dockerfile
    • 四、docker-compose
    • 五、零碎点
      • 5.1 脚本
      • 5.2 配置
      • 5.3 批量删除
    • 5.4 .gitignore 和 .dockerignore
    • 六、网络
    • 七、存储

DOCKER

DOCKER看着一篇就够了_第1张图片
DOCKER看着一篇就够了_第2张图片

一、安装docker-ce

  1. 在线安装
  2. 离线安装
  3. window安装
    注意:1.docker要求linux内核大于3.10,内核版本过低请先升级。2.服务器版本过低不宜选择过高版本,比如centos7.0使用 docker-18.06.3-ce.tgz易出问题。

二、常用命令

  • 常用命令
  • 导出镜像 docker save -o 路径名称 镜像名:tag
  • 导入镜像 docker load -i 路径名称
  • 网络模型:host container none bridge 容器互访三种方式
  • 批量打包镜像
  • Ngix
  • MySQL、tomcat
  • EFK
  • skywalking

三、Dockerfile

  • 速成1 速成2
  • RUN,CMD,ENTRYPOINT命令区别
  • 【go应用】 【beego】
    一个脚本可以简单快速的创建一个镜像并运行起来
echo '0.创建测试目录及代码'
mkdir dockerfiletest
cd dockerfiletest
mkdir dist
echo 'hello world'>./dist/index.html

echo '1.创建Dockerfile'
echo '
From daocloud.io/library/nginx:1.13.0-alpine
COPY dist/ /usr/share/nginx/html/
'>./Dockerfile

echo '2.构建镜像'
docker build -t dockerfiletest .

echo '3.运行镜像'
docker run -p 3344:80 dockerfiletest

(重点)Dokcerfile需要放置在项目的根目录位置

build cache

- Dockerfile中的每一个指令执行完毕后,都会提交为一个image,这样保证了指令之间不会有影响
- Docker会尽可能尝试重用之前已经构建的镜像
- 可以通过在build命令中增加--no-cache的方式禁用cache

.dockerignore

- 当选择用源代码路径的方式构建image的时候,通过在根目录下放置.dockerignore文件,来
过滤不需要发送到server端的文件
- 类似于.gitignore的概念

RUN

- 每一个RUN指令都会是在一个新的Container里面运行,并提交为一个image作为下一个RUN的Base
- RUN <cmd> /bin/sh -c "cmd"
- RUN ["executeable","arg1",...] Docker把它当作Json的序列来解析,因此必须使用双引号,而且executable需要是完整路径

CMD

- CMD的作用是作为执行Container时候的默认行为
- 当运行Container的时候声明了Command,则不再使用image中的CMD所定义的命令
- 只能有且只有最后一个CMD才会起作用
- CMD <cmd> /bin/sh -c "cmd"
- CMD ["executeable","arg1",...]
- CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数

ENTRYPOINT

- 作用是把整个Container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建
  Container的方式。但是可以通过参数传递的方式影响到Container内部
- 只能有且只有最后一个ENTRYPOINT才会起作用
- 当定义了ENTRYPOINT以后,CMD只能够作为参数进行传递
- CMD
- JSON

ADD©

- 源必须在context路径下
- 当src为网络URL的情况下,ADD指令可以把它下载到Dest的指定位置

ENV

- 用来设置环境变量,后续的RUN可以使用它所创建的环境变量
- 当创建基于该镜像的Container的时候,会自动拥有设置的环境变量

WORKDIR

- 用来制定当前工作目录
- 当使用相对目录的情况下,采用上一个WORKDIR制定的目录作为基准

USER

- 指定UID或者username,来决定运行RUN指令的用户

ONBUILD

- ONGBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令
- 可以定义多个ONBUILD指令
- 当下一个镜像B使用镜像A作为Base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的
ONBUILD指令
- ONBUILD <Dokcerfile 指令> <Content>

四、docker-compose

不再需要使用 shell 脚本来启动容器,通过 docker-compose.yml 编排应用 只看这篇了,博主是个精致的人儿

  • 二进制安装
  • curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-uname -s-uname -m> /usr/local/bin/docker-compose
  • chmod +x /usr/local/bin/docker-compose
  • 查看成功 docker-compose -v
  • docker-compose down && docker-compose up -d 注意点

五、零碎点

定时清理日志

5.1 脚本

#!/bin/sh

echo "==================== start clean docker containers logs =========================="

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs

        do

                echo "clean logs : $log"

                truncate -s 0 $log

        done

echo "==================== end clean docker containers logs  =========================="

5.2 配置

我们还可以限制生成日志的大小在/etc/docker/daemon.json文件夹中添加:

"log-driver":"json-file",

 "log-opts":{ "max-size" :"50m","max-file":"1"}

然后重启:

systemctl daemon-reload
systemctl restart docker

5.3 批量删除

1.停止所有的container,这样才能够删除其中的images:
	docker stop $(docker ps -a -q)
2. 如果想要删除所有container的话再加一个指令:
	docker rm $(docker ps -a -q)
3.想要删除untagged images,也就是那些TAG为的<none>的话可以用
	docker rmi $(docker images | grep "^" | awk "{print $3}")
	或者 docker image prune -f
4.要删除全部image的话
	docker rmi $(docker images -q)
5.强制删除全部image的话
	docker rmi -f $(docker images -q)

5.4 .gitignore 和 .dockerignore

【.gitignore】 【 .dockerignore】

六、网络

【网络模型】
【流量流动分析】

docker 与 iptables、route:

  • 4种网络模式(模型)
a.host
	docker使用linux中的namespace隔离资源,一个docker容器会分配一个独立的network namespace。但是如果容器采用host时,那么这个容器会和宿主机公用一个network namespqce,容器将不会虚拟出自己的网卡,配置自己的ip,而是使用宿主机的ip和端口
b.container
	contianer模式是指和已经存在的一个容器共享一个network namespaces,那两个容器除了网络方面,其它的资源还是隔离的,两个容器的进程可以通过lo网卡设备通信
c.none
	none模式时docker拥有自己的network namespaces,但是docker进行任何网络配置,需要我们自己为docker容器添加网络、配置ip
d.bridge 最常用
	bridge模式是docker默认的网络设置,此模式会为每个容器分配network namespace、设置ip等,并将一个主机的docker容器连接到一个虚拟网络上
  • 启动docker网桥模式对宿主机网络带来的改变:
1、当docker deamon启动的时候会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。
2、虚拟网桥的工作方式和物理交换机类似。
3、docker会从分配与宿主机不同的ip地址给docker网桥和container
4、可以把docker0看作网桥的管理接口

# docker daemon启动过程会初始化一系列的iptables规则以及修改部分内核参数
1、经过对比分析,我们可以看到docker启动,分别在filter和nat建立了名为DOCKER的chain,在forward转发链增加了一些ACCEPT规则,在nat增加了postrouting和prerouting以及output的规则。
2、把目标地址类型属于主机系统的本地网络地址的数据包,在数据包进入NAT表PREROUTING链时,都让它们直接jump到一个名为DOCKER的链。

	到本机某进程的报文:PREROUTING --> INPUT
	
	由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
	
	由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

# 回顾一下RETURN动作
1. 从一个CHAIN里可以jump到另一个CHAIN, jump到的那个CHAIN是子CHAIN.
2. 从子CHAIN return后,回到触发jump的那条规则,从那条规则的下一条继续匹配.
3. 如果return不是在子CHAIN里,而是在main CHAIN,那么就以默认规则进行.

# route的变化
	U Up表示此路由当前为启动状态
	H Host,表示此网关为一主机
	G Gateway,表示此网关为一路由器
	R Reinstate Route,使用动态路由重新初始化的路由
	D Dynamically,此路由是动态性地写入
	M Modified,此路由是由路由守护程序或导向器动态修改
	! 表示此路由当前为关闭状态

/*在Linux服务器上,IP地址、网关、DNS、子网掩码、路由等的管理都是Linux内核在管理,而不是网卡,内核在管理此类对象时需要网卡这个载体来操作。*/

# 本规则的优先级别。优先级别越高的规则越先匹配(数值越小优先级别越高)
表255 本地路由表(Local table) 本地接口地址,广播地址,已及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。

表254 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如route)所添加的路由都会加到这个表。一般是普通的路由。

表253 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。

表 0 保留
  • 新建的docker container 完成以上网络配置的过程大致如此:
首先,在主机上创建虚拟网卡veth pair设备,成对出现,组成一个数据通道。一端在container里,并命名为eth0,另一端放在主机中以veth。
然后,会分配一个IP给container,并设置docker0的ip地址为容器的默认网关。
  • 通信:
1、容器发包出去的过程:ip包会从container发往自己默认的网关docker0,到包到达docker0时就时到达了主机,这时候会查询主机的路由表,发现包应该从主机的网卡eth0出去,如下的iptables的规则就起作用,对包做snat转换,将原地址转成eth0的地址,这样对于外部来说docker容器就是不可见的:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
2、容器接受包的过程,需要用到主机的端口映射:对主机相应端口的流量进行dnat转换,将流量发往container
  • 结论
1、所谓的 Docker 网络的隔离性只在 INPUT 链, OUTPUT 链中体现。 修改 PREROUTING 链, FORWARD 链, POSTROUTING 链都会影响到 Docker 容器的网络环境。
2、要通过 DOCKER 链控制 Docker 容器的访问权限, 需要先删除 -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 这条规则, 因为这条规则的不确定性太大。 
3、然后单纯通过 DOCKER 链来控制 Docker 容器的网络访问权限。

DOCKER看着一篇就够了_第3张图片
启动docker deamon 对宿主机网络的影响:

  • 网络设备中增加了 docker0 设备
[root@10-255-20-99 ~]# iptables --line -nvL -t nat
Chain PREROUTING (policy ACCEPT 422 packets, 25320 bytes)
num   pkts bytes target     prot opt in     out     source         destination
# # 如果请求的目标地址是本机的地址, 那么将请求转到 DOCKER 链处理         
1      427 25620 DOCKER     all  --  *      *       0.0.0.0/0      0.0.0.0/0   ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 422 packets, 25320 bytes)
num   pkts bytes target     prot opt in     out     source         destination         

Chain OUTPUT (policy ACCEPT 16 packets, 960 bytes)
num   pkts bytes target     prot opt in     out     source        destination 
# 如果请求的目标地址不匹配 127.0.0.0/8, 并且目标地址属于本机地址, 那么将请求跳转到 DOCKER 链处理        
1        0     0 DOCKER     all  --  *      *       0.0.0.0/0    !127.0.0.0/8  ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 16 packets, 960 bytes)
num   pkts bytes target     prot opt in     out     source               destination  
# 对于来自于 172.17.0.0/16 的请求, 目标地址不是 docker0 所在的网段的地址, POSTROUTING 链将会将该请求伪装成宿主机的请求转发到外网       
1        0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0   

Chain DOCKER (2 references)
num   pkts bytes target     prot opt in     out     source               destination  
# 由 docker0 设备传入的请求 DOCKER 链会返回上一层处理       
1        0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0       
Chain INPUT (policy ACCEPT 34839 packets, 3485K bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination   
# FORWARD 链的请求跳转到 DOCKER-ISOLATION 链处理      
1        0     0 DOCKER-ISOLATION  all  --  *      *       0.0.0.0/0            0.0.0.0/0  
# FORWARD 链请求目标是 docker0 所在的网段, 那么跳转到 DOCKER 链处理         
2        0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0  
# FORWARD 链的请求如果目标是 docker0 所在的网段, 而且已经建立的连接或者和已建立连接相关那么接受请求         
3        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
# FORWARD 链的请求来自于 docker0 所在网段, 而且目标网段不是 docker0 所在网段, 那么接收请求.
4        0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0   
# FORWARD 链的请求来自于 docker0 所在网段, 而且目标网段也是 docker0 所在网段, 那么接收请求        
5        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 35039 packets, 3572K bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
# DOCKER 链未处理
num   pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER-ISOLATION (1 references)
num   pkts bytes target     prot opt in     out     source               destination 
# DOCKER-ISOLATION 链未处理的请求返回到上一层继续处理        
1        0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0  

七、存储

你可能感兴趣的:(kubernetes)