700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Docker从入门到精通

Docker从入门到精通

时间:2019-09-10 05:36:42

相关推荐

Docker从入门到精通

文章目录

1. 容器化技术介绍1.2 docker 为什么比虚拟机快2. CentOS安装Docker3. 阿里云加速服务4. Docker基本概念4.1 采用docker engine 操作应用程序4.2 Docker Engine的组成部分4.3 这种cs的结构,带来的好处是什么?4.4 镜像和容器的概念5. Docker 常用的命令6. dockerHub的介绍7. Tomcat容器内部结构8. Dockerfile构建镜像9. Dockerfile的基础命令10. Dockerfile如何执行命令10.1 Run10.2 ENTRYPOINT10.3 CMD10.4 shell 和exec的区别10.5 实战 构建redis镜像11. 容器间link 单向通信12. Bridge网桥双向通信14. Volume 容器间共享数据15. docker compose15.1 docker compose 的作用15.2 docker compose 的安装15.3 利用docker-compose 部署一个wordPress博客16 docker compose 实战

1. 容器化技术介绍

容器化技术的发展主要分为三个阶段。 物理机时代->虚拟化技术->容器化技术

物理机时代:其实就是类似我们常见的机房,是真实纯在的机器。

缺点

部署非常慢:当我们部署一个springboot项目,可以需要安装操作系统,jdk,tomcat,等一些列依赖环境。成本很高:目前一台物理机随便一个一年也起码几万资源浪费:比如一个服务器,他的cpu很高,但是磁盘比较小,但是此时你的项目是做大量数据存储,你的cpu性能就完全浪费啦。难于扩展与迁移:比如我要迁移springboot,很难把系统和java环境一并给他牵过去受限于硬件:有些软件会对硬件有比较高的要求,比如elasticsearch对运行内容的问题

虚拟化时代: 在一台机器上,分出其他系统,比如vmware,我们在自己的win10系统的中,分配中一部分cpu,内存 给虚拟机

优点

多部署:还是上面vmware的列子,你虚拟机出问题啦,不会对你win10系统有影响资源池:可以自由分配每个虚拟机有多少cpu,内存,这些资源都是独享,不会被抢占

缺点

必须每台都要安装操作系统,就跟刚才说的一样,你用vmware给你win10创建一个虚拟机,你必须每台都要安装操作系统

容器化时代:可以简单的理解为,不用安装操作系统的虚拟化技术

从上面的图我们可以知道,容器化技术,他把HostOS作为底层,每个APP使用的HostOs操作系统都是共享。而虚拟化技术,则是必须每个APP都需要安装他们对应的操作系统。

提问:有了容器化技术啦,是不是就不需要虚拟化技术啦

容器化虽然有虚拟化技术没有优点,但是我们还是不能放弃虚拟化技术。

因为容器化技术他注重的是APP之间的隔离,比如打包依赖环境,比如们我项目中,给生产发版需要教运维,怎么配置config,配置环境。稍微有一个失败,就可能导致全局失败。而如果用了docker,就类似把这些以来全部压缩到一个文件,运维只需要拿到镜像,发布即可。

而虚拟化技术是物理资源层面的隔离,他可以随便分配cpu和内存之类的资源。两者注重的层面是不一致的。

1.2 docker 为什么比虚拟机快

docker比虚拟机有更少的抽象层

由于docker 不需要hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源. 因此在cpu,内存利用率上docker会更有明显优势docker 利用的是宿主机内核,他不需要加载操作系统的os内核.

z

2. CentOS安装Docker

安装参考官方链接:/engine/install/centos/

安装环境要求:需要一个CentOS 7或8的维护版本

安装环节

1. 安装组件

yum -y install gcc

yum -y install gcc-c++

yum -y install yum-utils

2. 设置yum安装源头

yum-config-manager --add-repo /docker-ce/linux/centos/docker-ce.repo

3. 优先使用较快的yum

yum makecache hostfile ## 适用于centos 7

dnf makecache ## 适用于centos 8

4. 安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

##docker-ce 代表的是开源的社区版本

5. 启动docker

service docker start

6. 查看版本号

docker version

3. 阿里云加速服务

进入阿里云官方,然后找到

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://9ih5llc0."]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

安装过程中遇到的汇总

1: Failed to start Docker Application Container Engine.

把刚配置的daemon.json上传到本地文件,检查下空格前是否有类似 ---- 的特俗字符

2:color=“blue”>inotify_add_watch(7, /dev/dm-3, 10) failed: No such file or directo

利用journalctl -xe 查看看到如下信息

原因:是因为 xfsprogs 版本太低了。 解决方案:yum update xfsprogs

4. Docker基本概念

4.1 采用docker engine 操作应用程序

我们提到了诸如像镜像容器这样的专业名词。可能此时你有点一头雾水。 那么本节课咱们就来介绍这些基本的概念。让你对docker 首先有一个全面的了解。

首先作为docker,他被称为是一个容器化平台。注意我的用词,它是一个平台,所有的应用程序。都是基于这个平台来运行的,作为docker 这个平台提供了一个标准化的打包与运行程序的方式。通过下面这个图,我们可以清晰的了解到。

比如我们采购了一台物理机,或者采购了一台阿里云,腾讯云的虚拟机。这些能看得见,摸得着的,都被称之为可用资源,其中包含了c p u 硬盘、内存等等。但是我们的应用程序。并不是像以前一样去直接操作这些合用资源,而取而代之是应用程序面向docker 引擎,也就是英文。docker engine 来尝试获取这些可用资源。大家看到这个中间层docker 引擎像什么吗?如果你对java 稍微熟悉一点,你会发现这其实和我们java 中的j v m 虚拟机非常的像,其中最关键的也就是。无论是docker 平台上的应用程序,还是我们java 中的应用程序,都不再直接面向底层的资源,而是通过一个中间层来进行操作。那么对于这个docker 引擎的部分,它又包含了三个子组件。咱们来看一下。

4.2 Docker Engine的组成部分

在这个docker 体系结构中,我们把关注点先放在左侧这个圆中。

docker 引擎呢它包含了三个部分,分别是

最核心的docker服务器,我们也称为docker demon 守护进程。

最核心的服务器上里边有一个核心的进程叫做docker daemon。所有的docker 服务全都是由这个部分来处理完成的。诸如像竞相的获取容器的创建,哎,这都是docker daemon它的主要职责

Rest Api 的通信层:在外侧。有一个基于rest api 的通信层以及最外层。

那底层大家发现因为是基于restapi 进行通信的,所以他们应用的协议是http 也就是我们标准的web 应用的协议。正是因为基于了外部应用http 的协议,所以docker 的兼容性与扩展性是很好的

Docker 的客户端: 这个大圆代表了我们docker 的客户端。

4.3 这种cs的结构,带来的好处是什么?

服务器和客户端呢可以不用安装在同一台电脑上

就拿这个。图为例,比方说这是一个运维工程师,他管理了三台服务器,那么这三台服务器都启动了,docker 的服务器进程,也就是里边每一个都运行了docker-demon,作为运维这端呢,他只需要安装docker 的客户端,由这个客户端向每台服务器对外暴露的rest api。在完成对镜像或者容器的管理,正是基于c s 这种形式的存在。那么一个运维工程师就可以通过电脑,通过网络来管理很多台服务器了,这样呢可以极大的提高我们程序管理运维的效率。

4.4 镜像和容器的概念

镜像

作为docker 中最基础的文件呢是镜像文件,镜像文件是只读的。

他提供了完整。运行程序的软硬件资源是应用程序的集装箱。

这里有两个关键词,首先镜像它是一个文件。

其次,文件包含了所有的软硬件资源。

容器

容器是镜像的实例,由docker 负责创建。

容器之间是彼此隔离的。

每一个容器和容器之间独立管理资源呢也互不冲突。

通俗解释:

镜像你可以把它看成Java中的类,而容器可以看做是类的实例化对象–>容器是镜像的实例,由docker 负责创建。镜像是文件,容器是进程容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。

5. Docker 常用的命令

帮助启动类命令

启动docker : systemctl start docker停止docker: systemctl stop docker重启docker: systemctl restart docker查看docker状态: systemctl status docker开机启动: systemctl enable docker查看docker概要信息: docker info查看docker总体帮助文档: docker --help查看docker命令帮助文档: docker 具体命令 --help

镜像命令

列出本地主机上的镜像 :docker images

-a :列出本地所有的镜像(含历史映像层)

-q :只显示镜像ID。

搜索镜像: docker search 镜像的名称

–limit : 只列出N个镜像,默认25个

docker search --limit 5 redis

拉取镜像: docker pull 镜像的名称[:TAG]

每没有Tag就是最新版

查看镜像/容器/数据库占用的空间: docker system df删除镜像 docker rmi 某个镜像的名字Id

删除单个 docker rmi -f 镜像ID

删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部 docker rmi -f $(docker images -qa)

容器命令

新建+启动容器: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明(常用)

-name=“容器新名字” 为容器指定一个名称;

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

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

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

也即启动交互式容器(前台有伪终端,等待交互);

-P: 随机端口映射,大写P

-p: 指定端口映射,小写p

docker run -p(端口映射) 8000(宿主机端口):8080(docker容器端口号) -d(后台启动) tomcat

列出当前所有正在运行的容器:docker ps [OPTIONS]

OPTIONS说明(常用):

-a :列出当前所有正在运行的容器+历史上运行过的

-l :显示最近创建的容器。

-n:显示最近n个创建的容器。

-q :静默模式,只显示容器编号。

退出容器: exit or ctrl+p+q

run进去容器,exit退出,容器停止

run进去容器,ctrl+p+q退出,容器不停止

启动已停止运行的容器:docker start 容器ID或者容器名重启容器:docker restart 容器ID或者容器名启动已停止运行的容器:docker start 容器ID或者容器名停止容器:docker stop 容器ID或者容器名强制停止容器:docker kill 容器ID或容器名删除已停止的容器:docker rm 容器ID

一次性删除多个容器实例

docker rm -f $(docker ps -a -q)

docker ps -a -q | xargs docker rm

重要命令

启动守护式容器(后台服务器):docker run -d 容器名

1: docker run -it redis:6.0.8 前台交互式启动

2: docker run -d redis:6.0.8 后台守护式启动

查看容器日志 docker logs 容器ID查看容器内运行的进程: docker top 容器ID查看容器内部细节:docker inspect 容器ID进入正在运行的容器并以命令行交互:docker exec -it 容器ID bashShell

1.重新进入docker attach 容器ID

2:attach 直接进入容器启动命令的终端,不会启动新的进程

3:用exit退出,会导致容器的停止。exec 是在容器中打开新的终端,并且可以启动新的进程

4:推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

5: 案例 docker exec -it 容器ID /bin/bash

从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径导入和导出容器

1: export 导出容器的内容留作为一个tar归档文件[对应import命令]

2: import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

3: 案例: docker export 容器ID > 文件名.tar

4: cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

将修改后的容器,制作为一个新的容器:docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

比如你安装了一个ubuntu 镜像,但是不支持vim , 你在exec 容器内部,安装了vim, 想让这个安装vim的容器成为一个新的镜像

6. dockerHub的介绍

这个官方的docker仓库,可以理解为咱们常用的Maven仓库,在以后的开发中,我们会经常用到。在这里做个简单的了解和使用

我们进入 搜索关键字Tomcat

拉取适合的版本,直接拉取Pull,默认拉取图二,最新的latest的版本。并且在描述页中, 官方也提供了图三如何载Docker中使用tomcat的命令介绍。

7. Tomcat容器内部结构

在进行我们docker拉取镜像的试试,我们可以从上面的图,可以看出来。拉取的镜像主要分为Linux操作系统,JDK,Tomcat。所以我们也可以同样式使用linux命令,对容器内部进行操作。那么如何进入到容器内部呢?

格式 :docker -it 0728852zscsd535 /bin/bash

写成docker -it 0728852zscsd535 bash也行

参数解释

exec:在对应容器中执行命令-it:采用交互方式执行命令 (比如,我们想进入容器,然后输入后续的指令)/bin/bash:会开启一个终端

从这里也能看出,容器是镜像文件运行所产生的实例

查看容器版本

cat /proc/version

我们再来看看容器他给我们安装的jdk的版本

拉取的镜像和容器都存在了宿主机的那个位置呢?—>/var/lib/docker

8. Dockerfile构建镜像

Dockerfile的作用

前面的讲解,都是如何对 获取,删除镜像的讲解,那么如何自己创建一个镜像呢?此时 Dockerfile的意义就是创建镜像

什么是 Dockerfile

1、 Dockerfile是一个包含用于组合镜像的命令的文本文档

2、 Docker 通过读取Dockerfile中的指令按步自动生成镜像

案例需求

之前我么拉取了一个tomcat镜像,现在我们想创建一个页面,把这个页面放到tomcat镜像中。并且能够正常访问

首先我们需要在项目的根目录,创建一个Dockerfile

创建编辑Dockerfile文件。

FROM tomcat:lates

MAINTAINER

WORKDIR /usr/local/tomcat/webapps

ADD docker-web ./docker-web

编辑结果如下

from:设置基准镜像(要依托那个镜像,进行扩展)maintainer:用于说明当前这个镜像是由哪个人或者哪个机构来维护的 (注解)workdir:我和dir 用于切换工作目录 (我们把发布的项目,发布到那个容器下的目录)add:指定的文件或者目录。复制到我们镜像的指定目录下。(第一个docker-web指的dockerFile的文件,而./docker-web指的是webapps下的dockerweb下的项目,把文件复制到哪里) 构建镜像

构建镜像命令格式

docker build -t {机构名/镜像名称:版本号} {dockerfile路径, 下面的案例中.代表当前路径}

docker build -t /mywebapp:1.0 .

构建完成后,如下图

即可看到build成功后的页面。

9. Dockerfile的基础命令

FROM

![在这里插入图片描述](https://img-/0605174838155.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdG

LABEL & MAINTAINER

WORKDIR

ADD & COPY

ENV

10. Dockerfile如何执行命令

在docker中,提供了三个命令,分别是RUN & CMD & ENTRYPYPOINT, 他们书写格式分别有Shell格式Exec格式(推荐)

10.1 Run

Shell格式

RUN yum install -y vim

Exec命令格式

RUNN ["yum","install","-y","vim"]

10.2 ENTRYPOINT

ENTRYPOINT (入口点)用于在容器启动时,执行命令dockefile只有最后一个ENTRYPOINT 会被执行ENTRYPOINT[“ps”] # 这里执行ps 命令

10.3 CMD

格式案例 CMD[“ps”,“ef”] # 推荐使用exec格式

CMD用于设置默认执行的命令如dockerfile中出现多个CMD,则只有最后一个被执行容器启动时附加指令,则cmd被忽略如果在启动的时候,增加了其他的命令,那么这个命令会取代dockerfile的cmd的命令,如下图所示

可以看到,使用了cmd类似,一个java方法的形参。如果没有参数,则默认使用dockefile的命令,如果有则使用传递进来的。而ENTRYPOINT则不会进行接受参数的操作。

综上知道了两者的特点我们可以吧ENTRYPOINT和CMD综合使用

此时进行buit->run 结果为

如果我们想ps -aux ,可以在不进行修改dockerfile ENTRYPOINT的属性的情况下,直接传入参数 -aux,两者使用更加灵活。

总结:run 可以无限次,CMD 和 ENTRYPOINT 只能生效一次,但是cmd可以替换参数,而ENTRYPOINT 只能自己作为定值

10.4 shell 和exec的区别

为什么docker 会为run 提供2种方式,这里解释下

Shell 格式:

10.5 实战 构建redis镜像

编辑dockefile文件。

FROM centos:7#定义路径的环境变量ENV REDIS_HOME /usr/local#安装YUM源RUN yum -y update && yum -y install epel-release && yum -y install redis#安装清理缓存文件RUN yum clean all#设置密码RUN echo "requirepass 6jXL95Iv2BFisJNB" >> /etc/redis.conf#设置端口EXPOSE 6379#启动ENTRYPOINT [ "/usr/bin/redis-server","/etc/redis.conf"]CMD []

具体如下图所示

2. 构建镜像

. 代表,执行的命令为当前的dockerfile所在的路径。

docker build -t redis .

3. 运行容器

docker run -p 6379:6379 -d --restart always 61589feb102d

11. 容器间link 单向通信

我们一直是在单个容器间进行操作,如果我们想要2个容器进行通信,如何操作呢?

在进行通信的时候,推荐使用给容器进行命名,而不是ip进行通信。

记这个 --name 是2个杠

docker run -d --name web tomcat(此时一个名为web的tomcat 容器,就已经创建好啦)

docker run -d --name database -it centos /bin/bash(centos 创建完后,就默认进行退出了状态,所以为了让容器保持运行,就需要 -it 进行交互模式,访问bin/bash 让他在后台运行)

查看容器的原数据,每个容器都有属于自己的ip

docker inspect 容器id

此时我们进入到另一个容器的内部,进行ping 刚刚看到容器的ip

那么我们如果进行名称的,ping的访问呢?

docker run -d --nam web --link database tomcat

此时我们在进行ping,就可以成功啦。 所以–name 的命名 也并不是没有意义的

如果发现ping 命令,没法使用的话进行如下的操作

1) apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。2)等更新完毕以后再敲命令:apt-get install iputils-ping命令即可。

总结:

1. 一个容器 开启 -it /bin/bash 和 --name 准备和另一个容器进行配对

2. 另一个容器 开启 --link 连接容器的别名 进行通信

12. Bridge网桥双向通信

我们启动database和web两个容器

列出docker 网络服务的明细

创建网桥

容器绑定网桥

web容器绑定网桥 , database 同上

5. 当两者绑定成功之后,则进行对方容器进行ping 测试即可。

二者都可以进行互通。

总结:

1.首先创建一个网桥

2. 双方容器都绑定网桥即可。

14. Volume 容器间共享数据

为什么要进行数据共享呢?-- > 如果我们自定义了镜像, 会在每个容器中有相同的副本, 在这个副本在不同的容器中是相同,加入此时我们对107.1.31.22 进行更新了页面,此时107.1.31.28,或者其他3000台以上机器也需要同步更新,就是件麻烦的事情啦。

解决方案 :在宿主机开辟一个空间,我们把文件放到开辟的共享空间即可。

数据共享的两种办法

通过设置-v挂载宿主机目录

其实也就是 我修改了我宿主机的webapps。 那么 也会同步 容器里面的webapps文件

实战:

比如说我们在这里dist文件夹,创建一个文件。然后进行挂载,如果这里面文件修改了,和他挂载的容器的路径对应的文件 也会进行修改

然后我们进入到容器,发现什么文件也没有。

现在我们在/opt/dist下创建一个文件,并且添加内容为123

我们进入容器再看

缺点:进行挂载的时候,如果中间输错了一个字母,就会让挂载失败,所以我们来看下第二种方式。

通过 --volumes-from 共享容器内挂载点

这里其实就相当于给 挂载的路径设置了一个名称,共享容器 以后引用挂载点的别名就可以啦。修改挂载点的时候,修改共享容器的路径即可。

第二种方式和第一种类似,这里就不再演示啦。

总结:进行容器的挂载,当修改宿主机文件的时候,也会同步修改容器里面的文件。 其中挂载一共有2种方法,第二种类似创建一个全局变量,进行一个全局管理。

15. docker compose

15.1 docker compose 的作用

docker compose 帮我们解决多容器部署的麻烦事,比如你部署一个java服务,你还给运行 配置nginx ,mysql 。烦不烦。 docker compose 就是解决这个问题

15.2 docker compose 的安装

具体的操作,参考官方文档 /get-started/08_using_compose/

获取并且自动安装docker-compose

sudo curl -L "/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

进行授权

sudo chmod +x /usr/local/bin/docker-compose

输入如下命令,出现出图一致,则为安装成功

docker-compose -version

15.3 利用docker-compose 部署一个wordPress博客

1:官方链接:/compose/

在一个文件夹内创建一个名为 docker-compose.yml的脚本

将如下内容进行粘贴到 docker-compose,yml 中

这里内容,我就不给代码,自己去官方复制下。至于参数的含义,我们这里暂时先不了解。

进行解析执行,等待就完事啦。

docker-compose up -d

出现如图所示代表成功获取

我们ps 一下,发现他已经帮我们run 并且帮我们映射了额端口,我们直接访问 下

出现了如下面的界面。

经过了简单的初始话,我们来到了主页面

16 docker compose 实战

在这里我们准备一下 初始化的SQL脚本

在这个文件夹内,我们加入了配置文件和启动的jar

然后我们吧资源上传到linux 服务器,然后创建一个Dockerfile文件

构建结果如下

但是我们启动docker run 的时候发现数据,无法连接 ,因为没有数据库容器呀。。。

我们吧之前的初始化脚本进行上传,然后创建一个DockerFile文件, 进行编辑如下

在这里注意下WORKDIR:写的目的是官方说明的,初始化目录,如果

sh和sql的文件,放到这里的时候,此时mysql的启动的时候会自动进行执行脚本。

然后我们进行build

直接查询表,没有报错就说明没有问题

现在们项目和mysql 的都已经弄好啦, 那如何利用docker-compose 进行操作呢?

我们直接在app 和 db的两个父类文件夹路径 创建一个docker-compose.yml文件

利用dcker-compose up -d他会自动读取yml文件,并且后台运行,。

docker-compose logs 用于查看 后台运行的日志

docker-compose down

此时他自动创建了2个容器。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。