一、Docker概述
1.1 概述
1.1.1 什么是容器
• 容器技术已经成为应用程序封装和交付的核心技术
 • 容器技术的核心有以下几个内核技术组成:
 – CGroups(Control Groups)-资源管理
 – NameSpace-进程隔离
 – SELinux安全
 • 由于是在物理机上实施隔离,启动一个容器,可以像
 启动一个进程一样快速1.1.2 什么是Docker
docker的核心应用是打包应用程序环境,docker是应用交付的核心技术
• Docker是完整的一套容器管理系统  
 • Docker提供了一组命令,让用户更加方便直接地使
 用容器技术,而不需要过多关心底层内核技术1.2 Docker特性
1.2.1 Docker优点
• 相比于传统的虚拟化技术,容器更加简洁高效
 • 传统虚拟机需要给每个VM安装操作系统
 • 容器使用的共享公共库和程序     
1.2.2 Docker的缺点
• 容器的隔离性没有虚拟化强
 • 共用Linux内核,安全性有先天缺陷二、部署Docker
2.1 安装前准备
1.需要64位操作系统
 ~ ] # getconf LONG_BIT2.至少RHEL6.5以上的版本,强烈推荐RHEL7
 ~]# cat /etc/redhat-release 3.关闭禁用防火墙(不是必须)
 ~]# systemctl stop firewalld
 ~]# systemctl mask firewalld    //禁用防火墙4.禁用 selinux
 ~]# vim /etc/selinux/config
 SELINUX=disabled5. 修改主机名和静态 ip 地址
 ~ ] echo docker1 >/etc/hostname
 配置静态 ip 地址 /etc/sysconfig/network-scripts/ifcfg-eth0
 BOOTPROTO="static"
 IPADDR="192.168.1.11"
 NETMASK="255.255.255.0"
 GATEWAY="192.168.1.254"2.2 安装docker
2.2.1配置 yum 源
下载docker.tar.gz,提取两个rpm包。把这两个rpm压缩包放到一个文件夹下,再通过createrepo . 生成自定义yum源。
最后客户端编写repo文件就可以实现客户端使用
[local_docker]
name=CentOS-$docker - Base
baseurl="ftp://192.168.5.254/docker"
enabled=1
gpgcheck=02.2.2 安装 docker
~] # yum install docker-engine
2.2.3 启动docker服务并查看版本
docker1 ~]# systemctl restart docker    //启动docker服务
docker1 ~]# systemctl enable docker    //让docker服务开机自启
docker1 ~]#  ifconfig  启动后可以看见 docker0 
docker1 ~]#  docker version
三、Docker镜像
3.1 基本概念
3.1.1 什么是镜像
• 在Docker中容器是基于镜像启动的
 • 镜像是启动容器的核心
 • 镜像采用分层设计
 • 使用快照的COW技术,确保底层数据不丢失3.1.2 Docker hub镜像仓库
• Docker官方提供公共镜像的仓库(Registry)     https://hub.docker.com
1.搜索公共镜像仓库的docker镜像
[root@docker1 ~]# docker search rhel7
[root@docker1 ~]# docker search centos
[root@docker1 ~]# docker search nginx
[root@docker1 ~]# docker search mysql
3.2 镜像操作
3.2.1 下载、上传镜像
1.下载镜像(从镜像仓库中下载镜像)
[root@server0 ~]# docker help pull
          docker pull [OPTIONS] NAME[:TAG|@DIGEST]
 [root@server0 ~]# docker pull rhel72.上传镜像(上传镜像到仓库)
 [root@server0 ~]# docdocker help push
           Usage: docker push [OPTIONS] NAME[:TAG]
 [root@server0 ~]# docker push rhel73.2.2 导入、导出镜像
1.导入镜像(通过tar包文件导入镜像)
 [root@server0 ~]# docker load < xx.tar
 [root@server0 ~]# docker images2.导出镜像(将本地镜像导出为tar文件)
 [root@server0 ~]# docker images
 [root@server0 ~]# docker save image_name > xx.tar3.2.3 启动镜像
1.启动centos镜像生成一个容器
 [root@server0 ~]# docker images
 [root@server0 ~]# docker run -it centos bash
 2.开启另一个终端(查看容器信息)
 [root@server0 ~]# docker ps四、Docker基本命令
4.1 镜像常用命令
4.1.1 命令列表
1.命令列表
 – docker images //查看镜像列表
 – docker history //查看镜像制作历叱
 – docker inspect //查看镜像底层信息
 – docker pull //下载镜像
 – docker push //上传镜像
 – docker rmi //删除本地镜像
 – docker save //镜像另存为tar包
 – docker load //使用tar包导入镜像
 – docker search //搜索镜像
 – docker tag //修改镜像名称和标签4.1.2 docker images
1. 查看镜像列表
 docker1 ~]# docker images
 镜像仓库名称    镜像标签   镜像ID                   创建时间             大小
 centos                latest         980e0e4c79ec   8 months ago    196.7 MB4.1.3 docker history      
1.查看镜像历史,了解镜像制作过程
 docker1 ~]# docker history centos4.1.4 docker inspect
1.查看镜像底层信息
 – 了解镜像环境变量、存储卷、标签等信息docker1 ~]# docker inspect centos
4.1.5 docker rmi
1.删除本地镜像
 – 注意:启动容器时删除镜像会提示错误[root@docker1 ~]# docker rmi centos
 Error response from daemon: conflict: unable to remove repository reference "centos" (must force) - container 0143d0aeee25 is using its referenced image e934aafc22062.如需强制删除,可以加-f选项
[root@docker1 ~]# docker rmi -f centos
Untagged: centos:latest
4.1.6 docker save|load
1.保存本地镜像另存为tar文件
 – 方便其他人使用tar包导入镜像~]# docker save nginx:latest > nginx.tar
~]#  ls  nginx.tar
~]# scp nginx.tar 192.168.5.141:/root/                 //把nginx.tar包传给远程机器
2.使用tar包文件导入镜像
docker2 ~]# docker load < nginx.tar                    //在远程机器上导入tar包
docker2 ~]#  docker images
4.1.7 docker tag
1.重命名镜像名称(复制)
~  ] # docker images          //查看所有镜像
~  ]# docker tag centos:latest test:v1     //centos:latest 和test:v1的ImageID是一样的,说明他们是同一个镜像的不同标示
~  ] #  docker rmi centos     //删除原有镜像的标示就实现了镜像重命名
4.2容器常用命令
4.2.1 命令列表
• 命令列表
– docker run //运行容器
 – docker ps //查看容器列表
 – docker stop //关闭容器
 – docker start //启动容器
 – docker restart //重启容器
 – docker attach|exec //进入容器
 – docker inspect //查看容器底层信息
 – docker top //查看容器进程列表
 – docker rm //删除容器4.2.2 docker run
1.使用镜像启动容器
[root@docker1 ~]# docker run -it centos bash
 [root@bbb51ac87b08 /]#exit
 [root@docker1 ~]# docker run -itd centos bash
 b8f218f2341c12655e6092d7d2e7fd5229824fdefce84075fb3a9569ebf82079
 [root@docker1 ~]# docker ps问题:docker run -it  nginx  没响应?
 因为 nginx 启动的默认 cmd 时 nginx daemon,该进程不是一个交互式的进程2.docker run 使用
 -i   交互式的
 -t   分配终端
 -d  把容器放在后台运行启动的进程是非交互进程需要用-d启动,启动的进程是交互式进程需要用-it启动
~] # docker  run  -it    centos   cmd    //启动一个centos交互式的容器,在前台运行
~] #  docker  run -d     nginx              //启动nginx服务   
小练习: 启动一个 nginx 的容器,修改默认首页为 "hello world"
1.创建一个nginx容器
[root@docker1 ~]# docker run -itd nginx       
 0dfd8f93df995813eecc9a174e54f77a3817f297a3b8147b02199c7c9cdd837f2.连接到指定CONTAINER ID nginx的容器
~]# docker exec -it 0dfd8f93df995813eecc9a174e54f77a3817f297a3b8147b02199c7c9cdd837f bash  
3.查找index.html所在路径
root@0dfd8f93df99:/# find / -name index.html 
 /usr/share/nginx/html/index.html4.修改主页内容为hello world
root@0dfd8f93df99:/# echo "hello world" > /usr/share/nginx/html/index.html 
5.查看容器IP
root@0dfd8f93df99:/#  ip a           
172.17.0.2
6.退出容器,在docker1上访问nginx主页
docker1 ~]# curl 172.17.0.2
4.2.3 docker ps
1.列出容器列表
 – docker ps 查看正在运行的容器
 – docker ps -a 查看所有容器列表
 – docker ps -aq 仅显示容器id~]# docker ps  [-qa]
4.2.4 docker stop|start|restart
• 管理容器
 – docker stop 关闭容器
 – docker start 开启容器
 – docker restart 重启容器~]# docker stop CONTAINER ID
4.2.5 docker attach|exec
1.进入容器
 – docker attach 进入容器,exit会导致容器关闭
 – docker exec 进入容器,退出时不会关闭容器    【生产环境中用 docker  exec连接容器】[root@server0 ~]# docker ps
[root@server0 ~]# docker attach b8f
 [root@server0 ~]# docker exec -it 7e4e bashQ1:如果我使用attach 连接容器后,怎么才能不结束容器?
 解决方法:把容器放后台,使用快捷键 ctrl + pqQ1:attach 为什么退出后,容器会结束?
因为 attach 连接进容器的 pid 1 的进程,当 attach 结束时候,pid 为 1 的进程被结束
 所有整个容器被销毁[root@041b7ee51d15 /]# ps  //在容器里执行ps命令,bash的pid是1。这是一个上帝进程,一旦退出,PID为1的进程就退出了,整个容器就结束了,所以我们需要把容器放入后台
   PID TTY          TIME CMD
     1 ?        00:00:00 bash4.2.6 docker inspect
1.查看容器底层信息
 [root@server0 ~]# docker ps
 [root@server0 ~]# docker inspect 21d2aeb977cc2.查看指定容器的IP地址
docker inspect -f '{.NetworkSettings.IPAddress}' 21d2aeb977cc
4.2.7  docker top
1.查看容器进程列表
docker1 ~]# docker ps  
docker1 ~]# docker top 7e4e   //不用进入容器查看容器里面的进程,相当于在容器里执行ps
4.2.8 docker rm
1.删除容器
 – 注意,删除正在运行的容器时会提示错误
 [root@server0 ~]# docker rm 7e4e
 [root@server0 ~]# docker rm $(docker stop $(docker ps -aq)) 
五、常见问题
5.1 删除容器
• 删除容器,提示错误:
 – docker rm 0cc
 Error response from daemon: You cannot remove a
 running container
 0cc385eb6f63373397e678347890914347dc8efa3cef
 d809c1ed8c157651a261. Stop the container before
 attempting removal or use -f5.2故障分析及排除
• 原因分析
 – 问题1:提示error:You cannot remove a runningcontainer
 • 解决办法
 – 问题1:先关闭容器,才能删除容器