docker学习总结

认识docker

什么是docker?

百度百科:

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

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可以使用名字或ID
docker 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则默认使用latest
docker pull [image]:[tag]

# 删除本地仓库中的镜像
docker rmi [image]

# 设置镜像名和tag
docker 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是tag
cat /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
#安装vim
RUN yum install -y vim
#安装httpd
RUN yum install -y httpd
#容器运行时执行的命令,此处为执行bash
CMD ["/bin/bash"]

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

#基于centos7的镜像构建
FROM centos:7
# 使用&&连接符合并命令,简化镜像层
RUN yum install -y vim && yum install -y httpd
#容器运行时执行的命令,此处为执行bash
CMD ["/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值