文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、Docker是什么?
1.1 问题思考
我们开发过程中,会有好几个环境:开发环境、测试环境和生产环境;那么我们的代码在不同的阶段是否会产生“水土不服”的情况呢?比如,我们使用jdk1.8进行开发,测试使用jdk1.7进行测试,程序是否还能正常运行(如1.8的lombok表达式1.7不支持);所以我们单单只是把代码交给别人,就很容易出现各种各样的问题。这就是我们常听到的“我电脑上是好的呀!”
1.2 问题分析
那出现1.1的问题我们要怎么解决呢?想想,你不是水土不服吗,那我连“水土”一起交出去,生成一个容器。这样别人在拿到的就不是单纯的代码,而是一整套的产品(代码+环境)。这样一来,由于容器中的代码和环境和开发环境是完全一致的,所以和开发环境所运行的效果是完全一致的。这样就不会出现由于环境问题导致的bug。
1.3 Docker
为规避环境迁移所引发的问题,我们把软件铲平和其所依赖的环境等其他相关产品,一起打包成容器,这就是docker所解决的问题
- Docker诞生于2013年初,基于Go语言实现,dotCloud公司出品(公司后来改名为Docker Ins);
- Docker从17.03版本之后分为社区版(CE:Community Edition)和企业版(EE:Enterprise Edition);
- Docker是一个开源的应用容器容器引擎;
- Docker可以让开发者打包他们的应用、依赖到到一个轻量级、可以治的容器中,然后发不到任何流行的Linux机器上;
- 容器完全使用沙箱机制,相互隔离;
- 容器性能开销极低;
**总结:docker是一中容器技术,解决了环境的迁移问题。**从而提高了测试、运维的效率,降低了成本。
二、Docker的使用
2.1 Docker架构
Docker架构分为三部分,clients(客户端)相当于我们的Docker命令行,是一系列的Linux命令,用来操作镜像和容器;这些命令会发送给我们的Hosts(主机)的daemon(守护进程,daemon相当于我们运行的Docker),Docker接受到命令之后,如果操作的是镜像,比如说下载,就会从Repository(远程仓库)中下载对应的镜像;
- 镜像(Image): Docker镜像(Image),相当于是一个root文件系统,比如官方镜像Ubuntu:16.04就包含了一套完整的Ubuntu 16.04最小系统的root文件系统;
- 容器(Container): 镜像和容器的关系,就像是Java中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体,可以被创建、启动、停止、删除和暂停等等;
- 仓库(Repository): 仓库可以看成一个代码控制中心,用来保存镜像。
2.2 安装Docker
Docker目前可以运行在Mac、Windows、CentOS、Ubuntu等主流系统上;我们是安装在CentOS 7上;
安装的过程会比较耗时,请耐心等待:
- 更新yum包到最新
yum update
遇到选择输入的就输入 y,然后等到更新完成
2. 安装需要的软件包
yum-util 提供了yum-config-manager功能,另外的两个是devicemapper的驱动依赖;
yum install -y yum-utils device-mapper-persistent-data lvm2
3. 设置yum源
yum-config-manager --add-repo https://download.docker.com
4. 安装docker,出现输入的界面都按 y
-y:表示所有的选择输入都输入y;
5. 查看docker版本,也是校验安装是否成功
docker -v
6. 镜像加速器
阿里云镜像获取地址,登录后,左侧菜单选中镜像加速器就可以看到自己的专属地址:
地址:
7. 配置镜像加速器
在 /etc/docker/daemon.json 文件中,添加刚刚获取镜像地址:
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
如果没有 /etc/docker/daemon.json 路径和地址,可以自己创建,并不是所有的Docker安装之后都有这个路径和文件的。
2.3 Docker命令
2.3.1 进程相关
- 查看Docker服务状态
systemctl status docker
- 停止Docker服务
systemctl stop docker
- 启动Docker服务
systemctl start docker
- 重启Docker服务
systemctl restart docker
- 设置docker开机启动
systemctl enable docker
2.3.2 镜像相关
- 查看镜像
查看本地所有的镜像
docker images # 查看本地所有镜像
docker images -q # 查看本地所有的镜像id
- 搜索镜像
从网络中查找需要的镜像
docker search "镜像名称" # 从网络中搜索需要的镜像
- 拉取镜像
从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本
lastest。
docker pull “镜像名称” # 下载镜像(默认拉取最新版本)
docker pull redis # 下载redis镜像(最新版)
docker pull redis:5.0 # 下载5.0版本的redis镜像
- 删除镜像
删除本地镜像,如果镜像有创建的容器尚未删除,可能导致镜像删除失败;
docker rmi "镜像id" # 删除指定的镜像
docker rmi `docker images -q` # 删除本地所有镜像
删除指定镜像:
删除所有镜像:
2.3.3 容器相关
- 查看容器
docker ps # 查看正在运行中的容器
docker ps -a # 查看所有容器
2. 创建并启动运行容器
docker run "参数"
参数说明
- -i: 保持容器运行。通常与 -t 同时使用,加入 it 这两个参数,容器创建成功后自动进入容器,退出容器后,容器自动关闭;
- -t: 为容器重新分配一个未输入终端,通常与 -i 一起使用;
- -d: 以守护(后台)模式运行容器,创建一个容器在后台运行,需要使用 docker exec 命令进入容器,退出后,容器不会关闭;
- -it: 创建的容器一般称为交互式容器;
- -id: 创建的容器一般称为守护式容器;
- –name: 为创建的容器命名;
docker run -it --name=c1 centos:7 /bin/bash # 创建交互式容器:名字为c1 使用centos7的镜像
docker run -id --name=c2 centos:7 /bin/bash # 创建守护式容器:名为c2,使用centos7的镜像
PS:交互式容器,exit后容器自动关闭,守护式容器会在后台继续执行。
- 进入容器
docker exec -it c2 /bin/bash # 进入c2容器
4. 停止容器
docker stop "容器名称"
- 启动容器
docker start “容器名”
- 删除容器
docker rm "容器id/容器名称" # 无论id还是名称都能删除
- 查看容器信息
docker inspect "容器名称"
2.4 Docker容器的数据卷
2.4.1 概念及作用
思考:
- Docker容器删除后,在容器中产生的数据还在吗?
不在了,删除后,容器中的数据会丢失;
- Docker容器和外部机器可以直接交换文件吗?
不可以,外部机只能访问到宿主机;
- 容器之间如何进行数据交换?
通过第三方数据文件的方式进行交换;
什么是数据卷?
- 数据卷是宿主机中的一个目录或文件;
- 当容器目录和数据卷目录绑定后,对方的修改会立刻同步;
- 一个数据卷可以被多个容器挂载;
- 一个容器可以挂载多个数据卷;
作用:
- 容器数据持久化 ;
- 外部机器和容器之间进行通信;
- 容器之间的数据交换。
2.4.2 使用
容器启动时使用 -v参数 设置数据卷:
docker run ... -v 宿主机目录(或文件):容器内目录(或文件)
PS:注意事项:
- 容器目录必须是绝对路径;
- 如果目录不存在,会自动创建;
- 可以挂载多个数据卷;
- 也可以被多个容器挂载。
2.4.3 演示
- 创建 容器c1 挂载宿主机 /root/data/ 到容器的 /root/data_container 目录:
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
宿主机挂载目录:
容器挂载目录:
宿主机上创建文件,会自动、立刻同步到容器中(反过来也是):
删除容器c1,新建容器c2,挂载到原目录上:
原来c1容器的数据会同步到c2上,达到数据持久化的目的。
- 一个容器挂载多个数据卷
docker run -it --name=c2 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7
- 两个容器挂载同一个数据卷
docker run -it --name=c3 -v /root/data:/root/data_container centos:7 /bin/bash
docker run -it --name=c4 -v /root/data:/root/data_container centos:7 /bin/bash
2.5 数据卷容器
2.5.1 数据卷容器
多容器进行数据交换,多个容器挂载同一个数据卷容器,完成数据交互;简单来说,及时大家都到一个容器的指定数据卷哪里找文件;此时的数据卷不是宿主机上的目录或文件,而是数据卷容器上的;
2.5.2 使用
- 创建容器C3,并使用 -v 参数 设置数据卷:
docker run -it --name=c3 -v /volume centos:7 /bin/bash
2. 创建 c1 c2 容器,使用 –volumes-from 参数,设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
使用 c3数据卷容器挂载到c1,c2容器卷,这时即使c3关闭不影响c1, c2交互
2.5.3 小结
- 创建一个容器,挂载一个目录,让其他容器继承自该容器;
- 通过简单方式实现数据卷配置。