容器
容器技术的核心有以下几个内核技术组成:
CGroups(Control Groups)资源管理
NameSpace-进程隔离
SELinux安全
由于是物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速

  Docker
Docker是完整的一套容器管理系统
Docker提供了一组命令,让用户更加直接方便地使用容器技术,而不需要过多关心底层内核技术
优点:
相比于传统的虚拟化技术,容器更加简介高效。
传统虚拟机需要给每个VM安装操作系统。
容器使用的公共库和程序。
缺点:
容器的隔离性没有虚拟化强。
共用Linux内核,安全性有先天缺点。
SELinux难以驾驶。
监控容器和容器排错是很棘手的。

 镜像
在Docker中容器是基于镜像启动的。
镜像是启动容器的核心。
镜像采用分层设计。
使用快照的cow技术,确保底层数据不丢失。


清除防火墙记录: 
 iptables -t nat -F  (清除所有记录)
 iptables -t nat -X  (清除自定义记录)
 iptables-save

一 安装包docker-engine
 yum -y install docker-engine
 
二 启动服务 
 systemctl start docker
 systemclt enable docker

docker 选项
-version  查看版本
-search   搜索镜像
-images   查看镜像列拜
-pull     下载镜像
-push     上传镜像
-save     镜像另存为tar包
-load     使用tar包导入镜像
-rmi      删除本地镜像
-history  查看镜像制作历史
-inspect  查看镜像底层信息 
-tag      修改镜像名和标签(创建软连接)


docker images
docker help pull 帮助
格式:docker pull [OPTIONS] NAME:[:TAG|@DIGEST]

docker pull rhe17  下载镜像
docker load < xx.tar   导入镜像
docker save  rhe17 > xx.tar 导出镜像
docker history centos
docker tag  rhe17:latest wode:biaoqian 创建软连接
docker inspect rhe17

docker images 查看镜像列表
镜像仓库名             镜像标签                    镜像ID              创建时间              大小
REPOSITORY           TAG             IMAGE ID            CREATED          SIZE
php                  latest              988e578c487e        15 months ago    33.18 MB


命令列表:
docker run       运行容器
docker ps        查看容器列表
docker stop      关闭容器
docker start     启动容器
docker restart   重起容器
docker attache|exec  进入容器
docker inspect    查看容器底层信息
docker top        查看容器进程列表
docker rm         删除容器

例:
docker run -v 挂载
docker run -link 2台连接起来
docker run -i交互
docker run -t终端
docker run -d后台
docker run -d -p(端口映射)
docker run -d -p 80(物理机端口):80(容器nginx端口) nginx
docker run -it centos /bin/sh(在容器里要执行的命令) exit直接退出便会杀死上帝进程,导致容器关闭
docker run -itd centos /bin/sh(在容器里要执行的命令) 放入后台,可以用docker ps 查看到

docker ps -a  查看所有容器列表
docker ps -aq 仅显示容器id号

docker stop/start/restart 9a5c63e34644 (容器id号)

docker attach -it 9a5c63e34644 /bin/bash(在容器里要执行的命令)  进入上帝进程,exit直接退出便会杀死上帝进程,导致容器关闭
docker exec -it 9a5c63e34644 /bin/bash (在容器里要执行的命令)   在上帝进程下创建一个子进程进入子进程,exit退出也不会关闭容器

docker inspect  9a5c63e34644 查看容器底层信息

docker top  9a5c63e34644   查看容器进程列表

docker rm  9a5c63e34644 删除容器
docker rm  `docker ps -aq` 删除所有容器

mysql的指定user启动:
mysqld --initialize --user=mysql

使用其他容器的卷:
docker run -itd --name nfs -v /date centos   默认挂载在/var/lib/docker... 可以查看容器底层信息
docker run -itd --name test --volumes-from nfs  nginx  使用容器叫nfs的/date目录,nfs容器死了也可以访问


   自定义镜像
docker commit  
使用镜像启动容器,在该容器基础上修改,另存为另一个镜像。
docker images
docker commit d3d188ad882cc myos:laters  创建名为myos的镜像


Dockerfile
自己编写镜像的内容

Dockerfile语法格式
FROM           基础镜像
MAINTAINER     镜像创建者信息
EXPOSE         开放的端口
ENV            设置变量
ADD            复制文件到镜像
RUN            制作镜像时执行的命令,可以有多个
WORKDIR        定义容器默认工作目录
CMD            容器启动时执行的命令,仅可以有一条CMD


Dockerfile 工作流程
构建一个有基本命令的镜像
mkdir /root/build
cd /root/build
cp /etc/yum.repos.d/xixi.repo /root/build/
vim Dockerfile
FROM centos (基础镜像)
RUN rm -rf /etc/yum.repos.d/*.repo
ADD local.repo /etc/yum.repos.d/xixi.repo  前面本地路径  后面为镜像路径
RUN yum -y install net-tools psmisc vim-enhanced iproute
CMD ["/bin/bash","-DFOREGROUND"]
   
docker build -t imagedname(镜像名)  Dockerfile (当前目录名)
docker build -t  http:laters   /root/build/




构建一个有http和ssh服务的镜像
mkdir /root/build
cd /root/build
mkdir /root/build/dockerfile
cp /etc/yum.repos.d/xixi.repo /root/build/
vim oo.sh
#!/bin/bash
EnvironmentFile=/etc/sysconfig/sshd
/usr/sbin/sshd -D &
EnvironmentFile=/etc/sysconfig/httpd
/usr/sbin/httpd -DFOREGROUND & 
wait

chmod 755 oo.sh

vim Dockerfile
FROM centos
MAINTAINER luozixu
RUN rm -rf /etc/yum.repos.d/*.repo
ADD   local.repo  /etc/yum.repos.d/xix.repo
RUN yum -y install net-tools psmisc vim-enhanced iproute  httpd openssh-server
ENV EnvironmentFile=/etc/sysconfig/sshd
RUN  /usr/sbin/sshd-keygen &>/dev/null
RUN echo "123456" |passwd --stdin root
ADD oo.sh /etc/init.d/oo.sh
EXPOSE 22 80
CMD ["/etc/init.d/oo.sh"]

docker build -t  abc:latest  /root/build/dockerfile/
docker run -itd -p 222:22 -p 80:80  abc:latest
docker run -itd   -p 222:22  --name /my-mysql  quan  /bin/bash

我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:web服务需要连接数据库。按照往常的做法,需要先启动数据库的容器,映射出端口来,然后配置好客户端的容器,再去访问。其实针对这种场景,Docker提供了--link 参数来满足。
docker run --name mysql -e MYSQL_ROOT_PASSWORD=server -d mysql
docker run --name nginx --link mysql:aliasmysql -d nginx


docker run -d -v      /usr/docker_file/NginxDemo.war:/usr/local/tomcat/webapps/NginxDemo.war -p 8080:8080 docker.io/tomcat  


 自定义镜像仓库
流程:
docker pull registry
vim /usr/lib/systemd/system/docker.service
  ExecStart=/usr/bin/dockerd --insecure-registry=ip:5000

systemctl daemon-reload
systemctl restart docker
docker run -id -p 5000:5000  registry
docher tag  镜像  ip地址:5000/镜像:latest
docker push  ip地址:5000/镜像:latest
进入registry容器查看/etc/docker/registry/config.yml

例:
docker images
docker run -id -p 5000:5000 registry
docker tag ubuntu:latest  192.168.4.6:5000/ubuntu

vim /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.4.6:5000"]
}

docker push 192.168.4.20:5000/ubuntu

firefox http://192.168.4.20:5000/v2/_catalog
firefox http://192.168.4.20:5000/v2/<name>/tags/list

docker rmi ubuntu:latest (删除ubuntu镜像)
docker run -itd 192.168.4.20:5000/ngins:latest(网络源镜像)
 


      存储卷
卷的概念
docker容器不保持任何数据
重要数据请使用外部卷存储(数据持久化)
容器可以挂载真实机目录或共享存储为卷

   主机卷的映射
将真实机目录挂载到容器中提供持久化存储

touch /root/a.txt
docker run -v /root/a.txt  -it nginx:laest /bin/bash (-v:同步/root/a.txt文件)

 共享存储
一台共享存储服务器可以提供给所有Docker主机使用
共享存储服务器(NAS、SAN、DAS等)
如:
– 使用NFS创建共享存储服务器
– 客户端挂载NFS共享,并最终映射到容器中
 
  Docker主机
– mount挂载共享
– 运行容器时,使用-v选项映射磁盘到容器中

  Linux网桥
创建虚拟网卡
真实网卡配置文件
– cat /etc/sysconfig/network-scripts/ifcfg-eth0
 
   虚拟网卡配置文件
– cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15


  创建虚拟网桥
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
... ...
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0
DEVICE=eth0
BRIDGE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# ~]# brctl show


 Docker网络拓扑
查看默认Docker创建的网络模型
[root@jacob ~]# docker network list
[root@jacob ~]# ip a s docker0
[root@jacob ~]# brctl show docker0  //启动容器会绑定该网桥

新建Docker网络模型
[root@jacob ~]# docker network create --driver bridge test01
[root@jacob ~]# docker network list
[root@jacob ~]# ip a s
[root@jacob ~]# docker network inspect test01

查看默认Docker创建的网络模型
– 自定义网段
[root@jacob ~]# docker network create --subnet=172.30.0.0/16 test01

启动容器,使用刚刚创建的自定义网桥
[root@jacob ~]# docker run --network=bridge|host|none ... ...
[root@jacob ~]# docker run --network=test01 -id nginx



客户端访问容器内的资源
默认容器通过SNAT可以访问外网
但外部网络的主机不可以访问容器内的资源

端口映射
– 使用端口映射可以实现外部网络访问容器内的资源
[root@jacob ~]# docker run -p 8080 80 -id nginx
//如:真实机IP为192.168.4.5,
使用-p映射真实机的8080端口到容器中的80端口
[root@client ~]# firefox http://192.168.4.5




 添加网桥
brctl --help
brctl addbr br0 
brctl delbr br0 删除br0
ip link  set br0 up 激活网桥
brctl show  查看

 添加网卡
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 
vim /etc/sysconfig/network-scripts/ifcfg-eth1
.......

/etc/init.d/network  reload 

brctl addif br0 eth1 把网卡eth1加入到br0里