挤出来时间,记得有点乱
目的是想要利用docker来简化测试环境的搭建,但是。。。
docker images
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
* -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
* -d: 后台运行容器,并返回容器ID;
* -i: 以交互模式运行容器,通常与 -t 同时使用;
* -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
* –name=”nginx-lb”: 为容器指定一个名称;
* –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
* –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
* -h “mars”: 指定容器的hostname;
* -e username=”ritchie”: 设置环境变量;
* –env-file=[]: 从指定文件读入环境变量;
* –cpuset=”0-2” or –cpuset=”0,1,2”: 绑定容器到指定CPU运行;
* -m :设置容器使用内存最大值;
* –net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
* –link=[]: 添加链接到另一个容器;
* –expose=[]: 开放一个端口或一组端口;
*
docker run –name mycentos -d #创建
docker run -it centos:latest /bin/bash #运行
exit #退出
docker search httpd
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
docker pull
docker rmi
container
docker stop
(dockerps−a−q)dockerrm
(
d
o
c
k
e
r
p
s
−
a
−
q
)
d
o
c
k
e
r
r
m
(docker ps -a -q)
数据卷
可以供一个或多个容器使用的特殊目录
绕过UFS
数据卷可以在容器之间共享和重用
对数据卷的修改会马上生效
对数据卷的更新不影响镜像
数据卷默认会一直存在,容器删除也不会影响
类似于 linux 的mount
docker run -v # 创建一个数据卷并挂载到容器
docker ps 查看容器
docker start 启动容器
sudo docker attach 进入容器
sudo docker inspect 44fc0f0582d9
sudo docker exec -it 775c7c9ee1e1 /bin/bash
supervisorctl #查看正在运行的进程
dockerfile 放的是脚本
ADD 复制带解压的功能
copy 只是复制
RUN ps # 每一个RUN 就会新建立一层 ,commit 这一层的修改,构成新的镜像
exec RUN 可执行文件,参数1,参数2
Union FS 最大的层数有限制, 不能超过127 层
docker run 的时候回指定容器运行的基础镜像
docker exec /bin/bash #进入
docker diff 查看具体改的的内容
docker commit 将修改的记录到容器存储层,构成新的镜像,之后的操作都是黑箱操作,别人无法知道都执行了什么命令
Dockerfile 定制镜像
定制镜像就是定制每一层所添加的配置文件,把每次一层的操作命令都写入到一个脚本中。使用该脚本来定制镜像,这个脚本就是dockerfile
FROM 指定基础镜像
FROM scratch 指定 scratch 为基础镜像的时候,意味着不以任何镜像为基础,记下来的指令将作为镜像的第一层开始存在
RUN ps
RUN mkdir
RUN ps \
&& mkdir test
使用该方式将命令组合成一句
\ 是换行
构建镜像
docker build .
. 表示当前目录
COPY 源 目的
ADD 自带解压功能
CMD ls
CMD 可执行文件,参数1,参数2
entrypoint 入口点
entrypotion cmd
应用运行前的准备工作
entrypotion [“docker - entrypoint.sh”]
ENV 设置环境变量
ENV
ENV=
ARG 构建参数
ARG <参数名>[=<默认值>]
volume 定义匿名卷
volume [“”,“”]
容器运行时,容器存储层不发生写操作,对数据库类需要保存动态数据的应用,数据库文件应该保存于卷volume中
volume /data 运行时自动挂载为匿名卷
EXPOSE 声明端口
expose 宿主:容器
WORKDIR 指定工作目录
USER 指定当前用户
USER<用户名>
HEALTHCHECK 健康检查
ONBUILD 只有使用当前镜像为基础镜像构建时,才会执行
Docker volumes 数据卷
docker内部及容器之间管理数据
主要有两种方式:数据卷data volumes 、数据卷容器 data volume containers
数据卷是一个可供一个或多个容器使用的特殊目录,绕过UFS
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷一直存在,即使容器被删除
docker run -v 创建一个数据卷并挂载到容器里
docker rm -v 删除数据卷
-v 宿主path :容器path :ro 只读
docker inspect id #查看指定容器的信息
数据卷容器
持续更新的数据需要在容器之间共享
数据卷容器,就是一个正常的容器,专门永凯提供数据卷供其它容器挂载的
在其它容器中使用 —volumes -from 来挂载dbdata 容器中的数据卷
容器互联
docker -P - -link name1 : name2
name1 是要链接的容器的名称 name2是链接的别名
容器访问控制
sysctl net.ipv4.ip_forward
0没有开启转发
—ip - forward =true ,自动开启
自定义网桥
docker 默认的网桥 docker0
它在内核层连通了其他的物理或虚拟网卡,将所有容器和本地主机放在同一物理网络
每次创建一个新容器的时候
选择一个空闲的ip地址分配给容器的eth0端口
本机的docker0接口的ip作为所有容器的默认网关
启用docerk 时使用 -b bridge 或—bridge =BRIDGE 来指定网桥
sudo service docker stop
sudo ip link set dev docker0 down
sudo brctl delbr docker0
创建一个网桥
sudo brctl addr bridge0
sudo ip addr add 192.168.5.1/24 dev brige0
sudo ip link set dev bridge0 up
ip addr show bridge0
网络配置文件 /etc/hosts /etc/hostname /etc/resolve.conf
默认情况docker将所有的容器连接到 docker0提供的虚拟子网中
两个容器之间通信,不通过主机网桥
可以使用一对peer接口,放到两个容器中,配置成点到点链路
—icc = false 来关闭容器之间的通信
内核命名空间
docker 容器 和lxc容器(linux 自带的容器) 相似
docker run
后台创建了一个独立的命名空间和控制组集合
命名空间提供最基础、最直接的隔离
容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用
每个容器都有自己独有的网络栈
不能访问其他容器的sockets或接口
可以指定公共端口或使用links来连接两个容器
控制组
是liunux容器机制的另外一个关键组件
负责实现资源的审计和限制
确保各个容器公平的分享主机的资源
运行一个容器或应用程序的核心是用过docker服务端
docker服务的运行目前需要root权限
内核能力机制
可以提供细粒度的权限访问控制
底层实现
命名空间Namespaces、控制组Control、Union文件系统Union file systens 、容器格式Container format
传统的虚拟机通过在宿主运行hypervisor来模拟完整的硬件环境提供给虚拟机的操作系统,彼此隔离,对资源完整的封装,意味着系统资源的浪费
基础架构
docker 采用了c/s架构
docker daemon作为服务端接受来自客户端的请求
客户端和服务端可以在一个机器上,也可以通过socket 或RESTful API来通信
docker daemon 一般在宿主主机后台运行,等待接受来自客户端的消息
命名空间
每个容器都有最的命名空间
pid 、net 、ipc进程、mnt、uts unix Time-sharing System 使容器被视作一个独立结点而非一个进程、user
命名空间
控制组
对共享资源进行隔离、限制、和审计,控制分配到容器的资源,避免同时运行时对资源的竞争
联合文件系统
UnionFS 是一种分层、轻量级并且高性能的文件系统
支持对文件系统的修改作为一次提交来一层层的叠加
同时可以将不同目录挂载到同一个虚拟文件系统下
是docker镜像的基础,
镜像可以通过分层来进行继承,
基于镜像可以制作各种具体的应用镜像
可以共享基础镜像,同时加上自己的改动层
docker中使用的AUFS就是一种联合文件系统
docker目前支持的联合文件系统种类包括AUFS、btrfs、vfs、DeviceMapper
容器格式 libcontainer
网络实现
利用了linux上的网络命名空间和虚拟网络设备