Docker 的使用
Docker简介
1.什么是虚拟化
在计算机中虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存及存储等,予以抽象,转换后抽象处理,打破实体结构间不可切割的障碍,使用户可以比原本的组态来更好的使用这些资源,这些资源的新虚拟部分是不受现有资源的架设方式,地域,或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,对资源充分利用。
虚拟化技术种类有多种,例如软件虚拟化,硬件虚拟化,内存虚拟化,网络虚拟化,桌面虚拟化,虚拟机等。
2.什么是Docker?
“Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。 ”
3.为什么选择Docker?
(1) 上手快
用户仅需要几分钟就可以把自己的应用程序docker化,docker依赖于写时复制的模型,使修改应用程序也非常迅速,可以达到随心所欲,代码即改的境界。
随后就可以使用docker 容器来创建应用程序了,大多数应用程序只需要不到一秒钟就可以启动,由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户充分的利用系统资源。
(2)职责的逻辑分类
使用Docker 开发人员只需要关系容器中运行的应用程序,而运维人员只需要关心如何管理容器,Docker设计的目的就是为了加强开发人员写代码的开发环境与应用程序部署的生产环境的一致性,从而降低那种开发时一切都正常,上线后老出问题的问题。
(3)快速高效的开发生命周期
Docker的设计目标之一就是缩短从开发,测试到部署,上线的周期,让你的应用程序具有可移植性,易于构建并易于协做。
(4)Docker还鼓励面向服务的体系结构和微服务架构,Docker推荐单个应用程序只运行只运行一个应用程序或者进程。这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。
Docker组件
1.Docker的服务器与客户端
Docker 是一个C/S架构,Docker客户端只需要向docker 服务器或者docker守护进程发出请求,服务器或者守护进程完成所有的工作并返回结果,Docker提供了一套命令行工具Docker 以及一整套完整的RSSTful API ,你可以在同一台宿主机上运行docker 守护进程或者客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程docker守护进程。
Docker 的镜像与容器
镜像是构建docker 的基石,用户基于镜像来运行自己的容器,镜像也是docker 生命周期中的“构建”部分,镜像是一种基于联合文件系统的一种层次结构,有一系列指令一步一步构建出来,例如:
- 添加一个文件
- 执行一个命令
- 打开一个窗口
也可以将镜像当作容器的源代码,镜像体积很小,非常便携,易于分享,存储和更新。
Docker可以帮助你构建和部署容器,你只要把自己的应用程序打包放进容器即可,容器是基于镜像启动起来的,容器可以运行一个或多个进程。我们可以认为,镜像是上生命周期中的构建或者打包阶段。而容器则是启动和执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器安装我们需要的应用或者服务。所以docker容器就是
- 一个镜像格式
- 一系列标准操作
- 一个执行环境
Docker借助了标准集装箱的概念,标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计模式中,唯一不同的是集装箱运输货物,docker 是运输软件。
和集装箱一样,docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web 服务器还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容装载进去。
Docker也不关心你要把容器运到何方,我们可以在自己的笔记本中构建容器,上传到retistry,然后下载到一个物理或者虚拟的服务器来测试,在把应用程序部署到主机中,像标准集装箱一样,Docker容器方便代替,可以叠加,易于分发。并且尽量通用。
Registey(注册中心)
docker是用registry 来保护用户构建的镜像。Registry 分为公共和私有两种,Docker公司运营公共的Registry 叫做Docker Hub ,用户可以在docker hub 中注册账号,分享保存自己的镜像。
Docker的安装和启动
1.安装docker
Docker 官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般docker 出现问题Ubuntu 是最新更新和打补丁的,当然我们也可以将docker安装到Centos上,但是建议安装在centos7.x 以上的版本中,在这之前的版本安装前需要安装其他许多不同的环境并且好多补丁不支持。
安装步骤如下
- 将yum 包更新到最新
sudo yum update
- 安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum 源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
sudo yum install docker-ce
- 安装后查看docker 的版本
docker -v
2.设置ustc 的镜像
ustc是老牌的Linux 镜像服务提供者了,ustc 的镜像加速器速度很快,ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
- 编辑配置文件
vim /etc/docker/daemon.json( 需要用root 命令编辑)
在该文件中输入如下内容:
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
Docker 的启动与停止
启动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 常用命令
1.镜像相关命令
查看镜像
docker imagers
第一列表示:进行名称
第二列 TAG:镜像标签
第三列:IMAGE ID:镜像id
第四列:CREATED:镜像的创建日期(不是获取该镜像的日期)
第五列:SIZE: 镜像大小
这些镜像都存储在宿主机的 /var/lib/docker 目录下
搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
第一列:Name 仓库名称
第二列:镜像描述
第三列:STARS 用户评价,反应一个镜像的受欢迎程度
第四列:是否官方
最后一列:自动构建,表示该镜像由Docker Hub 自动构建流程创建的。
拉取镜像
拉取镜像就是从中央仓库将镜像下载到本地
docker pull 镜像名称
例如我下下载centos7的镜像
docker pull centos:7
删除镜像
按镜像id 删除镜像
docker rmi 镜像id
删除所有镜像
docker rmi `docker images -q`
2. 容器相关的命令
查看容器:
查看正在运行的容器:
docker ps
查看所有容器
docker ps -a
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status-exited
3 创建与启动容器
创建容器常用的启动说明
创建容器命令:docker run
-i :表示运行容器
-t : 表示容器启动后会进入其命令行,加入这两个参数后创建的容器就能登录进去了,即分配一个伪终端。
–name(两个- 中间有空格):创建容器的名称
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)可以用多个-v 做多个目录或文件的映射。注意:最好做目录映射时,在宿主机上做修改,然后共享到容器上。
-d 在run 后面加-d 参数则会创建一个守护式的容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后会自动进入容器。)
-p 表示端口映射,前着是宿主机端口,后者是容器内的映射端口,可以用多个-p 做多个端口的映射。
1.交互方式创建容器
docker run -it --name=容器名称 镜像名称 : 标签 /bin/bash
这时通过docker ps 命令查看,发现可以看见启动的容器,状态为启动状态。
退出当前容器
exit
- 创建守护式的容器
docker run -di --name=容器名:镜像名
进入守护式创建的容器中
docker exec -it 容器名/bin/bash
退出交互式创建的容器仍用
exit
4. 停止与启动容器
停止容器
docker stop 容器名称( 或容器id)
启动容器
docker start 容器名称(容器id)
5.文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp 命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
5.目录挂载
我们可以在创建容器的时候将宿主机的目录与容器的目录进行映射,这样我们就可以通过修改宿主机的目录来影响容器的目录。
创建容器的时候加-v 参数 的后面为 宿主机目录:容器目录 例如:
docker run -di -v /var/local/myhtml:/var/local/myhtml --name=容器的名称 镜像名
如果你共享的是多级目录,可能会出现权限不足的提示,这是因为centos7 中的安全模块selinux 把权限禁用掉了, 我们需要添加参数 --privileged=true 来解决挂载目录没有权限的问题。
6.查看容器的ip地址:
我们可以通过如下命令查看容器运行的各种数据
docker inspect 容器名称(或容器id)
也可以通过执行以下命令直接输出ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
删除容器
docker rm 容器名称(容器id) 删除容器之前需要把容器停掉
Docker 部署Redis
- 拉取镜像
docker pull redis
2.创建容器
docker run -di --name=zjj_redis -p 6379:6379 redis
3.远程连接redis
redis-cil -h 远程host
Docker的迁移与备份
- 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
例如保存redis 镜像
docker commit zjj_redis zjj_redisi
- 镜像备份
我们可以通过以下命令将镜像保存为tar文件
docker save -o zjj_redis.tar zjj_redisi
- 镜像的回复与迁移
如果在同一台机器做恢复需要删除掉之前的镜像(删除容器的步骤:先停止容器启动的服务,再删除容器,最后才可以删除镜像,否则会报错)
恢复镜像用以下命令:
docker load -i zjj_redis.tar
i : 表示输入文件
执行后再次查看镜像,可以看到镜像已经恢复。
Dockerfile
1.什么是dockerfile
Dockerfile 是由一系列命令和参数构成的脚本,这些命令运用于基础镜像,并最终创建一个新的镜像。
他的优点:
1)对于开发人员:可以为开发团队提供一套完全一致的开发环境
2) 对于测试人员:可以通过开发时所用的镜像或者通过dockerfille文件创建一个新的镜像。
3)对于运维人员:在部署时可以实现无缝移植
- dockerfile的常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创作者 |
ENV key value | 设置环境变量(可以写多条) |
RUN command | 是dockerfile 的核心部分(可以写多条) |
ADD source_dir/filedest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件则会在复制后自动解压 |
COPY source_dir/filedest_dir/file | 和ADD相似,但是如果由压缩文件则不能解压 |
WORKDIR path_dir | 设置工作目录 |
- 使用脚本创建镜像(例如创建jdk的镜像)
1)创建一个目录
mkdir -p /usr/local/dockerjdk8
- 下载jdk8的文件并上传到服务器刚才创建的目录中
3) 创建文件Dockerfile (同样是在刚才创建的目录下)将下列命令输入其中
# 镜像依赖的名称或ID(当镜像不存在时会去拉取)
FROM centos:7
# 指定镜像的创建者信息
MAINTAINER zhangjunjie
# 切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径的jia,把jdk添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置Java的环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar;$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
- 执行命令构建镜像
注意后面的空格和点不要省略
docker build -t='jdk1.8' .
5)执行完后使用docker img 命令查看镜像是否构建完成
Docker 私有仓库
1.私有仓库的创建与配置
1) 拉取私有仓库镜像
docker pull registry
- 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
打开浏览器访问如下地址,出现以下情况表示私有仓库搭建成功,并且仓库内容为空
4)修改daemon.json
vim /ect/docker/daemon.json
添加以下内容,保存退出
{
"insecure-registries":["机器的ip:5000"]
}
此步是让docker 信任私有仓库
5)重启docker 服务
systemctl restart docker
- 将镜像上传至私有云仓库
标记此镜像为私有仓库镜像
docker tag jdk1.8 私有云仓库的ip:5000/jdk1.8
上传标记的镜像
docker push 私有云仓库的ip:5000/jdk1.8