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容器虚拟化 和 传统虚拟机比较

相同

        容器和虚拟机具有相似的资源隔离和分配优势

不同

        容器虚拟化的是操作系统,虚拟机虚拟化的是硬件

        虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统

           

 

相关阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。