Docker入门学习笔记
Docker
什么是Docker
虚拟化技术
在计算机中,虚拟化是一种资源管理技术,将计算机中的各种实体资源如:CPU、硬盘、内存等予以抽象、转换后呈现出来打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。在实际的生产环境当中,虚拟化技术主要用来解决高性能计算机产能过剩和老旧的机器产能过低的重组重用。对硬件进行最大化利用
虚拟化种类
- 全虚拟化架构
虚拟机的监视器(hypervisor)是类似于用户的应用程序运行在主机的OS之上,如VMware的workstation,这种虚拟化产品提供了虚拟的硬件。可以在一台设备上运行不同内核的操作系统
-
OS层虚拟化技术
-
硬件层虚拟化
硬件层的虚拟化具有高性能和隔离性,因为hypervisor(虚拟机的监视器)直接在硬件上运行,有利于控制VM的OS访问硬件资源,使用这种解决方案的产品有VMwareESXi 和 Xen server
Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor,VMM)。
Hypervisor是所有虚拟化技术的核心。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。 宿主机
Hypervisor是所有虚拟化技术的核心,软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来。常见的产品有:VMware、KVM、Xen等等。Openstack
Docker
特点:
上手快
用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
职责的逻辑分类
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”
快速高效的开发周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)
鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)
Docker组件
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
Docker镜像
镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:
添加一个文件;
执行一个命令;
打开一个窗口。
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。
Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)
Docker容器
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务
Docker安装
使用 yum 命令在线安装
yum install docker
查看 docker 版本
docker -v
启动和关闭
启动 docker
systemctl命令是系统服务管理器指令,它是service 和 chkconfig 两个命令组合。
启动 docker:systemctl start docker
停止 docker:systemctl stop docker
重启 docker:systemctl restart docker
状态 docker:systemctl status docker
开机自启:systemctl enable docker
查看 docker 概要信息:docker info
查看 docker 帮助文档:docker --help
Docker镜像操作
Docker镜像
Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像。
列出镜像:
docker images
列名 | 含义 |
---|---|
repository | 镜像所在的仓库名称 |
tag | 镜像标签,一般对应该镜像的版本号 |
image id | 镜像的ID |
created | 镜像创建日期 |
size | 镜像大小 |
搜索镜像:
docker search 镜像名称
列名 | 介绍 |
---|---|
NAME | 仓库名称 |
DESCRIPTION | 镜像描述 |
STARS | 用户评价,反应一个镜像的受欢迎程度。应该类似于GitHub收藏数?或者是基于某种算法计算而来 |
OFFICIAL | 是否官方 |
AUTOMATED | 自动构建,表示该镜像由Docker Hub自动构建流程创建的 |
拉取镜像
由于一些不可控的原因,我们从中央仓库下载镜像速度是很慢的,学过 MAVEN/NPM 的同学应该也知道,这时候就要我们来使用国内的远程镜像仓库了。
使用远程仓库的方法:
-
编辑该文件:
vi /etc/docker/daemon.json // 如果该文件不存在就手动创建;说明:在centos7.x下,通过vi
-
在该文件中输入如下内容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
-
重启 docker 服务,如果速度还是很慢就重启一下虚拟机
删除镜像
docker rmi $IMAGE_ID:删除指定镜像
docker rmi `docker images -q`:删除所有镜像
Docker容器操作
查看容器
查看正在运行的容器
docker ps
查看所有的容器
docker ps -a
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
创建与启动容器
创建容器命令:
docker run
-
-i:表示运行容器
-
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-
--name :为创建的容器命名。
-
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
交互式容器(前台启动容器)
创建一个交互式容器并取名为mycentos
docker run -it --name=mycentos centos:7 /bin/bash
退出当前容器
exit
守护式容器(后台启动容器)
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复)
docker run -id --name=mycentos2 centos:7
登录守护式容器:
docker exec -it 容器名 (或者 容器ID) /bin/bash(exit退出时,容器不会停止)
停止与启动容器
停止正在运行的容器:
docker stop 容器名/ID
启动已运行过的容器:
docker start 容器名/ID
文件拷贝
将宿主机器的文件拷贝到 docker 容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
将容器中的文件拷贝到宿主机器中
docker cp 容器名称:容器目录 需要拷贝的文件或目录
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。创建容器 添加-v参数 后边为 宿主机目录:容器目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true
来解决挂载的目录没有权限的问题
查看容器IP地址
docker inspect 容器名
对应的字段是 ipaddr
删除容器
docker rm 容器名/ID // 仅支持删除未运行的容器
// 删除所有容器:
docker rm `docker ps -a -q
部署应用
MySQL部署
- 拉取 MySQL 镜像:docker pull mysql
- 创建 MySQL 容器:docker run -id --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
- 进入 MySQL 容器,登陆 MySQL
docker exec -it mysql5.7 /bin/bash
TomCat部署
- 拉取 TomCat 镜像:docker pull tomcat:7-jre7
- 创建 TomCat 容器:
docker run -id --name=tomcat -p 8080:8080 -v /usr/local/myhtml:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7
// -v 就是指定文件映射路径(这里 myhtml是一个CAS单点登陆的工程)
// -p 就是端口映射,可以通过宿主IP:端口 来访问容器里面部署的项目
- 修改web项目中的配置文件,这里修改CAS项目连接的数据库地址为部署 MySQL 的容器的 IP(注意不是宿主机器的IP)
Nginx部署
-
拉取 Nginx 镜像:docker pull nginx
-
创建 Nginx 容器:docker run -id --name=nginx -p 80:80 nginx
-
测试 Nginx
-
配置反向代理:
官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下。在容器内编辑配置文件不方便,我们可以先将配置文件从容器内拷贝到宿主机,编辑修改后再拷贝回去。
从容器拷贝配置文件到宿主机:
docker cp nginx:/etc/nginx/nginx.conf nginx.conf
编辑nginx.conf,添加反向代理配置:
upstream tomcat-cas {
server 172.17.0.7:8080;
}
server {
listen 80;
server_name passport.pinyougou.com;
location / {
proxy_pass http://tomcat-cas;
index index.html index.htm;
}
}
将修改后的配置文件拷贝到容器:
docker cp nginx.conf nginx:/etc/nginx/nginx.conf
重新启动容器
设置域名指向:
这里推荐使用:SwitchHost这个管理Host的小工具。下载地址:https://oldj.github.io/SwitchHosts/
记得以管理员身份运行,这里只能配 IP 和 域名的映射关系,如果想要区别端口,在浏览器输入域名:端口号就OK
Redis部署
-
拉取 Redis 镜像:docker pull redis
-
创建 Redis 容器:docker run -id --name=redis -p 6379:6379 redis
-
测试,在redis目录下启动cmd,输入以下命令: redis-cli -h 宿主机器IP 【端口号默认6379】
C:\develop\redis-2.8.9>redis-cli -h 192.168.40.131
备份与迁移
容器保存为镜像
docker commit 容器名 镜像名
镜像备份
docker save -o mynginx.tar mynginx
// -o 指定输出到的文件名
镜像恢复与迁移
docker load -i mynginx.tar