(一)思考

我们之前是如何将项目发布到Linux服务器的?
大致步骤如下:
1、安装jdk
2、安装tomcat
3、将项目war包上传到tomcat的webapps下
4、修改配置文件
5、启动tomcat

这样看似没问题,其实我们想想,发一台机器还好,这几步就完成了,如果我们要将这个项目发布到N多台机器,那么我们是否需要在每个机器上都进行相同的步骤,并且要进行环境兼容性的测试。再来看一个例子,我们现在想部署使用一个成熟的产品,这个产品是用go语言开发的,我该如何部署?go语言运行的环境怎么装?这个项目又该如何部署?还有,一台linux机器上装了很多软件,部署了很多项目,相互之间有干扰怎么办?如果有一项技术,可以解决以上问题或者是更多的问题,是不是很爽?那就是Docker(容器)技术。

(二)什么是docker

在这里插入图片描述
Logo:
那个大鲸鱼(或者是货轮)就是操作系统
把要交付的应用程序看成是各种货物,原本要将各种各样形状、尺寸不同的货物放到大鲸鱼上,你得为每件货物考虑怎么安放(就是应用程序配套的环境),还得考虑货物和货物是否能叠起来(应用程序依赖的环境是否会冲突)。
现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。
Docker就是这整套机制啦

(三)docker可以做什么

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

在这里插入图片描述
在这里插入图片描述

(四)为什么使用docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。具体说来,Docker 在如下几个方面具有较大的优势。

4.1.1 更快捷的交付和部署

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

4.1.2 更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

`
4.1.3 更轻松的迁移和扩展

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

4.1.4 更简单的管理

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

4.1.5 对比传统虚拟机总结

在这里插入图片描述

(五)docker架构

在这里插入图片描述
5.1.1 Docker daemon(Docker进程):

Docker进程是部署在linux操作系统上,负责支撑Docker Container的运行以及本地Image的管理。
`

5.1.2 Docker client:

用户不直接操作Docker daemon,用户通过Docker client访问Docker,Docker client提供pull、run等操作命令。
`

5.1.3 Docker Image:

Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
`

5.1.4 Docker Container:

Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
`

5.1.5 Docker Registry:

仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
`

(六)docker 安装

在这里插入图片描述
Docker可以在上面的操作系统里面安装,系统推荐是Ubuntu,因为咱们之前用的是centos,所以讲的也是centos

docker的下载与安装

6.1 (安装)

yum install -y docker

在这里插入图片描述
6.2(启动)

systemctl start docker

在这里插入图片描述
linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,–selinux-enabled=false,

6.1.1(解决方法)

vi /etc/sysconfig/docker

在这里插入图片描述

6.3(关闭)

service docker stop
systemctl stop docker

6.4(重启)
守护进程重启 systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 service docker restart

6.5(运行hello-world)
在这里插入图片描述
docker 检查到本地仓库没有名称为:hello-world 的镜像,马上从官方仓库中拉取了该镜像,然后执行,hellow-world

(七) 镜像

在这里插入图片描述
7.1获取镜像
7.1.1. 镜像加速
dockerdocker官网因为在国外,所以下载非常慢,并且很容易断开,所以一般使用国内的镜像.在国内,阿里云、163都提供了docker仓库,但是阿里云还提供了加速功能。所以,我们选用阿里云的加速。 163的仓库地址:https://c.163.com/hub#/m/home/使用阿里云器,需要到阿里云进行注册,获取到自己专属的加速地址,当然也可以使用我的加速地址。(使用加速是无需登录的,所以可以公用)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7.1.2.安装提示配置就行

[root@zhiyou02 ~]# vi /etc/docker/daemon.json
在这里插入图片描述
"registry-mirrors": ["https://v31i9ua3.mirror.aliyuncs.com"] 我的加速地址

7.1.3.重启

service docker restart
在这里插入图片描述
7.2 查找镜像:mysql
在这里插入图片描述
7.2.1 展示版本
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7.3 选择版本下载镜像

Docker pull 镜像名 默认是最新版本

Docker pull 镜像名:版本号

docker pull mysql:5.5
在这里插入图片描述
7.4 显示所有镜像

docker images
在这里插入图片描述
7.5 删除某个镜像
删除镜像通过命令docker rmi 镜像id完成,需要注意的是,删除镜像前,要删除所有使用到该镜像的容器。

docker rmi 49 #输个前缀就行了
在这里插入图片描述
7.6 镜像搜索
Docker search 镜像名

(八)容器

在这里插入图片描述
8.1 查找所有容器
通过docker ps命令查看正在运行的容器列表,需要查询所有的容器需要加-a参数:
docker ps
docker ps -a
在这里插入图片描述
8.2 创建一个容器(创建一个MySQL容器)

8.2.1 下载 mysql 镜像
docker pull mysql
在这里插入图片描述
8.2.2 创建并且运行容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
在这里插入图片描述
–name:给新创建的容器命名,此处命名为mysql
-e:配置信息,此处配置mysql的root用户的登陆密码
-p:端口映射,此处映射主机3306端口到容器mysql的3306端口 ;前面的3306是映射后的,后面的是mysql默认的
-d:成功启动容器后输出容器的完整ID,容器在后台运行
最后一个mysql指的是mysql镜像名字

8.2.3 查看运行中的容器
在这里插入图片描述
8.2.4 进行容器
有些时候我们需要进入容器内,做一些操作,比如,修改配置文件等。
进入容器,docker exec -it 容器名 /bin/bash
此处进mysql容器
docker exec -it mysql /bin/bash
在这里插入图片描述
在这里插入图片描述
8.2.5 退出容器
exit;

8.3 停止容器
停止容器有2种方式:
1、docker stop 容器名或容器id
2、docker kill 容器名或容器id
在这里插入图片描述
8.4 删除容器
docker rm 容器名
在这里插入图片描述

(九) 仓库

在这里插入图片描述

9…1 阿里云仓库

阿里云既提供了加速功能,也提供了仓库功能,也就是我们可以将自己的镜像上传到阿里云仓库

9.2 创建阿里云仓库
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
9.3 推送mysql镜像到阿里云

9.3.1 登录:
docker login --username=534839731@qq.com registry.cn-hangzhou.aliyuncs.com
在这里插入图片描述
9.3.2.第三部,给镜像打tag:

docker tag mysql registry.cn-hangzhou.aliyuncs.com/xufengwu/zhiyou:mysql
在这里插入图片描述

9.3.3.推送镜像到阿里云

docker push registry.cn-hangzhou.aliyuncs.com/xufengwu/zhiyou:mysql
在这里插入图片描述
9.3.4. 到阿里云上面查看
在这里插入图片描述
9.4 从阿里云上下载镜像

9.4.1. 先将本地的删除
Docker rmi xxx
在这里插入图片描述
9.4.2 从阿里云拉取

9.4.2.docker pull registry.cn-hangzhou.aliyuncs.com/xufengwu/zhiyou:mysql

在这里插入图片描述

(十). 给自己构建一个镜像

构建Docker镜像有以下两种方法:
使用docker commit命令。
使用docker build命令和 Dockerfile 文件。
不推荐使用docker commit来构建镜像,而应该使用更灵活、更强大的Dockerfile来构建

10.1 命令详解

在Dockerfile中用到的命令有
FROM
    FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。
    FROM 一定是首个非注释指令 Dockerfile.
    FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。
    如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本。
MAINTAINER
    这里是用于指定镜像制作者的信息
RUN
    RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。
    层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。
    RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。
ENV
    ENV指令可以用于为docker容器设置环境变量
    ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。
USER
    USER 用来切换运行属主身份的。Docker 默认是使用 root,但若不需要,建议切换使用者身分,毕竟 root 权限太大了,使用上有安全的风险。
WORKDIR
    WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。
COPY
    COPY 将文件从路径 <src> 复制添加到容器内部路径 <dest><src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url,<dest> 是目标容器中的绝对路径。
    所有的新文件和文件夹都会创建UID 和 GID 。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
ADD
    ADD 将文件从路径 <src> 复制添加到容器内部路径 <dest><src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。<dest> 是目标容器中的绝对路径。
    所有的新文件和文件夹都会创建UID 和 GID。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
VOLUME
    创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
EXPOSE
    EXPOSE 指令指定在docker允许时指定的端口进行转发。

CMD
    Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。
    CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。
    当你使用shell或exec格式时,  CMD 会自动执行这个命令。
ONBUILD
    ONBUILD 的作用就是让指令延迟執行,延迟到下一个使用 FROM 的 Dockerfile 在建立 image 时执行,只限延迟一次。
    ONBUILD 的使用情景是在建立镜像时取得最新的源码 (搭配 RUN) 与限定系统框架。
ARG
    ARG是Docker1.9 版本才新加入的指令。
    ARG 定义的变量只在建立 image 时有效,建立完成后变量就失效消失
LABEL
    定义一个 image 标签 Owner,并赋值,其值为变量 Name 的值。(LABEL Owner=$Name )

ENTRYPOINT
    是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。

(十一).构建一个Tomcat镜像

11.1 将jdk和tomcat上传并解压至一个目录下
在这里插入图片描述
在这里插入图片描述
11.2 创建Dockerfile文件
在这里插入图片描述
11.3 下载一个centos作为基础镜像
在这里插入图片描述
11.4 编写 Dockerfile 文件

##
#####tomcat的基础镜像,提前下载好
FROM centos   
#维护者  
MAINTAINER xfw
#这个环境变量用来表名该镜像模板的最后更新时间
ENV REFRESHED_AT 2019-3-5   

#切换镜像目录,进入/usr目录
WORKDIR /usr
#在/usr/下创建jdk目录,用来存放jdk文件
RUN mkdir jdk
#在/usr/下创建tomcat目录,用来存放tomcat
RUN mkdir tomcat

#将宿主机的jdk目录下的文件拷至镜像的/usr/jdk目录下
ADD jdk1.8.0_141 /usr/jdk/
#将宿主机的tomcat目录下的文件拷至镜像的/usr/tomcat目录下
ADD apache-tomcat-8.5.34 /usr/tomcat/

#设置环境变量
ENV JAVA_HOME=/usr/jdk
ENV CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH

#公开端口
EXPOSE 8080
#设置启动命令
ENTRYPOINT ["/usr/tomcat/bin/catalina.sh","run"]

11.5 构建镜像 (后面有个.)

docker build -t zhiyou/tomcat .
在这里插入图片描述
11.6 创建容器并且运行

docker run --name tomcat -p 8080:8080 -d zhiyou/tomcat
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

更多推荐