Docker学习
Docker命令
帮助命令
docker version
docker info
docker --help
镜像操作
搜索镜像docker search -s 收藏数大于指定值
导出镜像docker save -o centos.tar centos
导入镜像docker load --input centos.tardocker load < centos.tar >
查看镜像docker images -q 只显示ID -a所有镜像包括中间层
删除镜像docker rmi 镜像ID -f强制 docker rmi -f $(docker images -qa)删除全部
历史镜像 docker history
生成镜像 docker build
生成镜像 docker commit -m=‘说明’ -a=‘作者’ 容器ID 镜像名称:标签
容器操作
新建并启动 docker run -it --name 容器名 镜像名/ID /bin/bash -i交互 -t终端 -p端口映射
列出容器 docker ps -a所有 -l 最近创建 -n最近创建n个 -q只显示编号
退出容器 exit 停止并退出 ctrl +q+p 退出不停止
启动容器 docker start
重启容器 docker restart
停止容器 docker stop
强制停止 docker kill
删除已停止容器 docker rm 删除所有 docker rm -f $(docker ps -qa)
查看容器日志 docker logs -f 跟随打印 -t 显示时间 --tail 显示末尾
查看容器进程 docker top
查看容器内部细节 docker inspect
进入容器 docker exec -it ID/name /bin/bash 打开新的终端 docker attach 直接进入容器终端
拷贝 docker 容器ID:容器内路径 目的主机路径
容器资源限制
docker run
内存限额 -m 200M 限额 --memory-swap=400M swap大小
cpu限额 --cpu 1 工作线程数量 -c 权重默认1024
block IO限额 --blkio-weight 默认500 --device-read-bps 每秒读数据量 --device-write-iops 每秒写io次数
Docker优点
docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源
docker利用的是宿主机的内核,而不需要Guest OS
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker的缺点
隔离性:多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
名称空间
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间
隔离类型 | 功能 |
---|---|
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 |
IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力 |
UTS Namespace(UNIX Timesharing System) | 提供主机名隔离能力 |
PID Namespace(Process Identification) | 提供进程隔离能力 |
Net Namespace(network) | 提供网络隔离能力 |
User Namespace(user) | 提供用户隔离能力 |
Linux Cgroups
默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多给定资源
全称是Linux Control Groups,它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作
镜像管理
镜像含里面是一层层的文件系统,叫做 Union FS(联合文件系统),联合文件系统,可以将几层目录挂载到一起,构建镜像的时候,从一个最基本的操作系统开始,每个构建提交的操作都相当于做一层的修改,增加了一层文件系统
镜像直接调用宿主机的内核,镜像中只提供rootfs,也就是只需要包括最基本的命令、工具和程序库就可以了
Dockerfile
实例
FROM centos_yum:7
MAINTAINER CZY 1031211365@QQ.COM
WORKDIR /usr/local
RUN yum install -y gcc pcre pcre-devel zlib zlib-devel make
ADD nginx-1.14.0.tar.gz /usr/local/
RUN cd /usr/local/nginx-1.14.0 \
&& ./configure --prefix=/usr/local/nginx \
&& make \
&& make install
COPY index.html /usr/local/nginx/html/index.html
EXPOSE 80
RUN ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
CMD nginx
执行dockerfile
docker build -t nginx_centos:1 (镜像名) /docker/(dockerfile所在目录)
FROM:指定基础镜像
MAINTAINER: 指定维护者信息
ENV:设置环境变量
RUN:执行shell命令
EXPOSE:暴露端口
COPY:复制文本
ADD:复制和解包文件
WORKDIR:指定工作目录
VOLUME:挂载点
CMD:容器启动命令指定启动容器时默认执行的命令,即:如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么就会使用执行CMD指定的默认的命令每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
ENTRYPOINT:入口点不可被 docker run 提供的参数覆盖,而是追加如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数
USER:指定当前用户
ARG:构建参数
ONBUILD:子镜像引用父镜像的指令
容器的数据管理
Docker容器的分层 docker inspect ID
-LowerDir:image 镜像层(镜像本身,只读)
-UpperDir:容器的上层(读写)
-MergedDir:容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和upperdir 合并给容器使用
-WorkDir:容器在 宿主机的工作目录
容器数据持久保存方式
- 数据卷(data volume):直接使用宿主机目录,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上 ,推荐使用此种方式,此方式较常用(docker run -d -v /hostdata:/dockerdata:ro)
- 数据卷容器(Data volume container):间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据 ,此方式不常用(docker run -d --volumes-from ID/NAME)
Docker网络
Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16
创建容器宿主机多了一个虚拟网卡,和容器的网卡组合成一个网卡,比如:137: veth8ca6d43@if136,而在容器内的网卡名为136,可以看出和宿主机的网卡之间的关联
容器间的通信
默认情况下
-
同一个宿主机的不同容器之前可以相互通信
-
不同宿主机之间的容器IP地址重复,不能相互通信
通过容器名称互联
docker run --name 本容器 --link 链接容器 (新建容器在hosts有dns映射)
ping 链接容器
docker网络连接模式
Docker 的网络支持5种网络模式:docker --network 《mode》
-
none
在使用none 模式后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
-
bridge默认
可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以入容器被外部主机访问,所以此模式也称为NAT模式
-
host
新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址
-
container
使用此模式创建的容器需指定和一个已经存在的容器共享一个网络
实现跨宿主机的容器之间网络互联
实现原理:是在宿主机做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的
修改各宿主机网段:
Docker默认网段是172.17.0.x/24,而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能一致
添加静态路由和iptables规则
模式创建的容器需指定和一个已经存在的容器共享一个网络
实现跨宿主机的容器之间网络互联
实现原理:是在宿主机做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的
修改各宿主机网段:
Docker默认网段是172.17.0.x/24,而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能一致
添加静态路由和iptables规则
在各宿主机添加静态路由,网关指向对方宿主机的IP