1、什么是Docker ?
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
容器是完全使用沙箱机制,相互隔离,更重要的是容器性能开销极低。总的来说:docker就是将应用程序与该程序所需要的全部依赖打包在一起(镜像),直接在环境上运行,就可以跑起来,解决了软件跨环境迁移的问题。
2、安装docker
1、yum 包更新到最新
yum update
2、如果安装过docker, 要先进行卸载
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
3、安装需要的软件包,依赖
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
4、设置docker仓库
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
5、安装docker
yum install docker-ce docker-ce-cli containerd.io
6、查看docker版本,检查是否安装成功
docker -v
3、docker的架构
镜像 image :docker镜像就相当于是一个root文件系统
容器 container: 镜像和容器的关系就像面向程序设计中类和对象一样,镜像是静态的定义,容器是镜像运行的实体,容器可以被创建,启动,停止,删除,暂停等
仓库 repository: 仓库可以看做一个代码控制中心 ,用来保存镜像
4、docker命令
docker服务相关命令
启动docker: systemctl start docker
查看docker状态: systemctl status docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
开机自动启动docker: systemctl enable docker
docker镜像相关命令
查看镜像(和远程机器相关):docker images (docker images -q 查询所有镜像id)
搜索镜像(和远程机器相关):docker search redis 此处做个例子
拉取镜像(和本机相关):docker pull redis:5.0,后面不加版本就默认拉最
新的(latest)版本,hub.docker.hub可以看镜像版本。
删除镜像(和本机相关):docker rmi 对应的镜像ID(IMAGE ID),就
可以删除对应的镜像。也可以通过名字和版本号:docker rmi redis:5.0
docker 容器相关命令
创建容器: docker run -it --name c1 centos:7 /bin/bash(-i表示保持容器一直运行,-t表示给容器分配一个伪终端,,就是接下来可以输入终端指令,也可以把-it写一起,--name=c1给容器起名叫c1,等号空格一样,以centos的7版本镜像建立容器,/bin/bash为进入容器的初始化命令指定解释器,exit可以退出镜像)
docker run -id --name c2 centos:7 /bin/bash -d表示后台创建容器,不会立即进入,要通过docker exec命令进入,exit退出也不关闭。
由此可见,-it的容器为交互式容器,-id创建的为守护式容器
查看容器: docker ps(查看正在运行的容器,通过-it建立的容器,一旦exit就会停止运行,在后面加-a可以查看历史的容器)
进入容器: docker exec -it c2 /bin/bash (此时的-it用处和上面一样,进入容器,c2为容器名)
停止容器: docker stop c2(停止c2容器)
删除容器: docker rm c1(删除容器,也可以跟id)
docker rm `docker ps -aq`(删除所有容器,开启的容器不能删)
查看容器信息: docker inspect c2(查看c2容器的信息)可以看到比如数据卷配置信息等
5、容器的数据卷
概念:
数据卷是宿主机中的一个目录或文件,在容器内建立一个目录,挂载上宿主机的目录,此时宿主机的目录就是数据卷,数据卷中数据的修改可以影响到容器内的目录中的数据,双方都可以影响对方。
作用:
1.Docker容器删除后,由于数据卷的对应关系,宿主机中的数据可以得以保留,使得数据持久化。
2.Docker容器和外部机器交换文件,通过数据卷当桥梁,可以实现数据的通信。
3.一个数据卷可以被多个容器的目录挂载,容器之间就可以通过数据卷进行数据交互(一个容器也可以挂载多个目录)
配置:
docker run... -v 宿主机目录(文件):容器内目录(文件)... // 目录必须是绝对路径,如果目录不存在,会自动创建目录 docker run -it --name c1 -v /root/data:/root/data_container centos:7
6、数据卷容器
创建一个容器,挂载一个目录,让其他容器继承自改容器(--vloumes-from)
1.创建启动C3数据卷容器,使用-v参数设置数据卷
docker run -it --name c3 -v /volume centos:7 // -v后面跟的目录是容器内目录,省略宿主机目录,宿主机会自动创建一个数据卷 docker inspect c3 // 使用该命令可以查看c3容器的详细信息
2、创建启动c1 c2 容器,使用 --voumes-from 参数设置数据卷
docker run -it --name c1 --volumes-from c3 centos:7 docker run -it --name c2 --volumes-from c3 centos:7
7、docker 的端口映射
因为容器内的网络服务和外部机器不能直接通信,但是外部机器和宿主机可以直接通信,因此,当外部机器想要访问容器中的网络服务时,可以先将容器中的服务端口映射到宿主机的端口上,外部机器访问宿主机的端口,从而实现对容器内服务的间接访问。
如图:容器中安装mysql,外部机器无法直接访问,那么宿主机用3307端口映射容器内mysql的3306端口,这样,外部机器通过访问3307端口实现对mysql服务的访问。(可以3306映射3306)
8、docker 的应用部署--mysql
mysql的安装
docker search mysql
找mysql版本
docker pull mysql:版本
拉取镜像
mkdir ~/mysql
在根目录下建立mysql文件夹
cd ~/mysql
进入mysql文件夹
下面就是mysql在容器内的部署 docker run -id \
守护进程形式建立容器(\表示下方为同一段指令)
-p 3307:3306 \
容器3306端口映射宿主机3307
--name=c_mysql \
命名为c_mysql
-v $pwd/conf:/etc/mysql/conf.d \
$pwd获取当前路径的conf目录,映射到容器的/etc/mysql/conf.d(mysql的配置文件,方便日后修改配置)
-v $pwd/logs:/logs \
日志目录
-v $pwd/data:/var/lib/mysql \
数据目录,保证数据不因为容器出问题而消失
-e MYSQL_ROOT_PASSWORD=123456 \
-e为环境变量设置,MYSQL_ROOT_PASSWORD为密码
mysql
mysql镜像生成的容器
docker exec -it c_mysql /bin/bash
进入c_mysql容器
mysql -uroot -p123456
输入用户名和设置的密码
9、docker镜像原理
首先介绍一下Linux文件系统,它包含两个部分,bootfs和rootfs (fs :filesystem)
bootfs : 包含bootloader(引导加载程序)和 kernel(内核)
rootfs:root文件系统,包含的就是典型Linux系统中的 /dev /proc /bin /etc等标准目录和文件
不同的Linux发行版,bootfs基本一致,而rootfs不同,如ubuntu,centos等
docker镜像是由特殊的文件系统叠加而成的
最低端是bootfs,并使用宿主机的bootfs
第二层是root文件系统,被称为基础镜像 base image
然后在往上可以叠加其他的镜像文件
统一文件系统技术(union file system)可以将不同的层整合成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在,从用户的角度看,只存在一个文件系统(如图,就可以理解为什么Tomcat镜像有500m -->centos+jdk+tomcat)
一个镜像可以防止另一个镜像的上面,下面的镜像成为父镜像,最底部的称为基础镜像。
当一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器。
思考:
1、docker镜像本质是什么?
是一个分层文件系统
2、docker中一个centos镜像为什么只有200m,而一个centos操作系统的iso文件要几个G?
centos的ISO镜像文件包括bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层,因此较小
3、docker中的一个Tomcat镜像为什么要500m,而一个Tomcat安装包才70多M?
由于docker的分层系统,虽然tomcat只有70m,但是要依赖于父镜像和基础镜像,所有对外暴露的tomcat镜像大约500m
10、镜像的制作
1、容器转为镜像
--- 可写容器包含部分改变(不是目录挂载的都可以改变)
// 容器转镜像 docker commit 容器id 镜像名称:版本号 // 压缩镜像 docker save -o 压缩文件名称 镜像名称:版本号 //解压获得新镜像 docker load -i 压缩文件名称
2、dockerfile
dockerfile是一个文本文件
包含了一条条的指令
每一条指令构建一层 ,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作
对于运维人员:在部署时,可以实现应用的无缝移植
自定义一个centos7,要求默认登录路径为/usr 并且可以使用vim编辑器
构建镜像
docker build -f ./centos_dockerfile -t my_centos:1 . // -f 指定dockerfile的路径 -t 设置新的镜像名称和版本 最后一个. 表示寻址路径
定义一个dockerfile,发布springboot项目
构建镜像
docker build -f ./springboot_dockerfile -t app .
11、服务编排
微服务架构的应用系统一般包含多个微服务,每个微服务都会部署多个实例,如果每个微服务都要手动启动停止,维护的工作量会很大。(如自己用dockerfile build镜像 或者去dockerhub 拉取镜像,创建多个container,管理创建的container等)
服务编排:按照一定的业务规则去批量管理容器。
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
1。利用Dockerfile定义运行环境镜像
2。使用docker-compose.yml定义组成应用的各服务(启动多个程序的顺序,关联关系)
3。运行docker-compose up启动应用
docker-compose 安装
// 安装 curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose //设置文件可执行权限 chmod +x /usr/local/bin/docker-compose // 检查安装是否成功,查看版本信息 docker-compose --version //卸载 rm /usr/local/bin/docker-compose
docker-compose的使用
创建 docker-compose.yml文件,并编写内容
执行 docker-compose up 命令执行docker-compose.yml文件
12、总结
容器就是将软件打包成标准化单元,用于开发交付和部署。
- 容器镜像是轻量的,可执行的独立软件包,包含软件运行所需要的所有内容(代码,运行时环境,系统工具,系统库和设置)。
- 容器化软件在任何环境中都可以始终如一的运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设置上运行不同软件的冲突。
docker容器虚拟化 和 传统虚拟机比较
相同
容器和虚拟机具有相似的资源隔离和分配优势
不同
容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统