docker学习之入门加进阶介绍篇,全面笔记

2020/11/06 14:38
阅读数 97

docker是什么?

​ 我发现很多初学者,包括我也初学不久,也是听到这样的模棱两可的概念,docker是容器,久而久之,还没学的时候,可能冉升出更奇妙的思想,把docker当成了服务器的角色。我有个朋友,前两天刚安装docker,想部署项目以docker的形式,就想着docker是一个大容器,往里面先布置环境,装个jdk8,再往里面装mysql等等,其实思路一下子就岔开了,虽然项目的运行需要这些组件,但是docker的思想肯定不是这样的,这样就相当于一台服务器无异了,那还要docker干什么是吧。

​ 按照个人理解,或者官方来说,docker是一种容器引擎,本身不是一个大容器,它包括三个大的内容:镜像(image);容器(container);仓库(repository)。这三个具体下面在具体介绍,先来了解为什么会出现docker这种组件,它的出现为了解决什么问题,了解了这个我觉得才对它有熟悉的定位,学一门技术,我在其他博主那里看到葵花宝典,现在我自己学新技术也是,必须先了解它,再考虑怎么使用。

写代码的四点:

1.明确需求。要做什么?

2.分析思路。要怎么做?(1,2,3……)

3.确定步骤。每一个思路要用到哪些语句、方法和对象。

4.代码实现。用具体的语言代码将思路实现出来。

学习新技术的四点:

1.该技术是什么?

2.该技术有什么特点?(使用需注意的方面)

3.该技术怎么使用?(写Demo)

4.该技术什么时候用?(在Project中的使用场景 )

为什么会出现docker?

​ 项目一般都有开发–运维两个角色,当然小公司可能都是一个人在干(比如我),可能会尝尝听到这样的对话“我本地没问题的,怎么到你那就不行了”,或者“怎么本地测试可以,一部署线上就不行了”,“windows测试都没问题的,到了linux就不行了”等等。

​ 其实不管是运维跟开发沟通也好,自己包揽也罢,都会出现这样的问题,这里面包括很多,从我的电脑搬到你的或者线上,要配置环境,配置应用,jdk、redis集群、nginx、ES、Hadoop、mysql,windows跨平台等等,都得先部署好,我在公司就部署过老项目,还是前后端一体的,换了个服务器,去上面装环境等等,装tomcat,打包成war包,放到webapp下面,最后直接启动,还好CRT-linux连接工具不会显示红色,不然简直血流成河,很多东西一部署到线上就不行了,其中配置等等问题在里面。

​ 所以docker就是能解决这些问题的玩意~~真香警告,我刚学了这么段时间,简直爱不释手。docker可以做到把环境跟项目和配置等一起打包成一个镜像,然后上传到仓库,这时候别人去仓库上拉取(就类似于GIT),直接运行即可,高度还原场景,前面的对话基本一扫而空,其实除了打包项目,还有很多组件镜像源,像我搭建mq服务,直接下载docker镜像源启动,唉,真香。

​ docker的思想就来自于集装箱!

​ JRE - 多个应用(端口冲突)- 原来都是交叉的!

​ docker通过隔离沙箱机制,可以将服务器利用到极致!

docker的基本组成

img

镜像(image):

​ 这玩意就像你装双系统,或者你用vm的时候,也需要一个镜像。可以通过这个镜像来创建容器服务,比如tomcat镜像==>run==>容器(提供服务器),通过镜像可以创建多个容器(最终服务运行或者项目运行就是在这个容器中的)。可以直接到远程仓库search各种镜像,centos、ubuntu、rabbitmq、mysql等等,搭建起来简单快捷,总之香~

容器(container):

​ docker容器技术,通过镜像来创建一个或者一组容器,启动、停止、删除、等命令,每个容器都是独立的服务,互不干扰,集装箱思想、目前可以把这个容器理解为一个简易的Linux系统。

仓库(repository):

​ 仓库就是存放镜像的地方,有公有私有,跟git类似

​ docker hub是国外的,阿里云等都有容器服务器(可以配置镜像加速器!)

Docker跟虚拟机的区别:

  • 体积小,如果虚拟机装个ubuntu镜像,可能是十几个G甚至更大,而docker版本只需要90M不到~
  • 资源占用小,虚拟机会独占一部分内存和磁盘空间,它运行的时候,其他应用就不能用这些资源,就算虚拟机里面只有1m的东西在跑,也需要几百m的内存运行,docker容器只占用需要的资源,不占用那些没有用到的资源,另外,多个容器可以共享资源,虚拟机都是独享资源。
  • 启动速度快,虚拟机启动,用过的都知道~跟你电脑开机差不多,启动一个操作系统时间,有时几分钟。docker容器的底层就是相当于启动本机的一个进程,速度非常快。
  • 隔离,虚拟就需要隔离几个应用,就要创建多个虚拟机,消耗大量的内存和CPU,一般人的电脑可顶不住,docker守护进程可以直接与主操作系统进行通信,为各个docker容器分配资源。还可以将容器与主操作系统隔离,并将各个容器互相隔离,集装箱思想。

Docker的安装

1、Linux要求内核3.0以上

2、centos 7

我的是ubuntu18
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201104110510404.png#pic_center在这里插入图片描述

安装:

帮助文档:https://docs.docker.com/engine/install/

或者:https://www.runoob.com/docker/ubuntu-docker-install.html

可以使用官方的安装脚本自动安装:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

也可以使用国内的daocloud一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

手动安装参照上面链接,安装完之后使用查看版本命令或者尝试下载镜像,测试安装成功

在这里插入图片描述

下载镜像测试:

在这里插入图片描述

在这里插入图片描述

看到hello-world说明镜像下载成功了。

配置阿里云镜像加速器:

​ 我觉得对于学生,或者跟我这样刚工作没多久的,买一个自己的云服务器是很有帮助的,任何事情都在自己的服务器上操作一遍实例,无论是增强记忆性,还是对于自己学习理解,都是很有帮助的,实践才是硬道理,阿里云新用户专享99一年,1核2G的,用来学习,做demo完全ok的。

在这里插入图片描述

配置加速:

​ 在阿里云的管理平台找到容器与镜像服务,点镜像加速器,有指令介绍的。

在这里插入图片描述

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
   
   
  "registry-mirrors": ["https://9ojmf3wg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

到此,docker就算配置好了,下面介绍一下常用命令

常用命令:

帮助命令:
docker -v  #查看版本
docker -info  #显示docker的系统信息
docker <命令> --help #查看某个命令的帮助文档 
镜像命令:
docker images #查看已经下载的镜像列表
docker search ..#去镜像仓库搜索对应镜像源
docker pull ..#下载镜像
docker rmi <id>	#删除镜像(删除镜像前得保证该镜像没有创建的容器保存,否则提示先去删除容器)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

容器命令:
docker pull #下载镜像
docker run  #新建容器并启动
docker ps #查看正在运行的容器列表,-a查看所有容器列表包括停止运行的
docker stop <id> #停止容器
docker start <id> #运行容器
docker restart <id> #重启容器
docker rm <id> #删除容器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

关于RUN方法的流程图:

在这里插入图片描述

常用的其他命令:
docker cp 容器id:容器内路径 主机目的路径 #文件拷贝到本地
docker exec -it 容器id /bin/bash  #进入容器内部
docker attach 容器id #进入容器内部
#两个进入容器内部命令的区别,exec:开启新的终端,进去操作。attach:进入正在运行的终端操作
docker inspect 容器id #查看镜像的元数据

docker login  #登录远程仓
docker push  #推送到远程仓
docker pull  #从远程仓下拉
docker commit #打包镜像(一般现在都用dockerfile)
#文章末尾附上命令葵花宝典
登录dockerHub,推送跟下拉镜像:

1、先去dockerHub上面注册账号:

在这里插入图片描述

2、创建一个仓库:

在这里插入图片描述

3、在服务器上登录远程仓,需要输入账号密码,succeed代表成功
在这里插入图片描述

4、push镜像到远程仓库

5、pull远程仓的镜像到本地

使用docker版rabbitmq实例

1、下载并启动rabbitmq(直接用run指令,前面有流程图说明)

在这里插入图片描述

-d 表示后台启动,–name 别称,-p 是端口映射(宿主机端口:容器端口) 最后是镜像源名称:版本标签。rabbitmq默认端口是5672,15672。这边映射到服务器的5673以及15673端口,如果是在阿里云服务端操作的,要去设立安全组开放端口。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ok,设置好之后,linux系统开放防火墙端口的指令也可以记住一下:

firewall-cmd --zone=public --add-port=8010/tcp --permanent #开放8010端口
systemctl restart firewalld.service #重启防火墙
#如果开放失败,先检查防火墙是否启动

这样,docker版本的rabbitmq就已经部署好了,是不是很简单,真香警告,我们可以测试一下

在这里插入图片描述

我们可以通过阿里云ip访问rabbitmq管理平台测试下是否正常

在这里插入图片描述

登录进去看看管理平台,这里测试可能就需要一些rabbitmq的demo知识,网上很多,推荐一个:

在这里插入图片描述

推荐的rabbitmq测试demo:https://blog.csdn.net/wjg8209/article/details/107203082,我们跳过他的安装,直接到测试代码,交换方式有很多种,我这也列出一种topic形式的交换方式,出处找到了,我做了些标注,https://blog.csdn.net/a745233700/article/details/89681801:

提供者代码:
package com.upload.util;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class SentTopic {
   
   

    private static final String EXCHANGE_NAME = "topic_logs";

    /**
     *  MQdemo TOPIC路由类型方式,可以指定任意路由键发送消息 		https://blog.csdn.net/a745233700/article/details/89681801
     * @author yxb
     * @param args
     */
    public static void main(String[] args) {
   
   
        Connection connection = null;
        Channel channel = null;

        try {
   
   
            //建立连接和通道
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("");//你的服务器ip
            //factory.setHost("");
            factory.setPort(5673);
            connection = factory.newConnection();
            channel = connection.createChannel();

            //声明路由器和路由器类型
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);

            //定义路由键和消息
            String routingKey = "cron.critical";//可以设定特定的任意路由键,接收方指定路由键接收特定消息
            String message = "A critical cron error";

            //发布消息
            channel.basicPublish(EXCHANGE_NAME,routingKey,null,message.getBytes("UTF-8"));
            System.out.println("sent message -- "+routingKey+":"+message);

        } catch (IOException e) {
   
   
            e.printStackTrace();
        } catch (TimeoutException e){
   
   
            e.printStackTrace();
        }finally {
   
   
            if (connection!=null){
   
   
                try {
   
   
                    connection.close();
                } catch (IOException e) {
   
   
                    e.printStackTrace();
                }
            }
        }
    }
}

消费者代码:
package com.upload.util;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RecvTopic {
   
   
    private static final String EXCHANGE_NAME = "topic_logs";

    /**
     * MQdemo TOPIC路由类型方式,可以指定任意路由键接收消息 https://blog.csdn.net/a745233700/article/details/89681801
     * @author yxb
     * @param args
     */
    public static void main(String[] args) throws IOException, TimeoutException {
   
   
        //建立连接和通道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("");//你的服务器ip
        //factory.setHost("");
        factory.setPort(5673);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //声明路由器和路由器类型
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        String queueName = channel.queueDeclare().getQueue();

        //指定接收某类路由键的信息
        String bingingKeys[]={
   
   "*.critical","kern.*"};//指定路由键接收特定的某些指令信息,#代表接收所有的信息,可指定多个{"1","2"}

        for (String bindingKey : bingingKeys){
   
   
            channel.queueBind(queueName,EXCHANGE_NAME,bindingKey);
        }
        System.out.println("waiting for messages . To exit press CTRL + C");
        System.out.println("接收端正在等待消息...");
        //监听消息
        Consumer consumer = new DefaultConsumer(channel){
   
   
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
   
   
                String message = new String(body,"UTF-8");
                System.out.println("接收到的消息/recvTopic message--"+envelope.getRoutingKey()+":"+message);
            }
        };
        channel.basicConsume(queueName,true,consumer);
    }
}

我跑起来测试一下:

我先跑起来消费者,监听队列信息:

在这里插入图片描述

我们到rabbitmq管理平台看看:

在这里插入图片描述

可以看到我们有一个连接数,一条通道,一个队列,一个消费者。说明我们消费者监听队列成功,我们再测试提供者发送消息能否给消费者监听到:

在这里插入图片描述

在这里插入图片描述

到此,简单的rabbitmq服务就运作起来了,所以说,使用docker除了打包发布等,项目中使用到很多类似组件也是很方便部署安装跟调用,redis、mysql、nginx等等,都可以仿照这种方式部署,很香的。

学到这,基本上就可以算docker入门级别了。因为这些都是基础知识,只能说明你了解docker,会简单应用了,但企业用起来还有几个关键知识,学会了才算刚毕业,大神说的,我也是小小学者hhhhhhh,但我实践了才会总结,敲熟了才好说话。

后面还有一些知识学完就差不多了,可以说这才是重点:

  • 容器数据卷
  • docker网络原理
  • IDEA整合docker
  • dockerfile
  • docker Compose
  • docker Swarm
差不多就这些,我也没学完哈哈哈哈,我是边学边敲边分享的,学了一大部分了,快完结了,但是到这里是一个节点吧,最后先附上一段怎么把springboot项目打包成一个docker镜像,别人一拿到这个镜像就可以跑起你的项目,无需再部署任何环境配置,这玩意比较吸引人吧hhhh。

前提准备:

  • 安装好docker
  • 测试过任何一个demo,类似于上面的mq,这些玩意真的是要自己实操的,不然学起来我自己感觉我贼没劲,搞不好一段时间就忘记了。
  • 准备好一个跑得动的springboot项目,测试的话,简简单单就行,写个controller也行,你有现成的项目也行。

1、打包项目jar包

在这里插入图片描述

2、编写Dockerfile

这里可以下载一个idea插件,可以高亮,也可以连接远程等

在这里插入图片描述

编写Dockerfile:

在这里插入图片描述

3、上传到服务器,编写好之后上传jar包跟Dockerfile到服务器
在这里插入图片描述

4、创建镜像命令

在这里插入图片描述

在这里插入图片描述

docker build -t yxb666 .  #创建镜像命令,注意末尾有个“.”

5、我们跑起来!

在这里插入图片描述

docker run -d --name yxb6666 -p 8080:8080 yxb666:latest

6、postman测试

在这里插入图片描述

测试接口成功!!!说明我们已经打包好了项目为一个docker镜像,测试结束,完美。。。

就先到这把,进阶版的,我悟透了,敲熟悉了再分享一下,如果有人觉得上面很多内容熟悉,没错!!!!!!

我也是学别人的,给大家推荐up主,狂神说java!!!公众号搜索《狂神说》

b站搜索“狂神说java”有很多视频,我觉得是很好的,我学的最舒服的一个

总之,实践才是最重要的!!!!!动手最关键

等我更新,赞一下的人最牛逼了,涨薪翻倍,可以关注狂神,也顺带关注我这样子,hhhh…

宝典:

docker 常用命令:

attach Attach local standard input, output, and error streams to a running container #当前shell下 attach连接指定运行的镜像

build Build an image from a Dockerfile # 通过Dockerfile定制镜像

commit Create a new image from a container’s changes #提交当前容器为新的镜像

cp Copy files/folders between a container and the local filesystem #拷贝文件

create Create a new container #创建一个新的容器

diff Inspect changes to files or directories on a container’s filesystem #查看docker容器的变化

events Get real time events from the server # 从服务获取容器实时时间

exec Run a command in a running container # 在运行中的容器上运行命令

export Export a container’s filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]

history Show the history of an image # 展示一个镜像形成历史

images List images #列出系统当前的镜像

import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像

info Display system-wide information # 显示全系统信息

inspect Return low-level information on Docker objects #查看容器详细信息

kill Kill one or more running containers # kill指定docker容器

load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]

login Log in to a Docker registry #登录到Docker远程仓库

logout Log out from a Docker registry #从Docker远程仓库注销

logs Fetch the logs of a container #获取容器的日志

pause Pause all processes within one or more containers #暂停一个或多个容器中的所有进程

port List port mappings or a specific mapping for the container #列出容器的端口映射或特定映射

ps List containers #列表容器

pull Pull an image or a repository from a registry #从远程仓库中提取图像或存储库

push Push an image or a repository to a registry #将图像或存储库推到远程仓库

rename Rename a container #重命名一个容器

restart Restart one or more containers #重新启动一个或多个容器

rm Remove one or more containers #删除一个或多个容器

rmi Remove one or more images #删除一个或多个镜像

run Run a command in a new container #启动一个新容器

save Save one or more images to a tar archive (streamed to STDOUT by default) #将一个或多个镜像保存到tar归档文件(默认情况下流化到STDOUT)将一个或多个图像保存到tar归档文件(默认情况下流化到STDOUT)

search Search the Docker Hub for images #在Docker Hub中搜索镜像

start Start one or more stopped containers #启动一个或多个已停止的容器

stats Display a live stream of container(s) resource usage statistics #显示容器资源使用统计数据的实时流

stop Stop one or more running containers #停止一个或多个正在运行的容器

tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE

top Display the running processes of a container #显示容器正在运行的进程

unpause Unpause all processes within one or more containers #在一个或多个容器中取消暂停所有进程

update Update configuration of one or more containers #更新一个或多个容器的配置

version Show the Docker version information #显示Docker版本信息

a live stream of container(s) resource usage statistics #显示容器资源使用统计数据的实时流

stop Stop one or more running containers #停止一个或多个正在运行的容器

tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE

top Display the running processes of a container #显示容器正在运行的进程

unpause Unpause all processes within one or more containers #在一个或多个容器中取消暂停所有进程

update Update configuration of one or more containers #更新一个或多个容器的配置

version Show the Docker version information #显示Docker版本信息

wait Block until one or more containers stop, then print their exit codes #阻塞直到一个或多个容器停止,然后打印它们的退出代码

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部