大数据实战第四十二课 - Docker入门及实战
一、Docker入门1.1 Docker的安装1.2 Docker的卸载容器课程所需环境CentOS7.X,各位有需要购买云服务器的可以通过我的链接:点击进行购买,享9折优惠!阿里云9折优惠券,点击领取一、Docker入门举例:Window上面装了一个虚拟机,VM1、VM2、VM3都是linux系统;CentOS7.X系统上可以装很多个docker,docker1、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的。
在容器出来后,提倡存储和计算分开;今天的网络带宽消耗、及磁盘转速已经能弥补差别了。
更多推荐
所有评论(0)