一、Docker入门

一、Docker入门

在这里插入图片描述
举例:Window上面装了一个虚拟机,VM1、VM2、VM3都是linux系统;
CentOS7.X系统上可以装很多个docker,docker1、docker2、docker3;

  • image:镜像 ISO文件,一个镜像模板文件可以安装很多个centos系统
  • container:容器 是以进程的形式运行的,切记:一个容器中只能有一个进程。

在centos系统中,可以安装无数个进程,如:mysql、nginx、spark、http,容器只能运行一个http服务;镜像可以理解为centos中的镜像,容器可以理解为…

1.1 Docker的安装

https://blog.csdn.net/zhikanjiani/article/details/101751647

Centos6.X对比CentOS7.X版本的最明显差异:

1、7.X中的命令向下兼容,在6.X中也能使用
CentOS6.X中:

  • service mysql start|stop|status
  • service httpd start|stop|status

2、CentOS7.X

  • service mysql start|stop|status
  • systemctl start|stop|status mysql

3、最显著的在CentOS7.X中,一条启动命令可以无限写下去:

  • systemctl start mysql httpd

4、docker分为两个版本,自身的版本的API的版本;有时候有可能是提示API的版本不够。
在这里插入图片描述

1.2 Docker的卸载

1、首先要把docker服务停止:

  • systemctl stop docker

2、然后使用命令:
-rpm -qa|grep docker

[root@hadoop ~]# rpm -qa|grep docker
docker-ce-19.03.2-3.el7.x86_64
docker-ce-cli-19.03.2-3.el7.x86_64

3、卸载之前查看下docker在/var/lib目录下有哪些东西?

[root@hadoop ~]# ll /var/lib/docker
total 48
drwx------  2 root root 4096 Sep 30 11:14 builder
drwx--x--x  4 root root 4096 Sep 30 11:14 buildkit
drwx------  4 root root 4096 Sep 30 14:38 containers
drwx------  3 root root 4096 Sep 30 11:14 image
drwxr-x---  3 root root 4096 Sep 30 11:14 network
drwx------ 14 root root 4096 Sep 30 14:38 overlay2
drwx------  4 root root 4096 Sep 30 11:14 plugins
drwx------  2 root root 4096 Sep 30 11:14 runtimes
drwx------  2 root root 4096 Sep 30 11:14 swarm
drwx------  2 root root 4096 Sep 30 14:38 tmp
drwx------  2 root root 4096 Sep 30 11:14 trust
drwx------  2 root root 4096 Sep 30 11:14 volumes

4、卸载客户端和server端:

  • rpm -e docker-ce-19.03.2-3.el7.x86_64
  • rmp -e docker-ce-cli-19.03.2-3.el7.x86_64

5、要完整的卸载还需要删除/var/lib/docker目录下的内容:

  • rm -rf /var/lib/docker/*

Docker的重新部署:

1、yum安装

  • [root@hadoop ~]# yum install -y docker-ce

2、使用service命令启动docker,相当于重定向:
[root@hadoop ~]# service docker start
Redirecting to /bin/systemctl start docker.service

Docker的私服(Docker Hub):

  • 自己制作的一些镜像放到公共的网站上,类似github;

  • 我们自己部署的时候基本上都是去到这个网站上下载的。

  • search Search the Docker Hub for images 搜索docker hub上的镜像

  • pull Pull an image or a repository from a registry 从docker hub仓库拉取下来

  • push Push an image or a repository to a registry 上传到docker hub上去

引出需要了解的知识点:Nginx,以搜索这个为例

在这里插入图片描述

1.3 Nginx的使用案例一

第一步:去下载Nginx

  • [root@hadoop001 ~]# docker pull nginx

第二步:
1、托管一些简单的静态内容(Hosting some simple static content)

  • docker run --name ruozedata-nginx-g6-1 -d -p 881:80 nginx

2、查看运行中的容器实例

  • docker ps

3、

1[root@hadoop ~]# docker run --name ruozedata-nginx-g6-1 -d -p 881:80 nginx
6fc3d0ae5c08363de7c3e9970614c3827e93ecbb737382a72671a527635b09a2

2[root@hadoop ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
6fc3d0ae5c08        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:881->80/tcp   ruozedata-nginx-g6-1

3、如何进入到容器实例里面:
命令:docker exec -it 6fc3d0ae5c08 /bin/bash
[root@hadoop ~]# docker exec -it 6fc3d0ae5c08 /bin/bash
root@6fc3d0ae5c08:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@6fc3d0ae5c08:/# pwd
/

2、此时暴露外部端口号:

  • 使用外网即可访问:http://47.103.197.171:881/
  • 腾讯云好像放不开881端口,我用的是阿里云
    在这里插入图片描述

1.4 Nginx的使用案例二

1、创建目录:

  • mkdir -p docker/nginx/html

2、rz,把在本地上传的ruozedata.html文件上传到linux系统:

3、mv ruozedata.html index.html
Nginx默认指向的是index.html文件

4、[root@hadoop001 nginx]# docker run --name ruozedata-nginx-g6-2 \

-d -p 882:80
-v $PWD/html:/usr/share/nginx/html:ro
nginx:latest
12660ae878e96a3707ecd8675130cee84ee32ff0017828f706eda4b036397735

  • -v会把本地的文件或文件夹挂载到容器中,最后的参数ro或者rw控制这个挂载是否可读写

5、查看状态:
[root@hadoop001 nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12660ae878e9 nginx:latest "nginx -g 'daemon of鈥 46 seconds ago Up 45 seconds 0.0.0.0:882->80/tcp ruozedata-nginx-g6-2
e8c6dbf48259 nginx "nginx -g 'daemon of鈥 35 minutes ago Up 35 minutes 0.0.0.0:881->80/tcp ruozedata-nginx-g6-1
[root@hadoop001 nginx]#

6、浏览器上查看882端口是否正确:
我的按照提示操作直接报错的:403 forbidden

如下图所示:
在这里插入图片描述

整个容器学习中最重要的是:制作生产、企业所需要的docker的image镜像,这才是占据了大部分工程师的工作量。

小结:Docker就是以进程的形式存在,一个容器中只能运行单个服务,运行了MySQL就不能运行HTTP.

1.5 Docker案例三

1、docker search hello

2、docker pull hello-world

3、docker run hello-world

To generate this message, Docker took the following steps:

1、The Docker client contacted the Docker daemon.

  • Dockers客户端要能连接到服务端

2、 The Docker daemon pulled the “hello-world” image from the Docker Hub.
(amd64)

  • Dockers进程从Dockers hub中拉取镜像

3、The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.

  • Dockers进程创建了一个新的容器,它执行一些输出结果供你阅读

4、The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

  • Docker进程以流式的方式发送到Docker客户端,会发送到你的终端

小结:

J总公司:Nginx、HTTP、Tomcat这些服务都是以Docker来部署的,Docker上的MySQL是用与开发、测试人员测试使用。

虚拟机上直接部署MySQL和在虚拟机上部署Docker上再部署MySQL;相比多了一层网络转发,性能的折扣大抵减少了20%。

注意:公司中涉及存储的组件服务要上生产德华,是不能使用Docker的;qa需要MySQL库,直接给他Docker测试环境

1.6 Docker案例四

常用命令:
1、docker images

[root@hadoop001 html]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f949e7d76d63        6 days ago          126MB
mysql               5.7                 383867b75fd2        2 weeks ago         373MB
hello-world         latest              fce289e99eb9        9 months ago        1.84kB

[root@hadoop001 html]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f949e7d76d63 6 days ago 126MB
mysql 5.7 383867b75fd2 2 weeks ago 373MB
hello-world latest fce289e99eb9 9 months ago 1.84kB

2、docker ps 显示的状态是up的,关闭的服务不显示

[root@hadoop001 html]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
12660ae878e9        nginx:latest        "nginx -g 'daemon of鈥   About an hour ago   Up About an hour    0.0.0.0:882->80/tcp   ruozedata-nginx-g6-2
e8c6dbf48259        nginx               "nginx -g 'daemon of鈥   2 hours ago         Up 2 hours          0.0.0.0:881->80/tcp   ruozedata-nginx-g6-1

3、docker ps -a 运行一次退出的也显示,有的组件服务一启动之后就会啪唧一下关了。

[root@hadoop001 html]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                 NAMES
c48a1b1a959c        hello-world         "/hello"                 33 minutes ago      Exited (0) 33 minutes ago                         angry_gould
4a768541ce19        hello-world         "/hello"                 33 minutes ago      Exited (0) 33 minutes ago                         wonderful_goldstine
12660ae878e9        nginx:latest        "nginx -g 'daemon of鈥   About an hour ago   Up About an hour            0.0.0.0:882->80/tcp   ruozedata-nginx-g6-2
e8c6dbf48259        nginx               "nginx -g 'daemon of鈥   2 hours ago         Up 2 hours                  0.0.0.0:881->80/tcp   ruozedata-nginx-g6-1
684b77634b57        hello-world         "/hello"                 2 hours ago         Exited (0) 2 hours ago 

第一步:

  • 我们pull的是5.7版本,但是-d 后面的mysql不加版本号的话,它就会去下载最新的版本号
[root@hadoop001 html]# docker run --name ruozedata-myqsl-g6-1 -e MYSQL_ROOT_PASSWORD=960210 -d mysql:5.7
2e86dd81f7f68823f6ec2101621189632d090abd5ea7794e07bce51939cf5d04

第二步:

  • docker ps 发现MySQL容器已经启动了
  • ps -ef|grep mysql 暂时没发现进程
  • netstat -nlp|grep mysql 也没监听到3306端口号
  • docker restart 2e86dd81f7f6 重启容器后还是没有用

记住一个命令:

  • docker exec -it 2e86dd81f7f6 /bin/bash 进入到容器实例中去
  • mysql -uroot -p960210 -P3306 和正常的启动mysql命令一样,加了一个-P3306端口
    在这里插入图片描述

方法二:启动的时候直接带上端口号:

1、重新取一个名字:

  • docker run --name ruozedata-mysql-g6-2 -e MYSQL_ROOT_PASSWORD=960210 -p3306:3306 -d mysql:5.7

2、List containers:(列出容器)

  • docker ps
[root@hadoop001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e6b326a89667        mysql:5.7           "docker-entrypoint.s鈥   12 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   ruozedata-mysql-g6-2
2e86dd81f7f6        mysql:5.7           "docker-entrypoint.s鈥   19 minutes ago      Up 13 minutes       3306/tcp, 33060/tcp                 ruozedata-myqsl-g6-1
12660ae878e9        nginx:latest        "nginx -g 'daemon of鈥   2 hours ago         Up 2 hours          0.0.0.0:882->80/tcp                 ruozedata-nginx-g6-2
e8c6dbf48259        nginx               "nginx -g 'daemon of鈥   2 hours ago         Up 2 hours          0.0.0.0:881->80/tcp                 ruozedata-nginx-g6-1

3、监听3306端口号:

  • netstat -nlp|grep 3306
[root@hadoop001 ~]# netstat -nlp|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      8262/docker-proxy 

4、ps -ef|grep 8262

[root@hadoop001 ~]# ps -ef|grep 8262
root      8262  3396  0 14:41 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3306 -container-ip 172.17.0.5 -container-port 3306
root      8532  7279  0 14:42 pts/3    00:00:00 grep --color=auto 8262

5、进入容器实例及进入MySQL

[root@hadoop001 ~]# docker exec -it e6b326a89667 /bin/bash
root@e6b326a89667:/# mysql -uroot -p960210
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

测试直接使用Dbeaver连接我们Docker中启动的MySQL:

  • 经测试是能够正常连接的,里面的内容和正常的
    在这里插入图片描述

问题:我们如何赋予普通用户某个数据库的权限呢?零基础班的知识

1、进入到数据库中:
create database ruozedata;

2、赋予所有权限给rz用户访问所有数据的所有权限,通过密码960210访问:
grant all privileges on *.* to rz@'%' identified by '960210';

3、刷新权限:
flush privileges;

Dbeaver测试能否正常连接:

在这里插入图片描述

所以MySQL的便捷性不容多说,小型公司一般会用Docker

  • 把MySQL塞到Docker(一个进程中),MySQL的存储也能够正常映射,毕竟是映射,没有原生的那么好,所以生产上不建议使用Docker。

  • windows系统上装了很多个centos系统,centos系统中启动容器,就相当于又要启动无数个进程,所以最大的一个就是网络的消耗,一个转换差不多是20%;机器故障断电的话还会发现容器启动不起来。

小结:无论啥公司,使用到容器,它的核心是啥?

  • 如何制作image?等价于 --> 如何制作Dockerfile文件构建docker image?

我们在容器上找一个5.7的镜像点击,会跳转到github上面:

  • 60%的时间是在制作镜像,我们现场制作一个镜像:

1、构建镜像的目的是减少重复的劳动力:

  • 可以单独做差异化的东西

正常制作image的步骤:
1、From 基础镜像
MAINTAINER 维护者信息

RUN 镜像的Linux操作命令:对应创建文件夹,容器启动的时候对应一些初始化的动作

  • ENTRYPOINT 配置容器启动:真正容器的镜像实例叫做Container;这是配置容器启动后只需的命令,每个Dockerfile文件只能由一个ENTRYPOINT,当然也可以指定多个,只有最后一个生效。

  • EXPOSE 运行的哪个端口号;

  • CMD指的是要启动的进程:mysqld,启动进程服务

注意:千万不能用Docker跑CDH;Docker是轻量级的能运行在任何地方,CDH是一个重量级的环境,底层依赖的是java、python;目前炒作的最火的是K8s。

企业中炒作的多的是Spark on Kubernetes,我们的存储和计算在一块儿的,叫做数据本地化;

  • DataNode和NodeManager是在一台机器上的,需要的数据在本台机器上就有,就从本台机器直接拉;
  • Spark在运行作业的时候,打开Web UI界面,Task会有不同级别的显示。

Data Locality(数据本地化)

1、PROCESS_LOCAL(进程级别)

2、NODE_LOCAL(节点)

3、NO_PREF data

4、RACK_LOCAL(相同机架上的其它节点)

5、Any data is elsewhere on the network and hot in the same rack

绝大部分的大数据存储都是要依赖于HDFS的,无论是Hive、HBase都是要依赖于HDFS的。

在容器出来后,提倡存储和计算分开;今天的网络带宽消耗、及磁盘转速已经能弥补差别了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐