DOCKER看着一篇就够了
文章目录
- DOCKER
- 一、安装docker-ce
- 二、常用命令
- 三、Dockerfile
- 四、docker-compose
- 五、零碎点
- 5.1 脚本
- 5.2 配置
- 5.3 批量删除
- 5.4 .gitignore 和 .dockerignore
- 六、网络
- 七、存储
- 八、问题积累
- ref
DOCKER


最详细篇
一、安装docker-ce
- 在线安装
配置# install docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.shif 【 ! $(getent group docker) 】; thensudo groupadd docker; elseecho "docker user group already exists" fisudo gpasswd -a $USER docker sudo service docker restartrm -rf get-docker.shcat > /etc/docker/daemon.json < - 离线安装
- 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
- 选用哪些基础镜像及怎么选取
- Use multi-stage builds
- 速成1 速成2
- RUN,CMD,ENTRYPOINT命令区别
- 【go应用】 【beego】
一个脚本可以简单快速的创建一个镜像并运行起来
echo '0.创建测试目录及代码'
mkdir dockerfiletest
cd dockerfiletest
mkdir dist
echo 'hello world'>./dist/index.htmlecho '1.创建Dockerfile'
echo '
From daocloud.io/library/nginx:1.13.0-alpine
COPY dist/ /usr/share/nginx/html/
'>./Dockerfileecho '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/bash
grep "Disk usage" /var/log/messages
du -sh /var/lib/docker
docker system df
docker system prune -a
定时清理日志
#!/bin/shecho "==================== start clean docker containers logs =========================="logs=$(find /var/lib/docker/containers/ -name *-json.log)for log in $logsdoecho "clean logs : $log"truncate -s 0 $logdoneecho "==================== 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.hostdocker使用linux中的namespace隔离资源,一个docker容器会分配一个独立的network namespace。但是如果容器采用host时,那么这个容器会和宿主机公用一个network namespqce,容器将不会虚拟出自己的网卡,配置自己的ip,而是使用宿主机的ip和端口
b.containercontianer模式是指和已经存在的一个容器共享一个network namespaces,那两个容器除了网络方面,其它的资源还是隔离的,两个容器的进程可以通过lo网卡设备通信
c.nonenone模式时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 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 LOCALChain 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 LOCALChain 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
七、存储
- 两种方法迁移 Docker 的默认安装(存储)目录
- 准备工作
sudo docker info | grep "Docker Root Dir" 在开始迁移之前,首先复制原 Docker 安装(存储)目录到新的路径下: 1cp -a /var/lib/docker /store/software/ 然后备份原目录数据: 1mv -u /var/lib/docker /var/lib/docker.bak - 方法一:软链接
首先,关停 Docker 服务: sudo systemctl stop docker / sudo service docker stop 接着,新建一个 /var/lib/docker 的软链: sudo ln -fs /store/software/docker /var/lib/docker 最后,重启 Docker 服务: sudo systemctl start docker / sudo service docker start - 方法二:直接修改 Docker 配置文件(条件允许的情况下,推荐)
Docker 版本 < v17.05.0 # 如果是 CentOS 则添加下面这行: OPTIONS=--graph="/store/software/docker" --selinux-enabled -H fd://# 如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux): OPTIONS=--graph="/store/software/docker" -H fd:// # 或者 DOCKER_OPTS="-g /store/software/docker"Docker 版本 >= v17.05.0 vim /etc/docker/daemon.json { "data-root": "/store/software/docker", "storage-driver": "overlay2" # 这个是 Docker 是默认设置,这里也可以不用加 } sudo systemctl restart docker / sudo service docker restart
- 准备工作
八、问题积累
- Docker启动Get Permission Denied
ref
【1】两种方式迁移 Docker 的默认安装(存储)目录
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
