Docker介绍
• 官网 www.docker.com
• github https://github.com/docker/docker.github.io
• 安装参考:https://zhangge.net/5126.html
• 开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便
• 由go语言编写,基于apache2.0协议发布
• 基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现
• 自2013年开始,近些年发展迅猛
• Docker核心原理以及相关组件:Docker client、Docker deamon、image、Repository、 Docker container、 Docker link、 Docker volume
• Docker高级用法:基子Openvswitch的二层网络构 Dockerfile高级进阶使用Supervisor来管理多任务、Docker Compose项目汫解、Docker Swarm项 目和Etc
• Docker镜像是Docker容器运行的静态模板。每个镜像都包含一系列的层,Docker使用一种叫做联合文件系统
(union file systems
,unionFS
)的东西来将这些层组合为单个镜像。unionFS
允许单独的文件系统中的文件和文件夹以分支的形式出现,可以被透明地覆盖,最终形成一个连续的文件系统。
• docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414
注意:docker run hello-world 即是验证docker是否安装成功的命令,如果看到如下输出结果,即表示docker安装成功。
Dockerfile
Docker镜像就可以通过一系列简单的,描述性的步骤从这些基础镜像构建,这些步骤被称为指令。每条指令在我们的镜像中会创建一个新的层,指令一般包括这些行为:
- 运行一个命令
- 添加一些文件或文件夹
- 创建环境变量
- 从该镜像启动一个容器时,运行哪个程序。
这些指令放在一个名为Dockerfile
的文本文件中,Dockerfile
包含了从基础镜像构建一个镜像的一系列指令和命令。当你请求构建一个镜像时,Docker读取该Dockerfile
文件,执行里面的指令,并生成一个最终的镜像。
Docker和传统的虚拟化比较
Docker的优势
• 启动非常快,秒级实现
• 资源利用率高,一台高配置服务器可以跑上千个docker容器
• 更快的交付和部署,一次创建和配置后,可以在任意地方运行
• 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率
• 易迁移,平台依赖性不强
Docker核心概念
• 镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。
• 容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
•仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)
Docker常用命令:
docker ps #查看容器ID ,查看不到docker时,启动docker服务:service docker.service 然后再使用ps -ef | grep docker #查看进程;docker images查看镜像
docker stop id #停止容器
docker rm id #删除容器
docker inspect 容器ID | more #查看容器的信息
docker inspect 容器ID | grep -i ip #查看容器的IP
docker stop 21uy8hjj22jh 112u3huk12h3ku #关闭/杀了容器
注意:docker ps -a -q #只显示容器ID
删除所有的容器命令:docker ps -a -q | xargs docker rm
Docker安装
yum makecache就是把服务器的包信息下载到本地电脑缓存起来
配合yum -C search xxx使用 不用上网检索就能查找软件信息 执行完 yum makecache之后,你可以用yum search subversion和yum -C search subversion 试下,看看二者速度差别有多大。我试的结果,二者差别挺明显的,前者明显比后者慢。3、安装Docker:yum install docker-engine-1.12.6 docker-engine-selinux-1.12.6 -y
4、关闭防火墙 systemctl stop firewalld systemctl disable firewalld 5、关闭SELINUXsetenforce 0(立刻生效,不需要重启操作系统)修改/etc/selinux/config文件中的SELINUX=disabled ,然后重启系统生效
6、重启系统(reboot -h)
7、重启后开启Docker,systemctl start docker
• curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo #下载repo的官方的源
• yum install -y docker-ce
• 速度比较慢,大家也可以直接下载rpm包
• https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
• 下载完,上传到linux下
• 也需要用yum安装,可以自动解决依赖关系
• yum install -y docker-ce-xxxx.rpm
• systemctl start docker 启动docker
注意:
Docker支持以下的CentOS版本:
- CentOS 7 (64-bit)
- CentOS 6.5 (64-bit) 或更高的版本
-
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本[root@localhost ~]# uname -r 3.10.0-327.el7.x86_64
实例:
安装dockers
[root@localhost-01 ~ ]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
[root@localhost-01 ~ ]# cat !$ #查看源里面的内容
[root@localhost-01 ~ ]# yum install -y docker-ce #安装dockers包
[root@localhost-01 ~ ]# yum list |grep dockers #查看dockers有没有安装完成
启动dockers
[root@localhost-01 ~ ]# systemctl start docker
[root@localhost-01 ~ ]# ps aux |grep dockers # 查看进程
[root@localhost-01 ~ ]# iptables -nvL #查看iptables规则
[root@localhost-01 ~ ]# cat /etc/system
[root@localhost-01 ~ ]#cat /etc/sysconfig/iptables #查看iptables规则
[root@localhost-01 ~ ]# service iptables save #保存iptables规则
[root@localhost-01 ~ ]# cat /etc/sysconfig/iptables #查看保存的iptables规则
[root@localhost-01 ~ ]# iptables -t nat -F #清空iptables规则
[root@localhost-01 ~ ]# iptables -t nat -nvL #查看清空后的iptables规则
[root@localhost-01 ~ ]# iptables restart dockers #重启dockers
[root@localhost-01 ~ ]# iptables -t nat -nvL #查看重启后的iptables规则
Docker镜像管理
• docker pull centos//可以下载centos镜像,速度很慢
• 配置docker加速器(参考 http://blog.csdn.net/xlemonok/article/details/71403534)
• vi /etc/docker/daemon.json//加入如下内容
•{
• "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
•}
• 说明:这个url为加速器地址,需要同学们自行到阿里云申请
• 配置完加速器,重启docker服务,再次docker pull centos会快很多
• docker images # 查看本地的镜像
• docker search xxx //搜索镜像,其中xxx是关键词,比如centos,ubuntu
• docker tag centos aming123 //给镜像打标签
• docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
• docker ps //查看运行的容器,加上-a选项后可以查看所有容器,包括未运行的
• docker rmi centos //用来删除指定镜像, 其中后面的参数可以是tag,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除
启动镜像前期准备
把占用80端口的进程和软件杀掉
pkill nginx
pkill httpd
然后查看80端口,使用命令:netstat -tnlp
启动80端口的镜像为容器:#docker run -itd -p 80:80 -p 6022:22 centos(镜像) /bin/bash
查看容器有没有启动:docker ps
实例:
docker pull centos #下载centos镜像
[root@localhost-01 ~ ]# docker pull centos #下载centos镜像
[root@localhost-01 ~ ]# useradd -s /sbin/nologin virftp # 创建用户virftp
配置docker
[root@localhost-01 ~ ]# mkdir /etc/docker/daemon.json #/etc/docker/daemon.json默认不存在
[root@localhost-01 ~ ]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://cvy7g.mirror.aliyuncs.com"] #加速链接,要自己到阿里云上申请
}
[root@localhost-01 ~ ]# systemctl start docker #重启docker 服务,然后再下载镜像
[root@localhost-01 ~ ]# docker pull centos #再重新下载centos镜像
[root@localhost-01 ~ ]# docker images #下载完成之后,查看本地有哪些镜像服务,TAG是标签
[root@localhost-01 ~ ]# docker search jumpserver # 搜索jumpserver,search是搜索的意思
[root@localhost-01 ~ ]# systemctl restart docker #重启docker,启动不起来,说明语法有错误
[root@localhost-01 ~ ]# docker pull ubuntu #下载ubuntu镜像,测试下载速度
[root@localhost-01 ~ ]# docker tag centos aming123 #centos镜像添加一个新的标签 aming123
[root@localhost-01 ~ ]#docker images #查看 aming123 标签有没有生成
[root@localhost-01 ~ ]#docker tag centos test111:171104 #标识一个镜像test111, 171104是标识TAG,冒号可加加不加
镜像启动为容器
[root@localhost-01 ~ ]# docker run -itd centos #把镜像启动为容器
[root@localhost-01 ~ ]# docker ps #查看启动状态的容器
[root@localhost-01 ~ ]# docker ps -a #查看所有的容器
[root@localhost-01 ~ ]# docker rmi test111 //用来删除指定镜像
Error : No such images: test111
[root@localhost-01 ~ ]# docker rmi test111:171104 # 删除test111:171104,输出的时候,添加TAG标识,171104就是标识
[root@localhost-01 ~ ]# docker images #查看标签有没有删除成功,删除只是TAG标签,不是镜像
Docker通过容器创建镜像
• docker run 启动容器后,可以通过下面命令进入容器
• docker exec -it xxxxx bash//其中xxxxx为容器id,这个id可以用docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端
• 进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像
• 在容器中执行 yum install -y net-tools,然后ctrl d退出容器
• docker commit -m "change somth" -a "somebody info" container_id new_image_name //container_id通过docker ps -a获取,后面的new_image_name为新镜像名字
• 例如: docker commit -m "install net-tools" -a "Aming" 2c74d574293f centos_with_nettool 这个命令有点像svn的提交,-m 加一些改动信息,-a 指定作者相关信息 2c74d这一串为容器id,再后面为新镜像的名字
实例:
进入到一个启动的容器里面
[root@localhost-01 ~ ]# docker ps
[root@localhost-01 ~ ]# docker exec -it 容器id(前六位数) bash #进入到一个启动的容器里面,开启bash进程
[root@ 容器id(六位数 / ]# df -h # 查看容器的空间大小
[root@容器id(六位 / ]# free #查看一下内存
[root@容器id(六位 ~ ]# ifconfig 或者ip add #查看IP地址,如果没有就安装net-tools
[root@ 容器id(六位数 / ]# yum install -y net-tools # 安装库,便于查看IP地址,安装完成后,ctrl+d退出
[root@容器id(六位数 / ]# exit #退出
[root@ localhost-01 ~ ]# ifconifg # 查看是否生成一个docker0网卡,docker0网卡便于和宿主机通信
把容器做成镜像
[root@localhost-01 ~ ]# docker commit -m "install net-tools" -a "Aming" 2c74d574293f centos_with_net #通过docker ps -a获取id号,2c74d574293f是上面使用的id号,后面的centos_with_net为新镜像名字
[root@localhost-01 ~ ]# docker images #查看新镜像名字
[root@localhost-01 ~ ]# docker run -itd centos_with_net # 运行新的镜像
在dockers环境下,ping外网。
[root@localhost-01 ~ ]# docker exec -it 容器id(六位) bash
[root@容器id(六位 /]# ifconfig
[root@容器id(六位 / ]# ping www.qq.com #ping一下是否能联网,当本机能ping通外网的时候,docker下也能平通
注意:当再次执行ifconfig命令时,172.17.0.x, x的值会改变。
Docker使用模板创建镜像
• 首先去下载一个模板
• http://openvz.org/Download/templates/precreated //下载速度不快,阿铭下载了一个centos6的模板centos-6-x86-minimal.tar.gz
• 导入该镜像的命令为:
• cat centos-6-x86-minimal.tar.gz|docker import - centos6
• docker images查看导入的镜像
• 把现有镜像,导出为一个文件:
• docker save -o aming-centos.tar aming
• 我们还可以用该文件恢复本地镜像:
• docker load --input aming-centos.tar 或者
• docker load < aming-centos.tar
• docker push image_name //可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧
openVZ介绍:
OpenVZ是开源软件,是基于平台的操作系统级解决方案。OpenVZ采用的Virtuozzo虚拟化服务器软件产品的,Virutozzo是SWsoft公司提供的商业虚拟化解决方案。
技术原理
编辑
OpenVZ可以在单个物理服务器上创建多个隔离的()并以最大效率共享硬件和。每个VPS的运行和完全一致,因其自身的用户、应用程序都可以独立重启,它拥有根访问权限、用户、、内存、处理器、文件、应用服务、系统库文件和配置文件等。拥有轻量级处理损耗和高效设计的OpenVZ是运行应用服务和实时数据生产型的最佳选择。
OpenVZ软件同时为用户提供工具,协助自动化管理。基于模板的应用程序部署可以在几分钟内用简单的方法创建新的虚拟服务器并投入使用,而且与其他的相比,OpenVZ可以在每CPU上运行几倍于其他虚拟化服务器技术的虚拟化服务器。
OpenVZ SWAP
一般OpenVZ和还有KVM的区别时候都会说OpenVZ是没有的,但实际上是可以给OpenVZ的机器增加的。
-
#!/bin/bash
-
SWAP="${1:-512}"
-
NEW="$[*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"
-
umount /proc/meminfo 2> /dev/null
-
sed "/^(Total|Free):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo
-
mount --bind /etc/fake_meminfo /proc/meminfo
保存成s.sh设成可执行的
然后执行一下chmod +xs.sh就有空间了。
实例:
在电脑上面下载openvz,然后上传到虚拟机中,速度比较快;也可以使用YUM下载。
[root@localhost-01 ~ ]# wget https://download.openvz.org//templates/precreated/centos-6-x86-minimal.tar.gz #下载模板镜像
[root@localhost-01 ~ ]# rz #上传压缩包
[root@localhost-01 ~ ]# ls #查看压缩包
[root@localhost-01 ~ ]# du -sh centos-6-x86-minimal.tar.gz #查看压缩包大小
[root@localhost-01 ~ ]# cat centos-6-x86-minimal.tar.gz|docker import - centos6 #导入该镜像
[root@localhost-01 ~ ]# docker images #查看导入的centos6镜像
[root@localhost-01 ~ ]# docker run -itd centos6 #centos6镜像启动容器
[root@localhost-01 ~ ]# docker exec -it 容器ID号 bash #id号上一步产生
[root@容器id(六位数 / ]# cat /etc/issue #查看版本号
[root@容器id(六位数 / ]# ifconfig #查看IP地址有没有改变,
[root@容器id(六位数 /]# uname -a #查看openvz内核 ,用的是Linux的内核 ,ctrl+D 退出来
[root@localhost-01 ~ ]# uname -a #查看centos系统内核
导入的镜像
把现有镜像,导出为一个文件(用docker images查看镜像):
root@localhost-01 ~ ]# docker save -o centos_with_net-tool.tar centos_with_net #到出cent_with_net 镜像
[root@localhost-01 ~ ]# du -sh cent_with_net-tool.tar #查看文件压缩包大小
[root@localhost-01 ~ ]# docker images #查看IMAGES ID 号
[root@localhost-01 ~ ]# docker rmi (-f) (IMAGE ID号) #删除cent_with_net-tool镜像 ,报错加上-f强制删除
如果删除不了,就停掉他,回头再删除镜像
root@localhost-01 ~ ]# docker ps #查看CONTAINER ID号
[root@localhost-01 ~ ]# docker rm -f CONTAINER ID号 #删除CONTAINER ID号
[root@localhost-01 ~ ]# docker rmi (-f) (IMAGE ID号) #删除cent_with_net-tool镜像
root@localhost-01 ~ ]# docker images #查看查看镜像有没有删除掉
root@localhost-01 ~ ]# docker ps #查看CONTAINER ID号
root@localhost-01 ~ ]# docker ps #查看CONTAINER ID号
root@localhost-01 ~ ]# docker ps #查看CONTAINER ID号
导入镜像(恢复刚刚删除的镜像)
root@localhost-01 ~ ]# docker load < centos7_with_net-tool.tar #导入 centos_with_net镜像
root@localhost-01 ~ ]# docker images #查看导入的centos_with_net-tool镜像
root@localhost-01 ~ ]# docker ps #查看CONTAINER ID号
Docker容器管理
• docker create -it centos6 bash //这样可以创建一个容器,但该容器并没有启动
• docker start container_id //启动容器后,可以使用 docker ps 查看到,有start 就有stop,和restart
• 之前我们使用的docker run 相当于先create再start
• docker run -it centos bash
• 这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止。
• docker run -d 可以让容器在后台运行
• 比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
• docker run --name web -itd centos bash // --name 给容器自定义名字
• docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出
实例:
创建一个 centos6容器
root@localhost-01 ~ ]# docker create -it centos6 bash //这样可以创建一个容器,但该容器并没有启动
root@localhost-01 ~ ]# docker ps #查看创建的centos6容器
root@localhost-01 ~ ]# docker ps -a #查看centos6的CONTAINER ID和IMAGE号启动一个 centos6容器
启动一个 centos6容器
root@localhost-01 ~ ]# docker start container_id #启动centos6容器
root@localhost-01 ~ ]# docker ps #查看启动的centos6容器
root@localhost-01 ~ ]# docker run -it centos bash #进入bash 状态
root@localhost-01 ~ ]# exit #退出来bash 状态
root@localhost-01 ~ ]# docker ps -a #状态是bash ,查看centos状态,
正式的启动容器的方式
root@localhost-01 ~ ]# docker run -itd --name centos6_1 centos6 bash #启动centos6容器
root@localhost-01 ~ ]# docker exec -it cent6_1 bash #进入centos6容器
退出容器,并删除
root@localhost-01 ~ ]# exit #退出来centos6容器
root@localhost-01 ~ ]# docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,并过30秒再执行
root@localhost-01 ~ ]# docker ps -a #查看容器
Docker容器管理(二)
• docker logs 可以获取到容器的运行历史信息,用法如下
• docker logs container_id
• docker attach 可以进入一个后台运行的容器,比如
• docker attach container_id //但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法
• docker exec -it container_id bash //可以临时打开一个虚拟终端,并且exit后,容器依然运行着
• docker rm container_id //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f
• docker export container_id > file.tar // 导出容器,可以迁移到其他机器上,需要导入
• cat file.tar |docker import - aming_test //这样会生成aming_test的镜像
实例:
root@localhost-01 ~ ]# docker run -itd centos bash -c "echo 123" #运行容器,并执行"echo 123"
12sjkshd4h12jkhb12kh3jk12hkhk123jkh12ju
root@localhost-01 ~ ]# docker logs 12sjkshd #查看历史信息
123
root@localhost-01 ~ ]# docker ps -a #查看所有容器
root@localhost-01 ~ ]# docker rm (CONTAINER ID)ID号 #删除所有的Exited状态的容器
root@localhost-01 ~ ]# docker ps -a #查看是否删除成功容器
Docker仓库管理
• docker pull registry //下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。
• docker run -d -p 5000:5000 registry //以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
• curl 127.0.0.1:5000/v2/_catalog //可以访问它
• 下面我们来把其中一个镜像上传到私有仓库
• docker tag aming_test 172.7.15.113:5000/centos //标记一下tag,必须要带有私有仓库的ip:port
• docker push 172.7.15.113:5000/centos //把标记的镜像给推送到私有仓库
• 此时并不会成功,Get https://172.7.15.113:5000/v2/: http: server gave HTTP response to HTTPS client
• 更改配置文件,vi /etc/docker/daemon.json//更改为
• { "insecure-registries":["172.7.15.113:5000"] }
• systemctl restart docker
• docker ps -a //查看容器已经关闭,还需要启动
• docker start id //这里的id为registry容器id
• 再次push
• docker push 172.7.15.113:5000/centos
• curl 127.0.0.1:5001/v2/_catalog //可以查看到推送上来的镜像
实例:
root@localhost-01 ~ ]# docker pull registry //下载registry 镜像
root@localhost-01 ~ ]# docker images #查看下载的镜像
root@localhost-01 ~ ]# docker run -d -p 5000:5000 registry //以registry镜像启动容器
root@localhost-01 ~ ]# docker ps #查看启动的端口
root@localhost-01 ~ ]# docker exec -it (CONTAINER ID全部复制)号 #启动centos6的bash
root@容器id(六位数 / ]# ifconfig #查看IP地址
root@localhost-01 ~ ]# exit #退出bash
root@localhost-01 ~ ]# ping 172.17.0.2 #这个IP地址是上显示的IP地址
root@localhost-01 ~ ]# telnet 127.0.1 500 #ping刚刚创建的5000端口,通了说明配置好了
telnet> quit #退出来
root@localhost-01 ~ ]# curl 127.0.0.1:5000/v2/_catalog //可以访问它
{“registrie” :[]} #空的
把标记的镜像给推送到centos私有仓库
root@localhost-01 ~ ]# docker tag centos6 192.168.133.132:5000/centos #虚拟机的192.168.133.132IP
root@localhost-01 ~ ]# docker images #查看192.168.133.132:5000/centos标签有没有产生
root@localhost-01 ~ ]# docker push 192.168.133.132:5000/centos
报错,是https的地址
解决办法
1、更改配置文件,vi /etc/docker/daemon.json(如果没有问题了,修改配置文件之后。直接执行红色字体的命令就行了)
root@localhost-01 ~ ]# vi /etc/docker/daemon.json
{ "insecure-registries":["192.168.133.132:5000"] }
root@localhost-01 ~ ]# systemctl restart docker #启动docker
root@localhost-01 ~ ]# docker push 192.168.133.132:5000/centos #再执行一次,如果没有成功,执行下面的操作
root@localhost-01 ~ ]# docker ps -a #查看registry 有没有启动,没有就启动他
root@localhost-01 ~ ]# docker push (registry的CONTAINER ID复制全部信息)id号 #启动registry
root@localhost-01 ~ ]# docker push 192.168.133.132:5000/centos #第三次启动
root@localhost-01 ~ ]# curl 127.0.0.1:5000/v2/_catalog
{“registrie” :[centos6]}
把ubuntu上传到私有仓库里面(push上传)
root@localhost-01 ~ ]# docker tag ubuntu 192.168.133.132:5000/ubuntu
root@localhost-01 ~ ]# docker push 192.168.133.132:5000/ubuntu
root@localhost-01 ~ ]# curl 127.0.0.1:5000/v2/_catalog
{“registrie” :[ubuntu]}
从私有仓库里面下载镜像(pull下载、拉去)【在另一台机器02没有镜像文件的机器中操作里面,】,
root@localhost-01 ~ ]# docker images
root@localhost-01 ~ ]# vi /etc/docker/daemon.json { "insecure-registries":["192.168.133.132:5000"] } #指定私有仓库的地址
root@localhost-01 ~ ]# docker pull 192.168.133.132:5000/ubuntu #指定端口后,才会到私有仓库里面下载
root@localhost-01 ~ ]# docker images #查看加载的pull 192.168.133.132:5000/ubuntu镜像
root@localhost-01 ~ ]# docker pull centos #配置好daemon后,就会去官方下载centos,测试下载的速度
Docker数据管理
• 1. 挂载本地的目录到容器里
• docker run -tid -v /data/:/data centos bash //-v 用来指定挂载目录,共享目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建
• 2. 挂载数据卷
• 其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为relaxed_franklin,这个名字可以使用命令 docker ps 看最右侧一列
• docker run -itd --volumes-from relaxed_franklin aming123 bash
• 这样,我们使用aming123镜像创建了新的容器,并且使用了 relaxed_franklin 容器的数据卷
• 3. 定义数据卷容器
• 有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
• 首先建立数据卷容器
• docker run -itd -v /data/ --name testvol centos bash //注意这里的/data/是容器的/data目录,并非本地的/data/目录。
• 然后让其他容器挂载该数据卷
• docker run -itd --volumes-from testvol aming123 bash
实例:
root@localhost-01 ~ ]# docker run -tid -v /data/:/data centos bash #挂载本地的目录到容器里
2q3jhb23hj3bq23hjb123hjb12hj3bhj12b3jhb123jk12n34jk123n34jkbn123jk34b
root@localhost-01 ~ ]# ls /data/ #查看系统的data目录
backup ftp gitroot mariadb mongodb mysql mysql.bak redis redis2 redis_data svnroot wwwroot
root@localhost-01 ~ ]# docker exec -it 2q3jhb bash
root@2q3jhb23h /]# ls /data/ #再查看系统的data目录
root@2q3jhb23h / ]# mkdir /data/123
root@2q3jhb23h /]# exit
root@localhost-01 ~ ]# ls /data/ #查看创建的目录,有没有同步到虚拟主机的硬盘上面
挂载数据卷
root@localhost-01 ~ ]# docker ps #查看
root@localhost-01 ~ ]# docker run -itd --volumes-from trusting_mcclintock centos6 bash #创建一个新的容器,并把刚刚创建的制作数据卷
12h12b12q2h233h23hkh23hkh23kj23jkh23hw34hkj2h3k4jh235h324klh
root@localhost-01 ~ ]# docker exec -it 12h12b12q2 #进入容器里面
root@12h12b12q2 /]# ls /data/
123 backup ftp gitroot mariadb mongodb mysql mysql.bak redis redis2 redis_data
容器的名字
Docker数据卷的备份与恢复
注意:做了映射,就不用备份了。直接把硬盘的数据拷贝一下就行了。
实验前提:数据卷容器,在没有做映射宿主机目录的时候
• 备份
• 这里的数据卷备份指的是上节课中提到的多个容器共享数据时,搭建的一个数据卷容器,备份这个数据卷容器
• mkdir /data/backup
• docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/ # -v作为映射
• 说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。
• 恢复
• 思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。
• 新建数据卷容器:docker run -itd -v /data/ --name testvol2 centos bash
• 挂载数据卷新建容器,并解包:docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar
注意:备份第一步新建一个数据卷容器使用的数据卷就是原来数据卷容器的数据卷,
所以这样的话新建容器和数据卷容器的/data文件内容是一致的。
第二步,把本地的/vol_data_backup/目录挂载到新建容器的/backup下,所以/data/backup=/backup。
第三步,我们打包新建容器的/data目录就等于把容器卷容器的/data文件备份出来了,这是备份到了/backup,由于/backup映射到了/data/backup,所以备份出来。
实例:
• 备份
root@localhost-01 ~ ]# mkdir /data/backup #在属主机上创建一个backup目录
root@localhost-01 ~ ]# docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/
Docker网络模式
• host模式,使用docker run时使用--net=host指定
• docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip
• container模式,使用--net=container:container_id/container_name
• 多个容器使用共同的网络,看到的ip是一样的
• none模式,使用--net=none指定
• 这种模式下,不会配置任何网络
• bridge模式,使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
Docker网络管理-外部访问容器
• 首先使用centos镜像新建一个容器,然后在该容器中安装httpd服务,并启动
• 再把该容器导成一个新的镜像(centos-httpd),然后再使用新镜像创建容器,并指定端口映射
• docker run -itd -p 5123:80 centos-httpd bash //-p 可以指定端口映射,本例中将容器的80端口映射为本地的5123端口
• docker exec -it container_id bash
• 启动httpd: httpd -k start
• 编辑1.html: vi /var/www/html/1.html 随便写点东西
• 退出该容器:exit
• 测试: curl 127.0.0.1:5123/1.html
• -p后面也支持IP:port:ip:port 的格式,比如
• -p 127.0.0.1:8080:80
• 也可以不写本地的端口,只写ip,这样会随意分配一个端口
• -p 127.0.0.1::80 //注意这里是两个冒号
Operation not permitted
• 新建的容器,启动nginx或者httpd服务的时候会报错
• Failed to get D-Bus connection: Operation not permitted
• 这是因为dbus-daemon没有启动,解决该问题可以这样做
• 启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init
• docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
实例:
root@localhost-01 ~ ]# docker ps #查看容器的具体情况
root@localhost-01 ~ ]# docker exec -t 3dcbac44230e bash #进入bash 模式
安装nginx
root@3dcbac44230e /]# yum install -y epel-release #先安装扩展源
root@3dcbac44230e /]# yum install -y nginx
root@3dcbac44230e / ]# systemctl start nginx #启动nginx
启动常见问题:权限问题
root@3dcbac44230e /]# rpm -qa nginx #查看安装的包
nginx-1.10.2-2.el7.x86_64
root@3dcbac44230e / ]# exit
root@localhost-01 ~ ]# docker ps
新建的容器centos_with_nginx
root@localhost-01 ~ ]# docker commit -m "install nginx" -a "aminglinux" 3dcbac44230e centos_with_nginx #导出成镜像
sha256:231bb231jhb123jhbjkb12jk34bkj1233b4kj12b3jkb12jk3b1kj
root@localhost-01 ~ ]# docker images #查看刚刚导入的centos_with_nginx镜像
root@localhost-01 ~ ]# docker run -itd -p 808:80 centos_with_nginx bash #启动centos_with_nginx的bash,访问80端口时候,直接访问8088端口就行了
jk23qjk23kgh2kj32h44kj23jk4gjk23g423j4hgbkj23g
root@localhost-01 ~ ]# docker ps
root@bdc696edee60 /]# docker exec -it bdc696edee60 bash
root@bdc696edee60 / ]# systemctl start nginx #启动nginx
root@bdc696edee60 / ]# exit
Operation not permitted
问题:dbus-daemon没有启动
root@localhost-01 ~ ]# docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
也可以使用/usr/local/nginx/sbin/nginx 执行这个命令,去启动nginx
出现错误
root@localhost-01 ~ ]# docker rm-f bdc696edee60
bdc23jkh2b34jk2
root@localhost-01 ~ ]# docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
093jhsd23jk23bgkjj23321hjk43hrk2
root@localhost-01 ~ ]# docker exec -it 093jhsd23
root@localhost-01 ~ ]# docker exec -it 093jhsd23 bash
root@093jhsd23 / ]# systemctl start nginx
root@093jhsd23 / ]# docker
root@093jhsd23 / ]# ps aux | grep nginx #查看nginx服务有没有启动
root@093jhsd23 / ]# curl localhost
显示的结果是:从内部访问使用的端口是80端口
root@093jhsd23 / ]# exit
从外部访问使用的端口是8088端口
root@localhost-01 ~ ]# docker run -itd --privileged -e "container=docker" -p 8088:80 centos_with_nginx /usr/sbin/init
root@localhost-01 ~ ]# curl localhost:8088 #使用8088端口访问
常见问题:
第一次进入容器的终端是bdc开头,然后进入这个容器要使用0f8开头的终端?
答:
上面的和下面的不是一个容器。
同一个镜像,可以开很多容器。
Docker网络管理-配置桥接网络
• 为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。
• cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0
• vi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1
• vi ifcfg-br0//修改DEVICE为br0,Type为Bridge,把eth0的网络设置设置到这里来
• systemctl restart network
• 安装pipwork
• git clone https://github.com/jpetazzo/pipework
• cp pipework/pipework /usr/local/bin/
• 开启一个容器
• docker run -itd --net=none --name aming123 centos_with_nettool bash #net=none不设置网络
• pipework br0 aming123 172.7.15.201/24@172.7.15.3 #201为容器的ip,@后面的ip为网关ip
• docker exec -it aming123 bash #进去后ifconfig查看就可以看到新添加的ip
实例:
root@localhost-01 ~ ]# cd /etc/sysconfig/network-scripts/ #进入网卡配置目录中
root@localhost-01 network-script ]# ls
给ENS33做桥接
root@localhost-01 network-script ]# ifconfig #桥接使用的网卡是ENS33
root@localhost-01 network-script ]# cp ifcfg-eth33 ifcfg-br0 #拷贝出来的新的网卡ifcfg-br0
root@localhost-01 network-script ]# vi ifcfg-br0
root@localhost-01 network-script ]# vim ifcfg-eth33
root@localhost-01 network-script ]# cat ifcfg-br0
root@localhost-01 network-script ]# systemctl restart network #重启网络
root@localhost-01 ~ ]# ifconfig #查看有没有产生br0
如果有ens33:0,删除它
root@localhost-01 network-script ]# ls #查看ens33:0网卡
root@localhost-01 network-script ]# rm-f ifcfg-ens33:0
root@localhost-01 network-script ]# vi ifcfg-br0
root@localhost-01 network-script ]# systemctl restart network #重启网络服务root@localhost-01 network-script ]# ifconfig #查看ens33:0有没有被删除
安装pipwork
root@localhost-01 ~ ]# git clone https://github.com/jpetazzo/pipework#从网上直接克隆pipework
root@localhost-01 ~]# cp pipework/
root@localhost-01 pipework ]# ls
docker-compose.yml doctoc LICENSE pipework pipework.spec README.md
root@localhost-01 pipework ]# cp pipework /usr/local/bin/ #pipework复制到/usr/local/bin/
root@localhost-01 pipework]# pipework
• 开启一个容器
root@localhost-01 ~]# docker ps #查看开启的镜像
root@localhost-01 ~]# docker run -itd --net=none --name centos_with_nginx bash
2hj21hjg123gkj12h3kj12h3kjh12kj3h12kj3h
root@localhost-01 ~ ]# docker exec -it 2hj21hj bash
root@2hj21hj /]# ifconfig
root@2hj21hj /]# exit
pipwork给容器增加IP
root@2hj21hj /]# pipework br0 2hj21hj 192.168.133.135/24@192.168.133.2 #ip@网关
root@2hj21hj /]# docker exec -it 2hj21hj bash #进入bash
root@2hj21hj / ]# ifconfig #查看添加的网卡
再另外一台机器上面,ping192.133.135 ,能ping通,说明设置成功。
root@2hj21hj / ]# ping www.qq.com #测试刚刚设置的IP地址,是否能联网,网管对了,就能联网
Dockerfile创建镜像 – Dockerfile格式
• 1. FROM //指定基于哪个基础镜像
• 格式 FROM <image> 或者 FROM <image>:<tag>, 比如
• FROM centos //指定基于centos基础镜像
• FROM centos:latest
• 2. MAINTAINER //指定作者信息
• 格式 MAINTAIN <name> ,比如
• MAINTAINER aming aming@aminglinux.com
• 3. RUN //镜像操作指令
• 格式为 RUN <command> 或者 RUN [“executable”, “param1”, “param2”],比如
• RUN yum install httpd
• RUN ["/bin/bash", "-c", "echo hello"]
•
• 4. CMD // 三种格式:
• CMD ["executable", "param1", "param2"]
• CMD command param1 param2
• CMD ["param1", "param2"]
• RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。比如
• CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
• 5. EXPOSE #暴露出来端口
• 格式为 EXPOSE <port> [<port>...] , 比如
• EXPOSE 22 80 8443 #左边22是宿主机所要监听的端口,8443 是容器监听的端口
• 这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。
• 6. ENV #定义环境变量
• 格式 ENV <key> <value>, 比如
• ENV PATH /usr/local/mysql/bin:$PATH
• 它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
• ENV MYSQL_version 5.6
• 7. ADD 格式 add <src> <dest>
• 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如
• ADD <conf/vhosts> </usr/local/nginx/conf>
• 8. COPY
• 格式同add
• 使用方法和add一样,不同的是,它不支持url
• 9. ENTRYPOINT 格式类似CMD
• 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:
• CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。比如,容器名字为aming
• 我们在Dockerfile中指定如下CMD:
• CMD ["/bin/echo", "test"]
• 启动容器的命令是 docker run aming 这样会输出 test
• 假如启动容器的命令是 docker run -it aming /bin/bash 什么都不会输出
• ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
• ENTRYPOINT ["echo", "test"]
• docker run -it aming 123 #123是一条指令
• 则会输出 test 123 ,这相当于要执行命令 echo test 123
• 10. VOLUME
• 格式 VOLUME ["/data"]
• 创建一个可以从本地主机或其他容器挂载的挂载点。
• 11. USER
• 格式 USER daemon
• 指定运行容器的用户
• 12. WORKDIR #指定工作目录
• 格式 WORKDIR /path/to/workdir
• 为后续的RUN、CMD或者ENTRYPOINT指定工作目录
• 先下载nginx的配置文件
• wget http://www.apelearn.com/study_v2/.nginx_conf
• vim Dockerfile //内容如下
•## Set the base image to CentOS
•FROM centos
•# File Author / Maintainer
•MAINTAINER aming aming@aminglinux.com
•# Install necessary tools
•RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
•# Install Nginx
•ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
•RUN tar zxvf nginx-1.8.0.tar.gz
•RUN mkdir -p /usr/local/nginx
•RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
•RUN rm -fv /usr/local/nginx/conf/nginx.conf
•COPY .nginx_conf /usr/local/nginx/conf/nginx.conf
•# Expose ports
•EXPOSE 80
•# Set the default command to execute when creating a new container
•ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
• 创建镜像:
• docker build -t centos_nginx . # -t 指定新的容器的名字
• docker images //可以看到我们新建的镜像
• docker run -itd -p 8088:80 centos_nginx bash
实例:
下载nginx,使用Dockerfile制作nginx的镜像
root@localhost-01 ~ ]# wget http://www.apelearn.com/study_v2/.nginx_conf
root@localhost-01 ~ ]# vim Dockerfile
## Set the base image to CentOSFROM centos# File Author / MaintainerMAINTAINER aming aming@aminglinux.com# Install necessary toolsRUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel# Install NginxADD http://nginx.org/download/nginx-1.8.0.tar.gz .RUN tar zxvf nginx-1.8.0.tar.gzRUN mkdir -p /usr/local/nginxRUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make installRUN rm -fv /usr/local/nginx/conf/nginx.confADD wget http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf #把nginx下载到/usr/local/nginx/conf/nginx.conf目录# Expose portsEXPOSE 80# Set the default command to execute when creating a new containerENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
root@localhost-01 ~ ]# docker build -t centos_nginx . #需要几分钟时间,执行上面的内容
问题:容器不能联网。ens33已经停了。
解决办法:重启docker服务
root@localhost-01 ~ ]# docker restart docker
root@localhost-01 ~ ]# docker ps -a #启动一个exited状态的容器
root@localhost-01 ~ ]# docker start 3dcbac44230e #启动centos_with_net容器
3dcbac44230e
root@localhost-01 ~ ]# docker exec -it 3dcbac44230e bash #运行centos_with_net 的bash
root@3dcbac44230 /]# ping www.qq.com
root@3dcbac44230 /]# ifconfig
root@localhost-01 ~ ]# docker build -t centos_nginx .
执行成功图
root@localhost-01 ~ ]# docker images #查看生成的centos_nginx镜像
root@localhost-01 ~ ]# docker run -itd -p 81:80 centos_nginx bash #对81端口做映射
e23133jh23jh4khkj3h4kj2h34kjh234jkh23jk4h22
root@localhost-01 ~ ]# docker exec -it e23133jh #进入centos_nginx容器里面
root@e23133jh / ]# ps aux | grep nginx #查看nginx有没有启动
root@e23133jh / ]# ifconfig #查看172尾号有没有变化
root@e23133jh / ]# exit
root@localhost-01 ~ ]# curl 127.0.0.1:81 #说明nginx镜像配置成功了
常见问题:
出现 curl: (56) Recv failure: Connection reset by peer的错误问题。
1. 用Dockerfile成功build出镜像后,docker run -itd -p 81:80 --name nginx_server centos_bianyi_nginx bash运行,
docker exec -it nginx_server bash进入容器后,ps aux |grep nginx 如下
但很奇怪,netstat -lnpt不会出现任何信息。
在宿主机上无论curl localhost:81 还是 127.0.0.1:81都是同样的错误。
换另一个yum安装的nginx的镜像创建容器后,curl的结果就是正常的。
是什么问题呢?
Dockerfile文件内容如下
答:查看你的虚拟主机配置文件有没有。
用Docker compose部署服务
• docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。我们可以在一个compose文件中定义一个多容器的应用(比如jumpserver),然后通过该compose来启动这个应用。
• 安装compose方法如下
• curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #去官方下载compose
• chmod 755 !$
• docker-compose version 查看版本信息
• Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1没有声明版本默认是"version 1"。Version 1将来会被弃用。
实例:
安装compose
root@localhost-01 ~ ]# curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
root@localhost-01 ~ ]# du -sh !$ #查看下载的包的大小
root@localhost-01 ~ ]# chmod 755 !$
root@localhost-01 ~ ]# docker-compose version 查看版本信息
root@localhost-01 ~ ]# docker
用Docker compose部署服务 – 示例
• vim docker-compose.yml //内容到https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml 查看
• docker-compose up -d 可以启动两个容器
• docker-compose --help
• docker-compose ps/down/stop/start/rm
• 关于docker-compose语法的参考文档 http://www.web3.xin/index/article/182.html
注意:使用docker-compose命令,要先安装要先安装docker-compose
实例:
root@localhost-01 ~ ]# vim docker-compose.yml
version: "2" #版本是2services: app1: #容器1的名字 image: centos_nginx #对应镜像的名字 ports: - "8080:80" #映射的端口8080到80 networks: - "net1" #使用的网络 volumes: - /data/:/data #对本地容器的目录做映射 app2: ##容器2的名字 image: centos_with_net networks: - "net2" volumes: - /data/:/data1# entrypoint: tail -f /etc/passwdnetworks: net1: driver: bridge #使用的模式 net2: driver: bridge
root@localhost-01 ~ ]# docker-compose up -d #把容器都启动起来
、
问题:centos_with_nettool镜像不存在
root@localhost-01 ~ ]# docker images #查看所有的镜像,在docker-compose.yml中把不存在的镜像替换成存在的
启动成功图
root@localhost-01 ~ ]# docker-compose stop #暂停docker-compose
root@localhost-01 ~ ]# docker-compose --help #查看docker-compos使用手册
root@localhost-01 ~ ]# docker-compose ps #查看停止的容器
root@localhost-01 ~ ]# docker-compose rm -f #删除已经停止的容器
root@localhost-01 ~ ]# docker-compose ps #查看已经停止的容器
[root@localhost-01 ~ ]# docker-compose up -d #推入到后台执行
[root@localhost-01 ~ ]# docker-compose ps #后面的是8080是端口映射
常见问题:
1、Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
启动的时候报错,不知道怎么解决?答:既然它提示 See "systemctl status docker.service" and "journalctl -xe" for details. 那你是否知道要运行
systemctl status docker.service 来查看问题细节?
如果结果中还没有找到线索,去看一下docker相关的日志
2、[root ~]# yum install -y docker-ce
错误:docker-ce conflicts with 2:docker-1.13.1-53.git774336d.el7.centos.x86_64
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest
今天重新安装一下怎么出现这个问题?无法解决
答:版本有冲突啊 把你的 docker-io 卸载掉。
3、怎么通过yum给docker升级
答:不建议直接升级。
4、 如果没有安装iptables docker会不会有问题 我的机器没有iptables服务?
答:它会自动创建iptables规则
5、请问linux下怎么用shadowsocks服务端怎么搭建?
6、
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
469cfcc7a4b3: Pulling fs layer
error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/e9/e934aafc22064b7322c0250f1e32e5ce93b2d19b356f4537f5864bd102e8531f/data?Expires=1523459542&Signature=Ra6Gyu~h3B~qL5pBYEh7IKqKngNK-Xg9oUifdB18znn6jOOmB1VtmkJKyAIgOxJGOQ6ecZkb7i657oEXJ5goK1UyZ17n1OAs0-i8Yq6VGAdHHDHdq9EDgZq~78YeOT4OenzaZXsg9AilWjU-2GdXhriAWqva00Ajon9ERt6Sf84_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout
??超时?怎么解决
答:配置一个加速器吧
7、
把镜像启动为容器:
[root@localhost ~]# docker run -itd centos
c1ab7ac4ef968c98bfa0c8398313c10e0653246782dfcb862d6a037210e91bd7
镜像应该是操作系统,容器应该是虚拟机,docker就是容器技术,要想使用容器,就得启动起来才能用。
8、root@localhost ~]# docker pull centos
Using default tag: latest
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
没法下载?
答:没有启动服务
9、openvz的这个模板文件,是openvz官网提供的,是不是也有其他人上传的?然后我们把它的模板下载下来,导入到docker?docker是支持openvz的,那docker也支持其他虚拟化软件的模板文件或镜像吗?
答:openvz的模板比较特殊,docker可以用,其他虚拟化软件并不支持。
10、
[root@localhost ~]# docker save -o centos7_with_nettool.tar centos6
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6 latest 052564bf7fb1 25 minutes ago 512MB
centos_with_nettool latest ee0af8ac1cfb 21 hours ago 304MB
aminglinux_centos latest ff426288ea90 4 weeks ago 207MB
centos latest ff426288ea90 4 weeks ago 207MB
[root@localhost ~]# docker rmi 052564bf7fb1
Error response from daemon: conflict: unable to delete 052564bf7fb1 (must be forced) - image is being used by stopped container cdd628770d8f
我已经把centos6 备份出来了,这时候删除6的镜像删除不掉?
答:加上 -f选项,强制删除
11、启动镜像,相当于,创建了一个容器后,在启动镜像;创建容器,相当于,基于镜像创建容器后,在docker start 容器ID?那停止镜像和停止容器,是一回事吗?
答:
镜像就是一个文件,一个用来启动容器的载体。 你可以把镜像理解为安装操作系统的iso文件,但本质上又不一样。
这里的启动、停止,操作的是容器,不要把镜像混为一谈。
12、有两个centos的容器在运行,这时候我进入centos,系统怎么判断我要进入哪个centos?
答:使用 container ID。 第一列。
13、
[root@localhost ~]# docker create -it centos6 bash
invalid reference format
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6 latest 052564bf7fb1 4 hours ago 512MB
centos latest ff426288ea90 4 weeks ago
怎么会报错?我这有6的镜像啊?
14、这里的创建容器,必须要先有centos6镜像吧
答有镜像了 才能创建容器
15、
docker tag aming_test 172.7.15.113:5000/centos //标记一下tag,必须要带有私有仓库的ip:port
这里是讲义上写的是容器的地址,但是实验用的是宿主机的地址,打标签是应该宿主机还是打容器的IP地址啊;
还有就是
insecure-registries":["172.7.15.113:5000"]
这个使用宿主机的主要目标是不是要我们把镜像上传到容器内的私有仓库啊,这个地址就可以解释为 宿主机:映射端口==容器:监听端口
答:这个ip是你仓库的ip地址。 但实际上容器的ip只能是本宿主机可以访问,要想对外还需要映射出来,也就是映射到宿主机上,即,该地址就是宿主机的地址。
16、这个私有仓库的地址应该是宿主机的IP
17、"http: server gave HTTP response to HTTPS client"这个错误,修改重启后还是未能解决。
/etc/docker/daemon.json的配置
docker的运行状态及镜像信息
答:daemon.json里面的内容,上面那一段去掉。
里面既添加了docker加速器的代码,又添加了本地仓库的代码,应该是不能同时生效
18、--volumes-from
这个参数是什么意识啊;在官方和论坛都没有找到;
答:指定数据卷容器。
注意:退出容器的话(后台还在运行),docker logs 查看容器的日志,后台运行 就可以查到日志
docker启动时所有的容器都自动启动
systemctl restart docker && docker start $(docker ps -a -q)
k8s和swarm教程或者链接
swarm
k8s
注意:安装docker之后把iptables的规则,最好保存一下