博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker学习总结
阅读量:2058 次
发布时间:2019-04-29

本文共 5904 字,大约阅读时间需要 19 分钟。

文章目录

认识docker

什么是docker?

百度百科:

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

docker与虚拟机

docker与虚拟机架构对比:

在这里插入图片描述

虚拟机:

虚拟机通过软件模拟了一套硬件设施,然后安装运行Guest OS,进而再在Guest OS中运行各种软件服务。

因为每套应用服务都运行在一个独立的操作系统环境中,所以虚拟机的隔离级别很高。

docker:

docker是基于宿主机的内核(Linux Kernel),所有容器共享了底层的基础设施,正因为此,docker创建启动销毁容器的效率远远高于传统的虚拟机。

对于宿主机而言,每个docker容器就是一个进程,底层共享内核以及docker提供的基础设施,鱼与熊掌不可兼得,相对虚拟机而言,在隔离级别上不及虚拟机,但优点是轻巧高效,而且容易标准化,可移植。

docker的使用场景

  1. 快速搭建开发环境
  2. 简化部署过程
  3. 持续部署
  4. 统一部署管理微服务
  5. 多租户环境

容器

概念

docker的容器是用来承载和运行我们的应用服务的,类似于一个虚拟机。

容器与镜像的关系,镜像就类似于Java中的类,而容器则是实例,镜像用于定义,而容器则是实际使用。

容器管理相关命令

# 查询所有运行中的容器docker ps# 查询所有容器docker ps -a || docker ps --all# 监控容器当前运行状态,container可以使用名字或IDdocker stats [container1] [container2]# 启动容器docker start [container]# 停止容器docker stop [container]# 重启容器docker restart [container]# 创建并运行容器docker run -it ubuntu /bin/bash #从ubuntu镜像创建并运行容器,完成后进入容器交互界面,退出交互界面容器也停止运行,运行时执行/bin/bash命令,-i:支持交互式操作,即使没有连接仍保持STDIN开放;-t:分配一个虚拟终端;docker run -itd ubuntu /bin/bash #基本同上,但完成后在后台运行,-d:让容器在后台运行;docker run -d -P training/webapp python app.py #-P:将容器内部使用的网络端口映射到我们使用的主机上,即使用默认的桥接模式;python是命令,app.py是命令的参数docker run -d -p 5000:5000 training/webapp python app.py #-p:设置映射的端口,前面是宿主机的端口,后面是对应的容器的端口;docker run -itd --network host training/webapp python app.py #--network:指定容器要使用的网络;# 查询容器端口映射情况docker port [container]# 查看容器内部的标准输出docker logs -f [container] #-f:持续输出# 查看容器的底层信息docker inspect [container]# 移除容器docker rm [container] #移除的容器必须是停止的,否则会报错# 交互式操作容器docker attach [container] #这种方式进入容器,退出后容器也会停止运行docker exec -it [container] /bin/bash #这种方式进入容器,退出后容器将继续后台运行,-i:即使未连接也保持标准输入开放;-t:分配一个虚拟终端;/bin/bash是进入容器后执行的命令# 导出容器快照docker export [container] > /d/httpd.tar# 将容器快照导入为镜像cat /d/httpd.tar | docker import - author2/httpd:v1.0# 将宿主机文件复制到容器中# 将xxx.txt复制到容器56405a3cffa3的/usr/apps路径下docker cp D:\document\git-repo\docker-study\web-1\xxx.txt 56405a3cffa3:/usr/apps# 将整个web-1目录复制到容器56405a3cffa3的/usr/apps路径下docker cp D:\document\git-repo\docker-study\web-1\ 56405a3cffa3:/usr/apps

镜像

概念

容器一节已经说过了,镜像是用来定义的,我们可以根据镜像来生成我们需要的容器。

镜像基础管理相关命令

# 查询所有本地镜像docker images# 从远端仓库中查询镜像docker search [image]# 拉取镜像到本地仓库,不指定tag则默认使用latestdocker pull [image]:[tag]# 删除本地仓库中的镜像docker rmi [image]# 设置镜像名和tagdocker tag [container] [name]:[tag]

制作镜像

创建镜像有三种方式:

  1. 使用现有容器进行修改和配置,然后提交到本地仓库
  2. 使用导入容器快照来创建镜像
  3. 使用Dockerfile指令创建一个新的镜像

一、使用现有容器创建镜像

  1. 首先我们需要按照之前的内容,创建一个容器,然后根据自己的需要,对容器进行一些自定义

  2. 将上述自定义后的容器作为镜像提交到本地仓库

    # 参照容器提交镜像到本地仓库docker commit -m costom_ubuntu -a author [container] author/ubuntu:v1 #-m:提交信息;-a:作者;author/ubuntu:v1:其中author/ubuntu是镜像名,v1是tag,可以有多个名字相同tag不同的镜像,方便版本管理

二、使用容器快照创建镜像

这个方法在容器一节中已经讲到了,这其实也是基于现有容器来创建镜像的一种方式,但这个可以跨docker创建。

# 1、导出容器快照docker export [container] > /d/httpd.tar# 2、将容器快照导入为镜像,author2/httpd是给该镜像命的名,v1.0是tagcat /d/httpd.tar | docker import - author2/httpd:v1.0# 与import效果相同,-i:用读取文件替换读取标准输入docker load -i /d/httpd.tar

三、使用Dockerfile创建镜像

什么是Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

Dockerfile创建镜像步骤

一、创建Dockerfile文件

在空目录下创建名为Dockerfile的文件,无后缀

二、编写构建指令

向之前创建的Dockerfile文件中写入构建镜像需要的指令,下面是一个示例文件

#基于centos7的镜像构建FROM centos:7#安装vimRUN yum install -y vim#安装httpdRUN yum install -y httpd#容器运行时执行的命令,此处为执行bashCMD ["/bin/bash"]

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,所以我们可以使用&&来连接多条命令,这样就只会创建一层。

#基于centos7的镜像构建FROM centos:7# 使用&&连接符合并命令,简化镜像层RUN yum install -y vim && yum install -y httpd#容器运行时执行的命令,此处为执行bashCMD ["/bin/bash"]
三、构建镜像
# my/httpd是镜像名,v1.0是镜像的tag,.表示当前目录,即Dockerfile所在的目录docker build --tag my/httpd:v1.0 .

构建成功后,即可获得我们定制的镜像。

仓库

与git类似,docker也有本地仓库和云端仓库的概念,我们自己创建的镜像都是在本地仓库,可以使用docker push命令将我们自己的镜像进行云端托管

# 登录docker,登录前需要现在云端创建账号,官方仓库docker hub地址:https://hub.docker.com/docker login# 从现有容器创建镜像,存放在本地仓库docker commit -a [author] -m [desc] [container] [name]:[tag]# 将本地镜像推送到云端,但需要注意的是,被推送的镜像的名字必须以用户用户名开头,比如imdongrui/node,否则将推送失败docker push [image]:[tag]

1、镜像层

以上面的示例的Dockerfile来解释:

FROM centos:7

表明我们的镜像是基于centos7来构建,那么我们很明显我们镜像的基础就是centos:7这个镜像。

RUN yum install -y vim

现在我们要在centos:7这个镜像基础上做一些改动,安装vim,但我们肯定是不会去改动centos:7镜像的,但又需要记录我们的改动,那怎么办呢,docker的解决方案是增加一个层,这个层其实就是一块内存空间,在这块空间里面记录我们进行的改动,每次查找文件时都需要先在这个层里查找,优先以这个层里文件为准,如果查找不到再到更下面一层查找。

这里我们安装vim对centos:7所做的改动,其实都记录在这个层中。

RUN yum install -y httpd

同上面安装vim一样,也会创建一个层来记录安装httpd做的改动。

CMD ["/bin/bash"]

CMD也会覆盖一层,只是这层占用空间为0。

2、容器层

容器我们可以自由使用,在容器里做各种改动,但这些改动都不能影响到镜像层,所以在镜像层之上设置了容器层,我们的所有改动都记录在容器层中。

这个原理和镜像层很相似,镜像层是为了不变更底层镜像,而容器层也是为了不变动镜像而开辟的一块内存区域。

3、分层结构图示

centos:7中可能也包含了很多层,这里并未展示出

在这里插入图片描述

docker-compose

简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

使用方法

  1. 将需要部署的应用制作为Dockerfile;

  2. 编写docker-compose.yml文件,指定需要启动的应用服务及相关配置;

    docker-compose.yml示例:

    # yaml 配置version: '2' # version和使用的docker-compose版本有关,不行的话123挨个试...services: # 要部署的服务,每个服务对应一个容器  web-1: # 服务名,在Docker内部,可以不使用端口,而直接使用该服务名进行访问,从而避免端口变化导致的配置变更    build: ./web-1 # Dockerfile所在目录,用于构建镜像    ports: # 绑定宿主机与容器的端口     - "8888:8888"  web-2:    build: ./web-2    ports:     - "8889:8889"  web-3:    build: ./web-3    ports:     - "8890:8890"
  3. 在docker-compose.yml文件所在目录下,使用命令管理应用;

    # 使用Dockerfile构建容器docker-compose build# 使用Dockerfile构建镜像(若镜像已存在则不会重新构建),生成容器,并启动应用docker-compose up# 启动应用docker-compose start# 停止应用docker-compose stop# 重启应用docker-compose restart# 删除该应用的所有容器docker-compose rm

Windows宿主机访问Docker容器中的服务

说明

  1. 首先需要明确的是,在Windows系统中,Docker其实是基于虚拟机软件中安装的Linux系统的,所以在Windows中使用Docker,Docker中容器的真正宿主机其实是虚拟机软件中运行的Linux系统,而不是我们的Windows系统

  2. 基于第一点,所以要通过Windows去访问Docker容器内的服务,就要保证Windows能够正常访问虚拟机软件中运行的虚拟机,通常在安装虚拟机软件的时候,虚拟机软件会为我们默认创建一个桥接网络适配器,在创建一个虚拟机时,虚拟机软件会为其分配一个IP,这个IP就是基于桥接网络网段的,我们可以用这个IP在我们的Windows主机上通过桥接网络访问虚拟机内部的服务,如果不知道这个IP,可以进入到虚拟机内部查询,docker在启动时也会有如下的提示:

    docker is configured to use the default machine with IP 192.168.99.100

通过bridge模式访问容器中服务

在这里插入图片描述

通过host模式访问容器中服务

在这里插入图片描述

配置优化

镜像加速

由于官方库在国外,所以直接获取镜像速度很慢,甚至超时断开,我们可以使用国内的镜像库来获取镜像

# 应该是网易的镜像库吧https://hub-mirror.c.163.com/

参考文章

菜鸟驿站相关教程:https://www.runoob.com/docker/docker-dockerfile.html

大佬的文章:https://cloud.tencent.com/developer/article/1428223

转载地址:http://hptlf.baihongyu.com/

你可能感兴趣的文章
[Kick Start 2020] Round A 1.Allocation
查看>>
[Kick Start 2020] Round A 2.Plates
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>
手抄笔记:深入理解linux内核-1
查看>>
内存堆与栈
查看>>