社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker小白到实战之开篇概述

dotNET跨平台 • 4 年前 • 441 次点击  

前言

“不对啊,在我这运行很正常啊”,这句话小伙伴们在前几年应该听得很多;每次一到安装、部署时总有一堆问题,毕竟操作系统版本、软件环境、硬件资源、网络等因素在作怪,此时难免会导致开发小伙伴和运维哥们互相甩锅,其实很多时候与要部署的系统没有太大关系。如果能减少差异化带来的不和谐,同时还能提高工作效率,肯定是最好的解决方案;Docker的出现让此类问题迎刃而解,即把应用程序、配置依赖等打包形成一个可交付的运行环境,直接启动运行即可,当然不限于此,接下来就一起来学习和探究吧。

正文

1. 概述

1.1 Docker简介

Docker 是一个开源的应用容器引擎,是用Go语言开发的。用于开发、交付和运行应用程序的开放平台,能够将应用程序与基础设施分开,从而可以快速交付软件。

看看Docker 的Logo图

image-20210814101505393
,Docker就好比是下面的小鲸鱼,上面装满的每个集装箱(方块)可以理解为容器,不管集装箱里面装的什么,统一按集装箱的形式打包存放、运输即可,集装箱之间互不影响;即Docker不在乎容器里的内容是什么,统一基于容器这种形式进行标准化管理,容器之间相互隔离,所以Docker上运行的多个容器是相互不影响的。


Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),通常社区版足够用了,功能强大,还免费。

1.2 Docker架构
Docker Architecture Diagram

Docker是客户端/服务器模式架构(C/S),Client(客户端)和Docker daemon(守护进程)通信, 后者接收到客户端指令并执行。简述上图的三个流程:

  • 客户端(Client) 发送docker build指令, 服务端(Docker daemon) 收到指令之后就执行,将对应文件打包生成为镜像(Images)

  • 客户端(Client) 发送docker pull指令,服务端(Docker daemon) 收到指令之后就执行,从远程仓储中(Registry) 寻找镜像(Images) ,并下载到Docker主机上(DOCKER_HOST) ,如果找不到就报错;

  • 客户端(Client) 发送docker run指令,服务端(Docker daemon) 收到指令之后就执行,先从本地查找镜像(Images) ,如果本地存在,直接通过镜像启动容器(Containers) 实例;如果本地没有镜像(Images),就会从远程仓储中(Registry)下载,然后再根据镜像启动容器(Containers) 实例,如果都没找到,那就报错。

上面只是用三关键指令大概描述了从客户端到服务端的执行流程,其实还有很多指令,后续会专门整理文章分享。

上图术语解释及作用:

  • Docker daemon(守护进程) :负责监听客户端发过来的指令请求,并管理Docker的各种对象,如镜像(Images)、容器(Containers)、网络等。

  • Client(客户端) :用户和Docker主机交互的主要方式,就是用来发指令请求的。

  • 远程仓储(Registry) :用于各种镜像的存储,Docker Hub是最大的镜像存储库,基本上平时能用到的镜像都可以找到;为了提升拉取速度,可以指定国内的一些仓储。

  • 镜像(Images) :是一个启动容器(Containers) 的只读模板;比较容易理解的比喻:镜像就是编程语言中的类(Class),容器就是通过类(Class) new出来的实例。

  • 容器(Containers) :就是镜像(Images) 可运行的实例。

1.3 Docker带来的好处
  • 开发更加敏捷: 让开发人员可以自由定义环境,创建和部署的应用程序更快、更容易,运维人员快速应对变化也更加灵活性。

  • 高可移植性和扩展性: Docker容器可以运行在各种设备环境中,如开发电脑、虚拟机、服务器上等;根据业务需求,可实时扩展或拆除应用程序及相关服务;

  • 充分利用硬件资源:Docker轻量级、启动快,能共用公共服务,不像传统的虚拟机那样,需要单独虚拟出整个系统,占用资源多,速度还不够快。Docker容器之间相互隔离,互不冲突,所以同时可运行很多个容器,充分利用资源。

理论先说那么多,主要是实操应用,用明白了,理论自然就清晰了。

2. 安装

这里安装的主机环境是我之前的买的云服务器,系统为CentOS7,其他系统版本安装会有差别,具体细节小伙伴可以参考官网(https://docs.docker.com/get-docker/),里面步骤都很详细。

1、移除移动旧版本

   sudo yum remove docker \
                     docker-client \
                     docker-client-latest \
                     docker-common \
                     docker-latest \
                     docker-latest-logrotate \
                     docker-logrotate \
                     docker-engine

2、安装需要的依赖包

   sudo yum install -y yum-utils

3、设置镜像仓库

   sudo yum-config-manager \
       --add-repo \
       https://download.docker.com/linux/centos/docker-ce.repo  

4、更新Yum软件包索引

   sudo yum makecache fast # 提高安装速度

5、开始安装Docker

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

6、启动Docker

   sudo systemctl start docker

7、测试Docker

   sudo docker run hello-world # 运行Hello-world
安装成功

以上步骤已经完成Docker的安装,但由于拉取镜像时是从国外下载,比较慢,所以通常我们会配置镜像加速器,国内腾讯云、阿里云等都提供加速站点,这里还是用阿里云演示,因为有账号。

配置镜像加速器

3. 初体验

安装完成之后,这里不急着往下说,先来体验一下;很方便的就将自己的项目打包然后运行,步骤如下:

  • 准备一个项目

    这里就直接创建一个默认的API项目(基于.NetCore3.1)即可,什么都不做。

  • 编写Dockerfile

    在项目根目录下增加一个Dockerfile文件,里面内容如下:

    具体内容如下

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
    WORKDIR /app
    COPY . .
    EXPOSE 80
    ENTRYPOINT ["dotnet""DockerDemo.dll"]

    设置Dockerfile的文件属性为始终复制,如下:

    以文件系统的形式发布项目,指定本地目录,如下:

  • 将发布之后的文件拷贝到装有Docker的主机上

    将项目进行发布,把发布之后的文件拷贝到我的阿里云服务器上,用到的工具是FinalShell(一个工具完成连接服务器和上传文件,很好用),如下:

  • 打包为镜像

    进入发布文件目录,执行docker build命令,将发布文件打包为一个镜像,如下:

    上图中的mydockerdemo 是镜像名,可以自定义;通过docker images查看镜像是否生成,如下:

  • 根据镜像启动容器(里面包含我们的项目)

    镜像生成之后,就可以通过docker run指令根据镜像启动容器了,即启动我们的项目

    docker run -d --name mydockerdemo -p 9999:80 mydockerdemo

    -d:后台模式运行;

    --name:给运行中的容器指定一个名字;

    -p:指定端口映射, 主机的端口9999映射到容器的端80,因为在容器里面我们的项目是以80 端口启动的;

    最后一个参数是上一步生成的镜像名称, 即根据此镜像启动一个容器实例。

  • 测试访问看看,只要配置了云服务器的安全组和防火墙放开9999端口,那么外网就可以访问了,如下:

可能有小伙伴说,也挺麻烦的;其实编写Dockerfile,打包镜像等操作都是一次性的,只要生成了镜像,后续其他环境直接根据镜像启动即可,不用再单独安装.NetCore运行时等基础设施了,打包好的镜像里包含了完整的运行环境。

总结

这里先初步了解Docker,并进行安装和体验,接下来的文章会把常用命令、Dockerfile、容器数据卷挂载、DockerCompose及DockerSwarm等相关知识依次说到。Docker已经成为必备技能,再不学习就Out了,关注“Code综艺圈”,和我一起学习吧;

图片

\


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118534