什么是docker?

 

1个系统包含多个服务,则需要多个服务器进行部署,后来有了vm虚拟机,则可以节省物理服务器;docker是在虚拟机上的又一个演进;在一台强大的物理机上实现部署多个服务;类似于虚拟机但比虚拟机更好;

把所有的服务包括已经它的依赖redis mq等等一套完整的资源打包成一个镜像,可以快速的拷贝;

容器使用沙箱机制,相互之间完全隔离;

开箱即用 快速部署 可移植性强 环境隔离

windows10专业版以及上下安装docker

Linux Centos7上安装docker

内核版本需要在3.8以上;

下载docker的yum源,安装即可;

Docker镜像的搜索下载以及查看删除

镜像类似于vm中的.ios镜像;

查看本地镜像:docker images

查看社区中的官方镜像:docker search --filter "is-official=ture" centos

下载os7的镜像:docker pull centos:7 如果没有配置阿里云镜像加速,从国外下载,会非常慢

删除镜像:docker rmi 镜像名称

Docker核心技术之配置阿里云镜像加速

登陆阿里云-容器镜像服务-镜像加速器-按照提供的方法进行配置即可;

Docker的体系结构之镜像与容器

容器类似于虚拟机中的2个操作系统,可以理解为是2个容器;这2个操作系统是基于一个镜像创建的;

相互独立,互不影响;

Docker核心基础之容器的构建等基本操作

启动容器:docker run -itd 镜像ID 

docker ps 显示当前正在运行的容器

docker ps -a 显示当前所有的容器

停止容器:docker stop 容器ID

删除容器:docker rm 容器ID   删除前要先停止容器

查看容器的详细信息:docker inspect 容器ID 容器的状态/创建时间/基于哪个镜像等等信息

进入容器:docker exec -it 容器id /bin/bash  (进入到了这个容器,初始时,相当于一个新的linux环境)

启动多个容器,全部停止:docker stop $(docker ps -a -q)

退出容器:exit  (退出后,容器仍然是运行着的)

Docker核心基础之容器的文件复制与挂载

复制文件:docker cp /root/123.txt 容器id:/home/

创建一个容器并挂载:docker run -itd -v /root/xdclass/:/home 镜像ID (-v就是挂载 )挂载和复制的区别是,挂载后宿主机和容器中的内容会同步;

挂载的应用场景:容器中运行着一台mysql数据库服务器,一般会在宿主机中挂载一个路径给容器中的数据库运行,某一天,当前容器出现问题时,可以把这个容器删除,新建一个容器,再把宿主机中的数据库挂载进去,那么数据不会丢失;

构建自定义镜像的意义与应用场景

下载一个centos镜像,就相当于时一个linux环境,初始时是什么都没有的,我们会在基础镜像中安装jdk tomcat等,创建容器后,一旦把这个容器删除,之前安装配置的内容就都没有了;即使通过这个镜像再启动一个容器也是没有的;所以,把这个容器打包成一个镜像,再基于这个镜像启动容器,就可以解决这个问题了;

可以把这个镜像上传到镜像仓库中,其他的服务器用的时候直接拉取来用就可以了;节省重新搭建的时间;

构建镜像有2种方法:

基于docker commit;

基于dockerfile制作镜像;(主流)

Commit构建自定义镜像

docker commit 容器id 容器名:容器标签 这样就把这个容器构建成了一个镜像;

之后再通过这个镜像启动新的容器,在之前的容器中配置的内容都还在;

Dockerfile构建镜像实战

vi dockerfile

写入 dockerfile 命令 

保存

docker build -t 容器名:容器标签   ---运行 dockerfile 并创建镜像

我的理解:dockerfile 的作用不仅仅是构建一个新的镜像,它还可以包含指令,对基础镜像进行配置修改等,构建出新镜像后,启动容器,则没有改变基础镜像;并且可以通过commit命令,把这个容器再构建成一个镜像;

Docker核心知识之镜像分层结构剖析 

 从下往上,依次是一层一层的叠加;

missing表示这一层不是在本机构建的;

 

 当查找某一文件时,进入镜像层从上往下,一层一层的查找,找到后,复制到容器层,可以进行编辑;但始终不会改变原始的镜像层的内容,也即镜像;

优点:

共享资源;

对容器的任何改动,都是放生在容器层;

容器层是可写可读的,镜像是只读的;

Dockerfile基础指令

 

 

 #号:注释

FROM :基于哪个镜像

MAINTAINER:作者信息

COPY:复制文件到容器

ADD:复制文件同时解压

WORKDIR:设置工作路径,如果没有会创建

ENV:设置环境变量

EXPOSE:设置暴露哪个端口给宿主机

RUN:执行后面的命令,作用与镜像层,镜像构建时就执行;dockerfile中有多条时,都会执行;

ENTRYPOINT:执行后面的命令,作用于容器层,容器启动时执行;dockerfile中有多条时,只会执行最后一条;

CMD:执行后面的命令,作用于容器层,容器启动时执行;dockerfile中有多条时,只会执行最后一条;允许被修改;

 

Dockerfile 构建JAVA网站镜像

先在宿主机上配置好 jdk 和 启动 tomcat;

在宿主机中的安装步骤:

上传 jdk 压缩包,解压,配置环境变量;通过 java -version 检测;

 

在宿主机中的安装步骤:

上传 tomcat 压缩包,解压,启动 tomcat;通过 localhost 访问验证是否安装成功;

 

 

 

 

 

 

 

 

 

 

 把容器的 8080 端口,映射到宿主机的 80 端口;启动后,在宿主机上访问 https://localhos:80 则可以正常访问 tomcat;

 

 挂载;把本地目录挂载给容器,之后就在宿主机上进行部署就可以了;

Dockerfile 构建 nginx 镜像

 

在宿主机中的安装步骤:

 

上传 nginx 压缩包,解压,通过shell命令下载依赖包,安装,进入 nginx 文件夹,启动 nginx;通过 localhost 访问 nginx 验证是否安装成功;

 

 

如果直接通过 dockerfile 安装步骤会比较多,会比较慢,那么我们先准备好一个安装 nginx 的 shell 脚本:

 

 

 dockerfile:

注意 shell 脚本和 dockerfile 在同一目录下;

 

 启动容器中的 nginx ,注意,与tomcat一样,也要以前台的方式启动:

 

Dockerfile 构建 redis 镜像

 

 

 redis默认就是前台启动;

 

 

 

 

启动容器:

 

 进入容器:

 

 有 redis 的进程,默认端口是 6379:

进入 redis 客户端,进行一下验证,没有问题:

 

 若宿主机想访问容器中的 redis ,怎么办?当前 redis 的端口是没有暴露的:

 

重新启动一个 redis 容器,把他的端口映射出来:

 

 

 

 

 

 

 

 

 

 

 

 重启容器:

 

 用宿主机连接容器内的 redis:

 

 

 

 

 

 找到 ip 地址:

 

 

 

 

 

 

 

 

 

 

 

 

Dockerfile 快速部署 mysql 数据库并初始

 下载 mysql:

 

 拉取成功:

 

 

 

 

 

 登录,连接 mysql 数据库:

 

 

 

 

 

 镜像默认是无法输入中文的;

 进入容器时,指定字符编码为 UTF-8:

 

 重新创建一个 dockerfile: init.sql 里面就是建库、建表、插入数据的 sql 语句;ADD 与 COPY 的区别,ADD 后会自动执行语句;

 

 

镜像创建好后,启动容器:

 

 连接登录数据库:

 

查看数据插入成功;

 

 

——————————————————————————————————————————————————————————————————————

第四章

 pass

第五章

pass

compose-批量操作容器的工具;

 

 

 公司中Docker镜像仓库使用

 

 

 

 

 

保存镜像: