##简介
1、定义
Docker是通过内核(linux内核)虚拟化技术(namespaces及cgroup等)来提供容器的资源隔离和安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
2、Docker组成部分
客户端和服务端
3、Docker组件
镜像(image)、容器(container)、仓库(repository)
4、Docker的用途
①简化配置(simplifying configuration)
②代码流水线管理(code pipeline management)
③开发效率(developer productivity)
④应用隔离(app lsolation)
⑤服务器整合(server consolidation)
⑥调试能力(debugging capabilities)
⑦多租户(multi-tenacy)
⑧快速部署(rapid deployment)
5、使用Docker的理由
①技术储备
②无技术栈和技术债 (主要是创业公司,没钱,宕机了可能承受)
③跟上节奏,提升自身技术
④符合当前业务需求
⑤快
6、docker改变了什么
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试(多分支测试)
面向运维:环境一致性(saltstack保证不了,环境回退)
面向架构:自动化扩容(微服务)
##镜像(image)
1、安装并启动docker
[root@liunx-node1 ~]# yum -y install docker
[root@liunx-node1 ~]# systemctl start docker
2、获取保存导入docker镜像
#获取镜像
[root@liunx-node1 ~]# docker pull centos #获取docker的centos镜像,更多docker镜像请参照docker官网
#保存镜像
[root@liunx-node1 ~]# docker save centos(镜像名称或者id) > /opt/centos.tag.gz (自定义名称)
[root@liunx-node1 ~]# docker save -o /opt/centos.tag.gz (自定义名称) centos(镜像名称或者id)
#导入镜像
[root@liunx-node1 ~]# docker load < /opt/centos.tag.gz
[root@liunx-node1 ~]# cat /opt/centos.tag.gz | docker import - 导入后的名称[:标签]
3、查看、重命名docker镜像
[root@liunx-node1 ~]# docker images #每一个镜像都有一个唯一的image id
[root@liunx-node1 ~]# docker tag 镜像id 新名称 #重命名镜像
4、查看帮助
[root@liunx-node1 ~]# docker run --help
[root@liunx-node1 ~]# docker images --help
5、删除docker镜像
[root@liunx-node1 ~]# docker rmi 196e0ce0c9fb #后面是docker 的id
6、查看启动的docker
[root@liunx-node1 ~]# docker ps -a
7、创建并启动容器,但是这个就立刻就退出了
[root@liunx-node1 ~]# docker run centos(这个是镜像的名称) /bin/echo 'hehe' (后面这个是命令)
总结:
搜索镜像:docker search 镜像名称
获取镜像:docker pull 镜像名称
查看镜像:docker images
删除镜像:docker rmi 镜像id
##容器(container)
1、创建容器,并进行操作(下面的命令就是进入到docker里面了)
[root@liunx-node1 ~]# docker run --name mydocker -t -i centos /bin/bash
备注:
–name:指定名称,自定义的
-t:分配一个伪终端tty
-i:让容器的标准输入保持打开状态,和 -t 一定要连用
centos:镜像的名称
/bin/bash:执行的命令,这个是启动容器的时候,让它执行的
启动的时候所做的事情:首先检查centos这个镜像本地有没有,如果没有,它自己就会从dockerhub下载,然后再启动–>利用centos镜像启动容器
2、在docker内部的基本操作
[root@8884f791ef60 /]# ps aux #查看,进程和主机名一样的
[root@8884f791ef60 /]# exit #退出
3、重新启动docker
[root@liunx-node1 ~]# docker ps -a #查看所有的容器,包括运行和不运行
[root@liunx-node1 ~]# docker start docker_id #重新启动docker
[root@liunx-node1 ~]# docker attach docker_id #进入容器,但是这个操作是同步的,如果执行exit,容器就退出了,所以它适合单进程的
4、进入docker后,执行exit,容器还在运行
命令:nsenter(yum -y install util-linux) #通过这个命令也可以进入,但是这个需要docker的pid,建议采用这种方式
[root@liunx-node1 ~]# docker inspect --format "{{.State.Pid}}" docker_id #获取容器的pid
[root@liunx-node1 ~]# nsenter -t pid -u -i -n -p #这样就进去了,如果执行exit,容器也在与运行
#还有一个方法是使用attach进入容器后
使用 Ctrl+P+Q 退出
[root@liunx-node1 ~]# docker rm [-f] docker_id
[root@liunx-node1 ~]# docker run --rm centos /bin/echo 'hehe' #容器停止后自动删除
[root@liunx-node1 ~]# docker kill $(docker ps -a -q) #杀掉所有的docker进程
6、docker启动tomcat项目
#下载tomcat镜像
docker pull tomcat
#创建容器
docker run --name jenpro -p 8081:8080 -t -i tomcat
#访问
http://192.168.16.191:8081
#停止正在运行的容器,将war包拷贝到容器里面
docker cp jenkins.war 74ed665e0c80:/usr/local/tomcat/webapps
#启动容器
docker start 74ed665e0c80
#访问
http://192.168.16.191:8081/jenkins/
#查找容器在硬盘的位置(主要是merged目录)
docker inspect 74ed665e0c80
总结
启动容器:docker run --name -h hostname | docker start
停止容器:docker stop docker_id
查看容器:docker ps -a -l
进入容器:docker exec | docker attach | nsenter
删除容器:docker rm docker_id
##网络访问(network)
1、启动容器
[root@liunx-node1 ~]# docker pull nginx #导入nginx镜像
[root@liunx-node1 ~]# docker run -d -P nginx(镜像名称)
[root@liunx-node1 ~]# docker ps #查看
http://192.168.88.134:32768/ #浏览器访问
[root@liunx-node1 ~]# docker logs docker_id #查看日志
2、自定义映射端口
[root@liunx-node1 ~]# docker run -d -p 81:80 nginx #指定端口映射(物理机端口:容器端口)
http://192.168.88.134:81/ #访问
备注:如果不指定ip,就是所有的ip
总结
随机映射:docker run -P 镜像名称
指定映射:
-p hostPort:containPort
-p ip:hostPort:containPort
-p ip::containPort
-p hostPort:containPort:udp
##存储
1、创建数据卷
[root@linux-node1 ~]# docker run -d -it --name volume-test1 -v /data centos #后台启动
[root@linux-node1 ~]# docker inspect docker_id #查看data在物理机上的哪一个位置
[root@linux-node1 ~]# cd /var/lib/docker/volumes/d35a4fe0949ae604f675241bd45ed35e74fe3259fba43522840da18b9f47914d/_data #如果在这个目录下写入任何东西,在容器的/data目录下都会显示
2、制定目录创建数据卷(将物理机的/home/wwwroot/phpmyadmin挂载到容器的/mnt目录下),一般用于开发,并设置只读权限
[root@linux-node1 ~]# docker run -it --name volume-test2 -v /home/wwwroot/phpmyadmin:/mnt :ro centos
3、挂载文件
[root@linux-node1 ~]# docker run -it -v ~/.bash_history:/.bash_history centos #这样docker容器就可以记录历史命令
4、数据卷容器(让一个容器访问另一个容器的卷,相当于nfs)
[root@linux-node1 ~]# docker run -d -it --name nfs -v /data centos #先启动一个容器,后台运行
[root@linux-node1 ~]# docker run -it --name test1 --volumes-from nfs centos #这个test1的容器的/data目录实际上是挂在的nfs的/data目录,如果在nfs容器的data目录下写东西,test1的data目录是可以看到的
总结
数据卷:类似于nfs
-v /data (/data是容器里面目录)
-v src:dst (指定目录,将物理机的目录,挂在到容器中的哪一个目录)
数据卷容器(让一个容器访问另一个容器的卷)
–volumes-from