前言

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

正文

1. 概述

1.1 Docker简介

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

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

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

1.2 Docker架构

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综艺圈”,和我一起学习吧;

Docker小白到实战之开篇概述的更多相关文章

  1. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  2. Docker小白到实战之Docker网络简单了解一下

    前言 现在对于Docker容器的隔离性都有所了解了,但对容器IP地址的分配.容器间的访问等还是有点小疑问,如果容器的IP由于新启动导致变动,那又怎么才能保证原有业务不会被影响,这就和网络有挂钩了,接下 ...

  3. Docker小白到实战之容器数据卷,整理的明明白白

    前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...

  4. Docker小白到实战之Docker Compose在手,一键足矣

    前言 Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说 ...

  5. Docker小白到实战之常用命令演示,通俗易懂

    前言 上一篇大概认识了Docker,主要是从概念.架构.优点及流程方面进行阐述,并进行安装和体验: 接下来就开始进行实操学习,在演示过程中会针对关键的知识点进行归纳和总结,这里先从常用命令说起,来吧, ...

  6. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

  7. 【Spring实战】----开篇(包含系列目录链接)

    [Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...

  8. Docker小白使用笔记

    本文来自网易云社区. 本人DBA一枚,但因为工作的关系,接手的机器越来越多,要部署的东西也从MySQL扩展到其他千奇百怪的各种应用服务,因此需要使用自动化部署的场景也越来越多.早就听运维部的其他大大们 ...

  9. Docker系列之实战:3.安装MariaDB

    环境 [root@centos181001 ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) [root@centos1 ...

随机推荐

  1. Java数据库开发(二)之——DBCP连接数据库

    1.载入jar包 DBCP需要以下几个jar包,可到apache及mysql的官网下载 2.程序编写 public static BasicDataSource ds = null; static f ...

  2. hdu 3306 Another kind of Fibonacci 矩阵快速幂

    参考了某大佬的 我们可以根据(s[n-2], a[n-1]^2, a[n-1]*a[n-2], a[n-2]^2) * A = (s[n-1], a[n]^2, a[n]*a[n-1], a[n-1] ...

  3. Linux下实现MySQL数据库定时备份

    咳~ 咳~ 为了避免数据操作失误.数据丢失.甚至删库跑路,简单做个数据备份吧 1.创建备份目录 # 习惯放在 local 下 cd /usr/local/ # 创建备份目录 mkdir backup ...

  4. Sentinel流控与熔断

    参考: https://thinkwon.blog.csdn.net/article/details/103770879 项目结构 com.guo     ├── guo-sentinel       ...

  5. 5.Java流程控制

    所有的流程控制语句都可以相互嵌套.互不影响 一.用户交互Scanner Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户 ...

  6. C语言:警告提示及解决方法

    #include <stdio.h> int main(){ struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group ...

  7. MyBatis学习笔记(一):MAVEN的下载,安装与环境配置和在IDEA中配置maven

    一.下载 官网下载 :http://maven.apache.org/download.cgi 网速慢的也可以下载我配置好的国内阿里云仓库的.以下以我配置好的为例: 下载链接:https://pan. ...

  8. Quick BI的复杂系统为例:那些年,我们一起做过的性能优化

    背景 一直以来,性能都是技术层面不可避开的话题,尤其在中大型复杂项目中.犹如汽车整车性能,追求极速的同时,还要保障舒适性和实用性,而在汽车制造的每个环节.零件整合情况.发动机调校等等,都会最终影响用户 ...

  9. HTML5-CSS(二)

    一. CSS  文本样式 1.font-size p { font-size: 50px;}解释:设置文本的大小. xx-small.x-small.small.medium.large.x-larg ...

  10. python + mysql 实现查询表数据

    实例如下: import pymysqldef select_form(): # 打开数据库连接 db = pymysql.connect("localhost", "r ...