什么是Docker概述
什么是容器?
• 容器技术已经成为应用程序封装和交付的核心技术(打包:pxe、nginx、openstack等)
• 容器技术的核心由以下几个内核技术组成:
- – CGroups(Control Groups)-资源管理
- – NameSpace-进程隔离
- – SELinux安全
• 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
什么是Docker?
• Docker是完整的一套容器管理系统
• Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
Docker优点有?
• 相比于传统的虚拟化技术,容器更加简洁高效
• 传统虚拟机需要给每个VM安装操作系统
• 容器使用的共享公共库和程序
Docker缺点有?
• 容器的隔离性没有虚拟化强
• 共用Linux内核,安全性有先天缺陷
• SELinux难以驾驭
• 监控容器和容器排错是挑战
怎么部署Docker
安装前准备
• 需要64位操作系统
• 至少RHEL6.5以上的版本,强烈推荐RHEL7
• 关闭防火墙(不是必须)
安装Docker
• 软件包列表:
1、Yum自定义源的配置
mkdir /var/ftp/docker
手动将docker-engine-1.12.1-1.el7.centos.x86_64.rpm docker-engine-selinux-1.12.1-1.el7.centos.noarch.rpm这两个包放到/var/ftp/docker
createrepo /var/ftp/docker-----------自定义yum仓库
[root@room9pc01 ~]# ls /var/ftp/docker/
docker-engine-1.12.1-1.el7.centos.x86_64.rpm repodata
docker-engine-selinux-1.12.1-1.el7.centos.noarch.rpm
2、在虚拟机里面配置信息的yum地址repo文件
vim /etc/yum.repos.rep/dev.repo
Baseurl=http://192.168.1.254/docker
3、配置完成后开始安装docker
yum clean all
yum -y install docker-engine.x86_64-------docker-engine-selinux会被依赖而安装
Systemctl start docker
Systemctl enable docker
[root@jacob ~]# Ifconfig 会出现一个docker0
运用Docker镜像
什么是镜像
- 在Docker中容器是基于镜像启动的
- 镜像是启动容器的核心
- 镜像是启动容器的模版
- 镜像采用分层设计
- 使用快照的COW技术,确保底层数据不丢失(后端盘采用cow技术)
- 无数的前端共享一个后端。
遇到虚拟机不能ping通真实网络的问题
因为eth0没有ip地址了
systemctl restart network就好了,感觉这是一个bug(因为有时出现有时不出现这种情况)
Docker hub镜像仓库
• https://hub.docker.com
• Docker官方提供公共镜像的仓库(Registry)
[root@docker1 ~]# docker search rhel7----------搜索
[root@docker1 ~]#docker search nginx -----------搜索-
[root@docker1 ~]#docker search centos ----------搜索-
[root@docker1 ~]#docker search mysql-------- 搜索-
镜像操作之下载、上传镜像
• 下载镜像(从镜像仓库中下载镜像)
[root@docker1 ~]# docker help pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[root@docker1 ~]# docker pull rhel7------------ 下载rhel7
• 上传镜像(上传镜像到仓库)
[root@docker1 ~]# docdocker help push
Usage: docker push [OPTIONS] NAME[:TAG]
[root@docker1 ~]# docker push rhel7 -----------------上传rhel7
镜像操作之导入、导出镜像
• 导出镜像(将本地镜像导出为tar文件)
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 latest d023afdfeea3 10 days ago 200.7 MB
[root@docker1 ~]# docker save rhel7:latest > xx.tar-------导出镜像
[root@docker1 ~]# scp rhel7.tar 192.168.1.124:/root-------将导出镜像传到docker2
root@192.168.1.124's password:
rhel7.tar 100% 201MB 81.5MB/s 00:02
• 导入镜像(通过tar包文件导入镜像)
[root@docker2 ~]# ls
rhel7.tar RPM-GPG-KEY-CentOS-7 v.sh
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker2 ~]# docker load < rhel7.tar---------导入镜像
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 latest d023afdfeea3 10 days ago 200.7 MB
镜像操作之启动生成容器
• 启动centos镜像生成一个容器
命令格式
docker run -it 镜像的名称:镜像的标签 【启动命令】---------- -i交互式的 -t 终端
以非交互式启动交互式程序。以-d启动交互式是启动不了的。会被当作脚本执行了
[root@docker1 docker_images]# docker images 查看本机镜像
会有busybox、ubuntu、centos、registry、nginx、redis镜像 标签默认是latest
[root@docker1 docker_images]# docker run -it centos /bin/bash
• 开启另一个终端(查看容器信息)
[root@server0 ~]# docker ps 或加-a
docker ps -a------显示所有容器的详细信息
docker ps -q-----只显示当前容器的id
可能会遇到的问题?
1.容器退出以后,我怎么能再进入原来的容器。
系统的一个进程,退出后进程关闭。
容器我们在退出以后就关闭了,
如果想进入原来的容器需要重新启动那个容器
退出两种:ctrl p q 和 exec进入
2.为什么有的容器不加启动命令就起不来(nginx,redis)
因为是启动容器的默认命令是非交互式命令。
docker inspect nginx
docker inspect redis
3.启动参数-it是干什么用的?
-i表示交互的
-t表示终端
-d 表示非交互式
4.redis系统为什么是空的?
不是空的,因为你不熟悉 2891ae9b7744
debian系列(ubantu) vs redhat(centos、redhat)
dpkg rpm
apt-get yum
docker run -it redis /bin/bash
5.怎么查看系统中有几个容器?
在另一个终端查看 docker ps
6.怎么管理这些容器?
用docker常用命令
案例2:镜像基本操作
镜像基本操作:
– 导入镜像(centos、nginx、mysql)
– 导出镜像为tar包文件(方便其他主机使用镜像)
– 启动centos、nginx镜像
Docker基本命令
命令列表
- – docker images ---------------查看镜像列表
- – docker pull //下载镜像
- – docker push //上传镜像
- – docker save //镜像另存为tar包
- – docker load //使用tar包导入镜像
- – docker search //搜索镜像
- – docker tag //修改镜像名称和标签
- – docker history //查看镜像制作历史
- – docker inspect //查看镜像底层信息
- – docker rmi //删除本地镜像
详解之docker images
• 查看镜像列表
– 镜像仓库名称
– 镜像标签
– 镜像ID
– 创建时间
– 大小
[root@jacob ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Centos latest 980e0e4c79ec 8 months ago 196.7 MB
详解之docker history
• 查看镜像历史
– 了解镜像制作过程
– 详细参考后面的dockerfile内容
[root@jacob ~]# docker history centos
IMAGE CREATED CREATED BY SIZE COMMENT
980e0e4c79ec 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"]
0 B
详解之docker inspect
• 查看镜像底层信息
– 了解镜像环境变量、存储卷、标签等信息
命令格式:docker inspect 镜像的名称:镜像的标签
[root@jacob ~]# docker inspect centos
... ...
{
"Id": "sha256:980e0e4c79ec933406e467a296ce3b86685e6b42eed2f873745e6a91d718e37a",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2016-09-06T21:10:20.397787682Z",
"Container": "37446a1771cbec3e85b76d9159fd6a5a92743655cb92a65661e8a174bad81c7e“
... ...
详解之docker rmi
• 删除本地镜像
– 注意:启动容器时删除镜像会提示错误
[root@jacob ~]# docker rmi centos
Error response from daemon: conflict: unable to remove repository reference
"centos" (must force) - container 3daba799135c is using its referenced image
980e0e4c79ec
详解之docker save|load
• 保存本地镜像另存为tar文件
– 方便其他人使用tar包导入镜像
[root@jacob ~]# docker save centos > centos.tar
[root@jacob ~]# ls centos.tar
centos.tar
• 使用tar包文件导入镜像
[root@jacob ~]# docker load < centos.tar
详解之docker tag
• 重命名镜像名称(复制)
[root@jacob ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Centos latest 980e0e4c79ec 8 months ago 196.7 MB
[root@jacob ~]# docker tag centos:latest test:v1
[root@jacob ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Centos latest 980e0e4c79ec 8 months ago 196.7 MB
Test SIZE 980e0e4c79ec 8 months ago 196.7 MB
容器常用命令列表
• 命令列表
- – docker run //运行容器
- docker ps ---------显示当前容器的详细信息
- docker ps -a------显示所有容器的详细信息
- docker ps -q-----只显示当前容器的id
- – docker stop //关闭容器
- – docker start //启动容器
- – docker restart //重启容器
- – docker attach|exec //进入容器
- – docker inspect //查看容器底层信息
- – docker top //查看容器进程列表
- – -docker rm 容器ID------删除容器
- docker rm $(docker stop $(docker ps -aq))-------------批量删除容器前必须先将容器停止
上帝进程也叫根进程。Pid为1的进程。系统就是根进程。也就是pid为1的进程。
Redhat6的根进程为init(1) cat /etc/redhat-reles
删除进程(两种组合命令)
docker ps -aq |xargs docker rm
docker rm $(docker ps -aq) 前面命令的结果作为后面命令的参数
详解之docker run
• 使用镜像启动容器
[root@jacob ~]# docker run -it centos bash
[root@bbb51ac87b08 /]#exit
[root@jacob ~]# docker run -itd centos bash
b8f218f2341c12655e6092d7d2e7fd5229824fdefce84075fb3a9569ebf82079
[root@jacob ~]# docker ps
详解之docker ps
• 列出容器列表
– docker ps 查看正在运行的容器
– docker ps -a 查看所有容器列表
– docker ps -aq 仅显示所有容器id
[root@server0 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8f218f2341c centos "bash" 9 minutes ago Up 8 minutes jovial_pasteur
详解之docker stop|start|restart
• 管理容器
– docker stop 关闭容器
– docker start 开启容器
– docker restart 重启容器
[root@server0 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8f218f2341c centos "bash" 9 minutes ago Up 8 minutes jovial_Pasteur
[root@server0 ~]# docker stop b8f
详解之docker attach|exec
• 进入容器
– docker attach 进入容器,exit会导致容器关闭 动态查看docker attach id号
– docker exec 进入容器,exit不会关闭容器 相当于ssh连接,不会造成损失
[root@server0 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8f218f2341c centos "bash" 9 minutes ago Up 8 minutes
- [root@server0 ~]# docker attach b8f
- 先按ctrl不松手先按p再按q 退出终端而不关闭终端
[root@server0 ~]# docker exec -it 7e4e* /bin/bash
详解之docker inspect
• 查看容器底层信息
[root@server0 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8f218f2341c centos "bash" 9 minutes ago Up 8 minutes jovial_Pasteur
[root@server0 ~]# docker inspect 7e4e
"Id": "0cc385eb6f63373397e678347890914347dc8efa3cefd809c1ed8c157651a261",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"MacAddress": "02:42:ac:11:00:02"
详解之docker top
• 查看容器进程列表
[root@server0 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED PORTS NAMES
b8f218f2341c centos "bash" 9 minutes ago jovial_Pasteur
[root@server0 ~]# docker top 7e4e
UID PID PPID C STIME TTY TIME CMD
root 3177 3163 0 21:25 pts/8 00:00:00 /bin/bash
虚拟机和真机进程是完全分离的。
容器执行的命令在系统中能看见。可以直接杀掉容器中的进程。容器很轻量,随时启随时关。就是优势。
详解之docker rm
• 删除容器
– 注意,删除正在运行的容器时会提示错误
[root@server0 ~]# docker rm 7e4e
[root@server0 ~]# docker rm `docker ps -aq`
docker镜像命令:
- docker images ---------------查看镜像列表
- – docker pull //下载镜像
- [root@docker1 ~]# docker pull rhel7------------ 下载rhel7
- – docker push //上传镜像
- [root@docker1 ~]# docker push rhel7 -----------------上传rhel7
- – docker save //镜像另存为tar包
- [root@docker1 ~]# docker save rhel7:latest > xx.tar-------导出镜像
- – docker load //使用tar包导入镜像
- [root@docker2 ~]# docker load < rhel7.tar---------导入镜像
- – docker search //搜索镜像
- [root@docker1 ~]# docker search rhel7----------搜索
- – docker tag //修改镜像名称和标签
- – docker history //查看镜像制作历史
- [root@jacob ~]# docker history centos
- – docker inspect //查看镜像底层信息
- [root@jacob ~]# docker inspect centos
- – docker rmi //删除本地镜像
- [root@jacob ~]# docker rmi centos
docker 容器命令:
- docker run //运行容器
- docker run -it 镜像的名称:镜像的标签 【启动命令】---------- -i交互式的 -t 终端
- docker ps ---------显示当前容器的详细信息
- docker ps -a------显示所有容器的详细信息
- docker ps -q-----只显示当前容器的id
- docker pa -aq ----显示当前所有容器的id
- – docker stop 容器ID-------------关闭容器
- – docker start 容器ID-----------启动容器
- – docker restart 容器ID-------------重启容器
- – docker attach 容器ID----------进入容器
- docker exec -it 容器ID----------进入容器
- – docker inspect 容器ID-----------查看容器底层信息
- – docker top 容器ID-----------查看容器进程列表
- – -docker rm 容器ID------删除容器
- docker rm $(docker stop $(docker ps -aq))-------------批量(删除容器前必须先将容器停止)