Docker学习

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模式

    docker-网络链接模式插图(2)

  • host

    新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址

  • container

    使用此模式创建的容器需指定和一个已经存在的容器共享一个网络

实现跨宿主机的容器之间网络互联

实现原理:是在宿主机做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的

修改各宿主机网段:

Docker默认网段是172.17.0.x/24,而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能一致

添加静态路由和iptables规则

模式创建的容器需指定和一个已经存在的容器共享一个网络

实现跨宿主机的容器之间网络互联

实现原理:是在宿主机做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的

修改各宿主机网段:

Docker默认网段是172.17.0.x/24,而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能一致

添加静态路由和iptables规则

在各宿主机添加静态路由,网关指向对方宿主机的IP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值