Docker的学习

目录

1.【熟悉】docker简介

1.1什么是docker

1.2docker的设计思想

1.3为什么要使用docker

1.3.1更快速的交付和部署

1.3.2更轻松的迁移和扩展

1.3.3更简单的管理

1.3.4docker的局限性

1.4.docker在开发、测试、部署中的定位

1.4.1尝试新软件

1.4.2.进行演示

1.4.3.避免“我机器上可以运行”

1.4.4.更好地利用资源

1.4.5.为微服务定制 

1.4.6.在云服务提供商之间移植

1.4.7.技术的创新   

1.5docker与传统虚拟机的比较

2.【掌握】docker说明

2.1.相关网站

2.2.Docker 下载

2.3.Docker 安装前提说明

2.3.1.CentOS Docker 安装

2.3.2.前提条件

2.3.3.查看自己的内核

2.4.Docker 的基本组成​

3.【掌握】docker安装 

3.1.Docker 安装

3.1.1.确定是centos7的版本

3.1.2.yum安装gcc相关 

3.1.3.卸载旧版本 (如果以前安装过dicker就卸载,没有就跳过)

3.1.4.安装方法

3.1.5.启动docker 

3.1.6.查看版本

3.1.7.测试运行nginx

3.1.9.卸载docker 

4.【掌握】docker加速配置

4.1.说明

4.2.阿里云镜像加速

4.3.相关命令

4.3.1.列出所有镜像

4.3.2.根据镜像id删除镜像

 5.[掌握]docker底层原理

           5.1.Docker是如何工作的

 5.2.docker run了啥

6.【掌握】docker命令[帮助+镜像] 

6.1.帮助命令

6.2.镜像命令6.2.1.docker images  列表本机上的镜像

6.2.2.docker seach 镜像搜索命令

6.2.3.docker pull 镜像下载命令

6.2.4docker rmi 镜像删除命令    

7.【掌握】docker命令[容器]

7.1.什么是容器 

7.2.演示前提

7.3.创建并启动容器

7.3.1.语法

7.3.2.options说明 

7.4.列出当前所有正在运行的容器

7.4.1.语法

7.4.2.语法【options】

7.5.删除容器

7.6.退出容器

7.7.进入正在进行的容器并以命令行交互

7.8.启动停止重启容器

7.9.强制停止容器

 7.10.启用守护式容器

7.11.查看容器日志

7.12.查看容器运行进程

7.13.查询容器内部细节

​ 7.14.进入容器拷贝文件到主机

7.15.在主机拷贝文件到容器

8.【掌握】docker镜像详解

8.1.为什么下载的tomcat镜像很大

8.2.什么是镜像

8.2.1.UnionFS(联合文件系统) 

8.2.2.分层的镜像

8.2.3.为什么docker要使用上面的这种分层结构 

8.3.镜像的特点

8.4.镜像的commit操作

8.4.1.作用

 8.4.2.命令语法

8.4.3.案例演示

 9.【掌握】docker命令总结

10.【掌握】docker容器数据卷 

10.1.什么是容器数据卷

10.2.容器数据卷能做什么

10.3.添加数据卷的方式

10.3.1.直接使用命令添加

10.3.2.使用DockerFile添加 

​10.4.数据卷容器

11.【掌握】Dockerfile详解【1】

​11.2.DockerFile构建过程解析

11.2.1.基础知识

11.2.2.大致流程

11.2.3.总结

11.3.Dockerfile体系结构(关键字---重点啊)

 11.3.1.总结

 12.【掌握】Dockerfile详解【2】

12.1.制作一个带vim centos镜像

12.2.编写Dockerfile     

12.3.使用build+Dockerfile构建镜像

12.4.运行 

13.【掌握】Dockerfile详解【3】

13.1.CMD说明

13.2.ENTRYPOINT说明 

13.3.自定义ls镜像来说明CMD和ENTRYPOINT的区别 

14.【掌握】Dockerfile详解【4】

14.1.自定义tomcat镜像

14.1.1.准备工作

14.1.2.编写Dockerfile

 14.1.3.构建镜像

14.1.4.运行镜像测试 

 15.【掌握】Dockerfile详解【5】

15.1.准备jar和war

15.2.Jar包的打包方式?

15.2.1.上传jar包

15.2.2.编写Dockerfile

​15.2.3.使用Dockerfile构造镜像

 15.2.4.运行镜像  

15.3.war包的打包方式

15.3.1.上传war包

15.3.2.编写Dockerfile

15.3.3.使用Dockerfile构造镜像

15.3.4.运行镜像

16.【了解】本地镜像发布到阿里云

16.1.镜像的生成方法

16.2.本地镜像推送到阿里云

16.2.1.以修改的mywar的image为例来说明

16.2.2.登陆阿里开发平台 

16.2.3.创建镜像仓库

 16.2.4.设置镜像仓库的访问密码

16.2.5.打开阿像页面 

16.2.6.到阿里的公有仓库里面查询试试

16.3.把阿里云的镜像下载到本地

16.3.1.语法

16.3.2.案例

16.3.3.运行测试

17.【掌握】docker常用安装

17.1.安装步骤梳理

17.2.安装tomcat

17.3.安装mysql

17.4使用navcat连接一下

18.【掌握】Docker的四种网络模式 

18.1.概述

18.2.bridge模式 

18.3.host模式 

18.4.none模式

18.5.container模式

19.【掌握】Docker部署记账本 

19.1.思路

19.2.使用docker 运行mysql 并导入bills.sql

19.3.上传war 

19.4.创建Dockerfile 

19.5.运行bills镜像 

19.6.复制容器里面的application.yml

19.7.修改application.yml

19.8.把application.yml 放回容器

19.9.重启容器

19.10.如果是jar 包

19.10.1.使用配置文件的优先级去处理

20.【掌握】关于防火墙的问题


1.【熟悉】docker简介

1.1什么是docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

1.2docker的设计思想

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

总之docker就是集装箱原理。

1.3为什么要使用docker

 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。

传统虚拟机方式运行10 个不同的应用就要起10 个虚拟机,而Docker 只需要启动10 个隔离的应用即可。具体说来,Docker 在如下几个方面具有较大的优势。

1.3.1更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间.

1.3.2更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

1.3.3更简单的管理

使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

1.3.4docker的局限性

1.Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
2.LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
3.隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
4.网络管理相对简单,主要是基于namespace隔离
5.cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
6.Docker对disk的管理比较有限
7.container随着用户进程的停止而销毁,container中的log等用户数据不便收集

1.4.docker在开发、测试、部署中的定位

1.4.1尝试新软件

对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于 Docker,让我们有可能在一条或者几条命令内就搭建完环境。Docker 有一个傻瓜化的获取软件的方法,Docker 后台会自动获得环境镜像并且运行环境。
并不仅仅是新技术环境搭建用得到 Docker。如果你想快速在你的笔记本上运行一个 MySQL 数据库,或者一个 Redis 消息队列,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一条命令便可以运行 MySQL 数据库:docker run -d -p 3306:3306 tutum/mysql。

1.4.2.进行演示

工作中自己开发的成果对客户或者别人做一两个演示。搭建演示环境的过程非常麻烦。Docker是演示这些工具的最合理的方式。同时,对于客户来说,可以直接将 Docker 镜像提供给他们,而不必去做任何环境配置的工作,工作的效果也会和在他们演示中所看到的一模一样,同时不必担心他们的环境配置会导致我们的产品无法运行。

1.4.3.避免“我机器上可以运行”

无论是上一篇介绍的企业部署 Docker 还是本文的个人 Docker 用例,都提到了这个情况。因为环境配置不同,很多人在开发中也会遇到这个情况,甚至开发的软件到了测试人员的机器上便不能运行。但这都不是重点。重点是,如果我们有一个可靠的、可分发的标准开发环境,那么我们的开发将不会像现在这么痛苦。Docker 便可以解决这个问题。Docker 镜像并不会因为环境的变化而不能运行,也不会在不同的电脑上有不同的运行结果。可以给测试人员提交含有应用的 Docker 镜像,这样便不再会发生“在我机器上是可以运行的”这种事情,很大程度上减轻了开发人员测试人员互相检查机器环境设置带来的时间成本。

1.4.4.更好地利用资源

虚拟机的粒度是“虚拟出的机器”,而 Docker 的粒度则是“被限制的应用”,相比较而言 Docker 的内存占用更少,更加轻量级。对我来说这是 Docker 的一个优势:因为在如果在电脑中运行多个 Docker 应用,使用 Docker 比使用虚拟机更加简单,方便,粒度更细,也能持续地跟踪容器状态。

1.4.5.为微服务定制 

我们一直在讲“微服务(Microservices)”的概念。Docker 可以很好地和微服务结合起来。从概念上来说,一个微服务便是一个提供一整套应用程序的部分功能,Docker 便可以在开发、测试和部署过程中一直充当微服务的容器。甚至生产环境也可以在 Docker 中部署微服务。

1.4.6.在云服务提供商之间移植

大多数的云主机提供商已经全面支持 Docker。对于开发人员来说,这表示你可以很方便地切换云服务提供商,当然也可以很方便地将你本地的开发环境移动到云主机上,不需要本地上配置一次运行环境、在云主机上还配置一次运行环境。全面部署 Docker (Docker here and Docker there) 作为标准运行环境可以极大地减轻应用上线时的工作量和产生 BUG。

1.4.7.技术的创新   

Docker 正在快速发展,工具也在不断更新,没有人能预见到未来 Docker 会是什么样子的。你在复杂的系统中 Docker 使用的越多,越是可能会发现技术上的空白和未来技术发展的方向。现在还处在 Docker 的发展期,任何你使用 Docker 创建的工具都有可能成为社区关注的热点。这是 Docker 的机会,也是成就你自己的机会。

1.5docker与传统虚拟机的比较

*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;

*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

2.【掌握】docker说明

2.1.相关网站

https://www.docker.com/  docker的官网
https://docs.docker.com/  文档
https://hub.docker.com/  镜像网站

2.2.Docker 下载

1,官网 http://www.docker.com

2,仓库  https://hub.docker.com

2.3.Docker 安装前提说明

2.3.1.CentOS Docker 安装

Docker支持以下的CentOS版本:
CentOS 7 (64-bit)

2.3.2.前提条件

目前,CentOS 仅发行版本中的内核支持 Docker。

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 或以上

2.3.3.查看自己的内核

uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

uname -r

Docker的学习_第1张图片  

2.4.Docker 的基本组成Docker的学习_第2张图片

3.【掌握】docker安装 

3.1.Docker 安装

3.1.1.确定是centos7的版本

3.1.2.yum安装gcc相关 

1,确定centos7能上外网

2,yum -y install gcc

3,yum -y install gcc-c++

Docker的学习_第3张图片

3.1.3.卸载旧版本 (如果以前安装过dicker就卸载,没有就跳过)

 yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

3.1.4.安装方法

 yum install docker

3.1.5.启动docker 

systemctl start docker

systemctl enable docker 开机自启

3.1.6.查看版本

docker version

3.1.7.测试运行nginx

 测试

Docker的学习_第4张图片

 docker run -p 6379:80 -d nginx

注意:80是ngiux默认的端口,6379是映射宿主机的端口,此时,nginx是从docker仓库里面拉取出来的镜像,运行起来就形成一个容易,nginx是在容器里面运行,我们是访问不到的,必须映射外部宿主机端口,通过访问宿主机端口来访问容器内部的ngiux

一个镜像可以运行成多个容器

3.1.9.卸载docker 

systemctl stop docker

yum -y remover docker

rm -rf /var/lib/docker

4.【掌握】docker加速配置

因为直接从dockerhub上下载镜像很慢

4.1.说明

Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)。

4.2.阿里云镜像加速

Docker的学习_第5张图片

Docker的学习_第6张图片

编辑文件 vim /etc/docker/daemon.json

写入

{

  "registry-mirrors": ["https://32xw0apq.mirror.aliyuncs.com"]

}

刷新配置

systemctl daemon-reload

重启docker

systemctl restart docker

4.3.相关命令

4.3.1.列出所有镜像

docker images

4.3.2.根据镜像id删除镜像

docker rmi 镜像id  
docker rmi -f 镜像id 

5.[掌握]docker底层原理

5.1.Docker是如何工作的

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

Docker的学习_第7张图片

 5.2.docker run了啥

Docker的学习_第8张图片

6.【掌握】docker命令[帮助+镜像] 

6.1.帮助命令

docker version 查看docker版本
docker info 显示全系统信息
docker --help 显示docker相关的所有命令及功能说明

6.2.镜像命令
6.2.1.docker images  列表本机上的镜像

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

docker images -[options]的说明

-a 列表本地的所有镜像及子镜像

-q 只显示镜像ID

--digests 显示镜像的摘要信息

--no-trunc 显示完整的镜像信息

6.2.2.docker seach 镜像搜索命令

docker search 镜像名称

docker search 镜像名称  -[options]   说明

6.2.3.docker pull 镜像下载命令

语法
 
         docker pull 镜像名称:[TAG]
例如: docker pull tomcat:8.5  下载8.5的镜像版本
         dokcer pull tomcat 默认下载最新的tomcat镜像版本 【latest】

6.2.4docker rmi 镜像删除命令    

删除单个   docker rmi -f 镜像ID

删除多个   docker rmi -f 镜像ID1 镜像ID2

                 docker rim -f 镜像名:[tag]  镜像名:[tag]

删除全部

                docker rmi -f $(docker images -qa)

7.【掌握】docker命令[容器]


7.1.什么是容器 

 容器镜像是一个软件的轻量级独立可执行软件包,包含运行它所需的一切:代码,运行时,系统工具,系统库,设置。不管环境如何,集装箱化软件都可以运行相同的Linux和Windows应用程序。容器将软件与其周围环境隔离开来,例如开发环境和生产环境之间的差异,并有助于减少在同一基础架构上运行不同软件的团队之间的冲突。

1.轻量级 

在一台机器上运行的Docker容器共享该宿主机器的操作系统内核; 他们立即开始并使用更少的计算和内存。图像由文件系统层构建并共享公用文件。这最大限度地减少了磁盘使用量,图像下载速度更快。 

2.标准 

Docker容器基于开放标准,可在所有主要Linux发行版,Microsoft Windows以及任何基础架构(包括虚拟机,裸机和云中)上运行。 

3.安全 

Docker容器将应用程序彼此隔离并从底层基础架构中分离出来。Docker提供了最强大的默认隔离功能,可以将应用程序问题限制在一个容器中,而不是整个机器上。

镜像和容器的关系?

镜像和容器的关系就好比Java中类和对象的关系,容器是镜像的实例,镜像运行成为一个个容器

7.2.演示前提

有镜像才能创建容器,这个是根本要求(下载centos镜像来演示)
docker pull centos

7.3.创建并启动容器

7.3.1.语法

docker  run [options]  镜像名:tag/镜像id  [命令or 参数]

7.3.2.options说明 

--name="容器新名字": 为容器指定一个名称;

-d: 后台运行容器,并返回容器ID,也即启动守护式容器;

-i:以交互模式运行容器,通常与 -t 同时使用;

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-P: 随机端口映射;

-p: 指定端口映射,有以下四种格式

      ip:hostPort:containerPort

      ip::containerPort

      hostPort:containerPort

      containerPor

7.4.列出当前所有正在运行的容器


7.4.1.语法

docker ps –[options]

docker ps 列出正在运行的容器

7.4.2.语法【options】

-a  列出所有运行和未运行的容器
-q  列出所有运行中容器的ID
-aq 列出所有运行和未运行的容器的ID

7.5.删除容器

docker rm [options] 容器ID|容器名称  容器ID|容器名称   容器ID|容器名称

options  
            -f  强制删除正在运行的容器或没有运行的容器

docker rm -f  $(docker ps -aq) 删除所有运行和未运行的容器

7.6.退出容器

1,exit:停止容器并退出 
2,ctrl+P+Q  容器不停止退出

7.7.进入正在进行的容器并以命令行交互

docker exec -it 容器ID bash   重新开启一个终端进入容器

docker attach 容器ID  直接使用原来的终端进入容器

7.8.启动停止重启容器

docker start|stop|restart  容器ID或容器名

7.9.强制停止容器

docker  kill  容器ID或容器名称

 7.10.启用守护式容器

#使用镜像centos:latest以后台模式启动一个容器

docker run -d centos

问题:docker ps -a 进行查看, 会发现容器已经退出

很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.

容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动是应的service即可。例如  service nginx start

但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,

这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.

所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行

7.11.查看容器日志

语法(docker logs 容器ID|名称)
如果是后台运行的程序,那么如何查看运行的日志呢?

7.12.查看容器运行进程

docker top 容器ID

7.13.查询容器内部细节

docker inspect 容器ID|名称
显示了容器里面所有内部细节

Docker的学习_第9张图片 7.14.进入容器拷贝文件到主机

语法
docker cp 容器ID(容器名称):容器内文件或文件夹路径   宿主机的路径

7.15.在主机拷贝文件到容器

docker cp   宿主机的路径  容器ID(容器名称):容器内文件或文件夹路径

8.【掌握】docker镜像详解

8.1.为什么下载的tomcat镜像很大

Docker的学习_第10张图片

8.2.什么是镜像


8.2.1.UnionFS(联合文件系统) 

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

8.2.2.分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

8.2.3.为什么docker要使用上面的这种分层结构 

最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

8.3.镜像的特点

Docker镜像都是只读的
当容器启动时,一个新的可写的镜像被加载到镜像层的顶部。
这一层通常被叫做容器层,容器层之下的都叫镜像层

8.4.镜像的commit操作

8.4.1.作用

当镜像运行之后可以修改容器里面的内容,再提交成一个新的镜像

 8.4.2.命令语法

docker commit -m='新的镜像的描述信息' -a='作者' 容器ID 要创建的目标镜像名:[标签名]

8.4.3.案例演示

8.4.3.1.从hub上拉一下tomcat镜像运行

docker run -it -p 8080:8080 tomcat 
p 主机端口:容器端口
P 随机分配端口
i 交互
t 终端
运行后发现webapps里面没有那个5个默认项目

修改的思路

1,解压本的地tomcat
2,运行刚拉取下来的tomcat的镜像成容器
3,把本地的tomcat的Webapps里面的所有文件夹cp 到 运行的tomcat的容器里面
docker cp ./tomcat/webapps/ROOT 45ec37:/usr/local/tomcat/webapps/ 
docker cp ./tomcat/webapps/docs/ 45ec37:/usr/local/tomcat/webapps/ 
docker cp ./tomcat/webapps/manager 45ec37:/usr/local/tomcat/webapps/ 
docker cp ./tomcat/webapps/host-manager 45ec37:/usr/local/tomcat/webapps/ 
docker cp ./tomcat/webapps/examples 45ec37:/usr/local/tomcat/webapps/ 

4,重启tomcat的容器
(1)docker restart 容器ID或名称
5,访问  可以正常访问
6,把新修改的容器提交成一个新的镜像
(1)docker commit -a='leige' -m='有5个项目的tomcat' 45ec37bbf021 mytomcat:9.0
7,运行这个新的镜像
(1)docker run -it -d -p 83:8080 mytomcat:9.0

可以正常访问 

Docker的学习_第11张图片

 总结:拉取下来的tomcat镜像是没有默认的五个项目的,运行拉取的镜像成一个容器,将默认的五个项目拷贝到运行的容器里面,然后制作成为一个新的属于我们自己的镜像,运行新的镜像即可访问五个项目

Docker的学习_第12张图片

 9.【掌握】docker命令总结

Docker的学习_第13张图片

10.【掌握】docker容器数据卷 

10.1.什么是容器数据卷

先来看看Docker的理念:
* 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
* 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。

10.2.容器数据卷能做什么

1,容器数据的持久化
2,容器之间继承和共享数据

10.3.添加数据卷的方式

10.3.1.直接使用命令添加

①语法

  docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash


②查看容器卷是否挂载成功
 docker inspect 容器ID

Docker的学习_第14张图片

③查看容器卷和宿主机的数据共享

在宿主机的mycentos001中创建hello.txt文件并写入数据mycentos001

进入容器查看container001里面有hello.txt文件数据和mycentos001里面的一样

注意:在以上的例子中,默认的只能在宿主机里面写数据。

如果出以下的问题

解决办法:在挂载目录后多加一个--privileged=true参数即可 

④查看容器停止后,主机修改数据是否同步 

 ⑤带权限的处理方式

Docker的学习_第15张图片

10.3.2.使用DockerFile添加 

①在宿主机的根目录下创建mydocker文件夹并进入

Docker的学习_第16张图片

②在当前目录创建一个Dockerfile的文件

Docker的学习_第17张图片 ③编写Dockerfile

 Docker的学习_第18张图片

FROM centos

VOLUME ["/dataContainer1","/dataContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash

 ④build生成一个新的镜像

docker build -f /mydocker/Dockerfile -t laolei/centos .   

#注意后面有一个点哦

Docker的学习_第19张图片

⑤启动容器

docker run -it --name='mycentos' laolei/centos

⑥查看容器里面有两个容器卷
docker inspect 容器ID

Docker的学习_第20张图片

Docker的学习_第21张图片

Docker的学习_第22张图片

10.4.数据卷容器

docker run -d -v /root/webapps:/usr/local/tomcat/webapps -p 8001:8080 tomcat

作用:实现容器之间的数据共享

操作思路

以上面的laolei/centos为镜像,里面有dataContainer1和dataContailer2

启动一个容器dc1  在dataContailer1里面添加dc1.txt

    docker run -it --name='dc1' laolei/centos

    cd /dataContailer1

    touch dc1.txt

启动一个容器dc2 继承dc1  在dataContailer1里面添加dc2.txt

启动一个容器dc3 继承dc2  在dataContailer1里面添加dc3.txt

发现在dc3可以看到dc1.txt dc2.txt dc3.txt

      dc1里面可以看到dc1.txt dc2.txt dc3.txt

删除dc1容器之后在dc2和dc3里面还是可以看到dc1.txt dc2.txt dc3.txt

 说明数据卷容器的生命周期一直持续到没有容器使用它为止

Docker的学习_第23张图片

11.【掌握】Dockerfile详解【1】

1,Dockerfile是用来构建Docker镜像的构建文件,是由一系列的命令和参数构成的脚本

2,Dokcerfile的构建步骤

        编写Dokcerfile文件

        docker build 生成新的镜像

        docker run 运行镜像

3,以centos的镜像为例来说明https://hub.docker.com/_/centos

Docker的学习_第24张图片

Docker的学习_第25张图片11.2.DockerFile构建过程解析

11.2.1.基础知识

1,每条保留字指令都必须为大写字母后面要跟随至少一个参数
2,指令从上到下顺序执行
3,#表示注释
4,每条指令都会创建一个新的镜像层,并对镜像进行提交

11.2.2.大致流程

1,docker从基础镜像运行一个容器
2,执行一条指令并对容器进行修改
3,执行类似于docker commit的操作提交一个新的镜像
4,docker再基于刚提交的新的镜像运行一个新的容器
5,执行Dockerfile的下一个指令再从执行第2点直到没有指令

11.2.3.总结

 从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
*  Dockerfile是软件的原材料
*  Docker镜像是软件的交付品
*  Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。
    Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、
    服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,
    当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。

Docker的学习_第26张图片

11.3.Dockerfile体系结构(关键字---重点啊)

FROM 基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER  镜像维护者的姓名和邮箱地址

RUN  容器构建时需要运行的linux命令

EXPOSE 当前容器对外暴露的端口[只是提示作用,]

WORKDIR 指定在创建容器后,终端默认登陆进来的工作目录

ENV 用来在构建镜像过程中设置环境变量 

ADD 将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理URL和解压tar包

COPY 类似ADD,拷贝文件和目录到镜像中 ,语法COPY src dest  COPY [''src","dest"]

VOLUME 容器数据卷,用于数据保存和持久化工作

CMD 指定一个容器启动时要运行的命令格式CMD['ls']   run -it cenos -lh

        shell:  CMD  <命令>

        exec  CMD ['可执行文件',"参数1","参数2"]

        DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTEYPONT  指定一个容器启动时要运行的命令 ENTEYPORT ['ls']   run -it cenos -lh

            ENTRYPOINT的目地和CMD一样,都是在指定容器启动程序及参数

OBBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后触发父镜像的onbuild

 11.3.1.总结

Docker的学习_第27张图片

12.【掌握】Dockerfile详解【2】

12.1.制作一个带vim centos镜像

Vim    指定工作目录

12.2.编写Dockerfile     

Docker的学习_第28张图片

12.3.使用build+Dockerfile构建镜像

Docker的学习_第29张图片

12.4.运行 

Docker的学习_第30张图片

Docker的学习_第31张图片

13.【掌握】Dockerfile详解【3】


13.1.CMD说明

Dockerfile 中可以有多个CMD的命令,但只有最后一个生效,CMD会被docker run之后的参数替换掉
可以使用tomcat的案例演示

查看tomcat的Dockerfile

从上面的可以看出最后执行了一个catalina.sh的命令  相当于./bin/catalina.sh  
运行如下命令,可以看出下图的效果

docker run -it -p 9999:8080 tomcat ls -lh

Docker的学习_第32张图片

发现这个tomcat的容器启动之后就退出了

那是因为在启动容器的时候后面加了ls -lh那么会覆盖Dockerfile里面的  CMD ["catalina.sh", "run"]

13.2.ENTRYPOINT说明 

使用ENTRYPOINT来运行命令,在run 运行的参数会追加到新的命令后面

13.3.自定义ls镜像来说明CMD和ENTRYPOINT的区别 

目的:讲解CMD和ENTRYOINT的区别
编写Dockerfile

FROM centos    
CMD [ "ls", "-a" ]

构建镜像
docker build -t myls:1.2 .

启动镜像
docker run -it myls:1.2 -lh 

Docker的学习_第33张图片

修改Dockerfile

FROM centos

ENTRYPOINT [ "ls", "-a" ]  

构建镜像

docker build -t myls:1.3 .

运行镜像

docker run -it myls:1.3 -l

Docker的学习_第34张图片 发现 【 -l 】被追加到 ls 后面了哦

14.【掌握】Dockerfile详解【4】

14.1.自定义tomcat镜像

14.1.1.准备工作

下载tomcat8

下载jdk8linux

Docker的学习_第35张图片

#创建目录

mkdir -p /mydocker/mytomcat

#进入目录

cd /mydocker/ mytomcat

#创建文件

#把下载好的tomcat和jdk放到/mydocker/mytomcat里面

14.1.2.编写Dockerfile

Docker的学习_第36张图片

 14.1.3.构建镜像

 docker build -t mytomcat9:1.0 .

14.1.4.运行镜像测试 

 docker run -it --name 'mytomcat-1' -p 9999:8080 mytomcat:1.0

Docker的学习_第37张图片

 15.【掌握】Dockerfile详解【5】

15.1.准备jar和war

Docker的学习_第38张图片

15.2.Jar包的打包方式?


15.2.1.上传jar包

15.2.2.编写Dockerfile

思路: 
java-jar hello.jar
docker run -itd -p 8080:8080 myjar:1.0

Docker的学习_第39张图片
15.2.3.使用Dockerfile构造镜像

 15.2.4.运行镜像  

Docker的学习_第40张图片

15.3.war包的打包方式

15.3.1.上传war包

Docker的学习_第41张图片

15.3.2.编写Dockerfile

Docker的学习_第42张图片

15.3.3.使用Dockerfile构造镜像

15.3.4.运行镜像

Docker的学习_第43张图片

16.【了解】本地镜像发布到阿里云

16.1.镜像的生成方法

1,docker commit
2,Dockerfile

16.2.本地镜像推送到阿里云

16.2.1.以修改的mywar的image为例来说明

16.2.2.登陆阿里开发平台 

https://dev.aliyun.com/search.html   完成登陆

Docker的学习_第44张图片

Docker的学习_第45张图片

16.2.3.创建镜像仓库

Docker的学习_第46张图片

Docker的学习_第47张图片

 16.2.4.设置镜像仓库的访问密码

Docker的学习_第48张图片

16.2.5.打开阿像页面 

Docker的学习_第49张图片

 按里面的操作来就行了

docker login [email protected] registry.cn-hangzhou.aliyuncs.com

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[镜像版本号]

docker push registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[镜像版本号]

Docker的学习_第50张图片

16.2.6.到阿里的公有仓库里面查询试试

Docker的学习_第51张图片

Docker的学习_第52张图片

16.3.把阿里云的镜像下载到本地

16.3.1.语法

docker pull registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[镜像版本号]

16.3.2.案例

Docker的学习_第53张图片

16.3.3.运行测试

17.【掌握】docker常用安装


17.1.安装步骤梳理

1.搜索镜像 docker search mysql
2.拉取镜像  docker pull 
3.查看镜像  docker images 
4.启动镜像   docker run 
5.停止容器   docker stop 容器ID
6.移除容器  docker rm -f 容器ID

17.2.安装tomcat

docker hub好查找tomcat镜像  docker search tomcat

从docker hub上拉取tomcat镜像到本地  docker pull tomcat

使用docker images查看是否有拉取到tomcat
使用tomcat镜像运行镜像成为容器  
    docker run -it -p 8080:8080 tomcat 
                -p 主机端口:容器端口
                -P 随机分配端口
                -i  交互
                -t 终端  

17.3.安装mysql

docker hub上查找mysql镜像 docker search mysql

Docker的学习_第54张图片

 docker hub上拉取mysql镜像到本地  docker pull mysql:5.7

Docker的学习_第55张图片

 使用mysql5.7镜像创建容器运行存在问题

这是因为mysql镜像一启动中在加设置用户名和密码

修改成下面的命令

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  --lower_case_table_names=1

 发现启动起来了

17.4使用navcat连接一下

Docker的学习_第56张图片

18.【掌握】Docker的四种网络模式 

18.1.概述

docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: 
bridge模式:使--net =bridge指定,默认设置; 
host模式:使--net =host指定; 
none模式:使--net =none指定; 
container模式:使--net =container:NAMEorID指定。 
可以使用docker network ls来查看

Docker的学习_第57张图片

18.2.bridge模式 

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将并将一个主机上的Docker容器连接到一个虚拟网桥上。当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ip addr命令是可以看到docker0的,可以认为它是网桥的管理端口,在宿主机上作为一块虚拟网卡使用)。 

具体操作: 

启动容器:(由于是默认设置,这里没指定网络–net =bridge,可以看到容器内创建了eth0) 

Docker的学习_第58张图片

18.3.host模式 

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 
使用host模式启动容器:

Docker的学习_第59张图片

使用host模式启动容器后可以发现,使用ip addr查看网络环境时,看到的都是宿主机上的信息。这种方式创建出来的容器,可以看到host上的所有网络设备。 

容器中,对这些设备有全部的访问权限。因此docker提示我们,这种方式是不安全的。如果在隔离良好的环境中(比如租户的虚拟机中)使用这种方式,问题不大。 

18.4.none模式

在none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 
使用--net =none模式启动容器:

Docker的学习_第60张图片

18.5.container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 
使用--net =container模式启动容器  

Docker的学习_第61张图片

通过该例子可以看出来,两者的网络完全相同。 

19.【掌握】Docker部署记账本 


19.1.思路

1,使用docker 运行一个mysql 把bills.sql导入
2,打包war
3,上传war
4,编写Dockerfile
5,构造镜像
6,运行

19.2.使用docker 运行mysql 并导入bills.sql

Docker的学习_第62张图片

19.3.上传war 

19.4.创建Dockerfile 

Docker的学习_第63张图片

19.5.运行bills镜像 

docker  run -itd -p 8080:8080 --name=bills bills:1.0

19.6.复制容器里面的application.yml

docker  cp bills:/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml ./

19.7.修改application.yml

Docker的学习_第64张图片

19.8.把application.yml 放回容器

docker  cp application.yml bills:/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml

19.9.重启容器

docker restart bills

运行启动项目,访问


19.10.如果是jar 包

19.10.1.使用配置文件的优先级去处理

file:config
file:./
classpath:config
classpath:./
如容器里面的jar包放到了root/bills这个目录
docker cp application.yml bills:/root/bills/application.yml

编写dockerFile

Docker的学习_第65张图片

上传jar包

修改application.yml

构造镜像

运行镜像


把修改好的application.yml放到容器里面和jar包的同级目录

重启docker 容器

20.【掌握】关于防火墙的问题

1,开启,重启docker 运行mysql 外面能不能访问?  能!
2,关闭防火墙   运行mysql 报错!!!
3,关闭防火墙  重启docker   运行mysql 正常

如果系统的防火墙有关闭或开启,请重新启动docker
systemctl restart docker  重启
systemctl start docker  启动
systemctl stop docker  停止
systemctl enable docker 开机自启

你可能感兴趣的:(docker,java)