1,基础
Docker是一种基于操作系统级别的虚拟化技术。
操作系统级虚拟化
是运行在操作系统之上的虚拟化技术,它模拟的是一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里,改技术也称为容器化技术。Docker是目前最流行的一种实现,发布于2013年,基于lxc(linux container)技术,是linux平台上的容器化技术。起源于2010年,dotCloud.
硬件级虚拟化
是运行在硬件上的虚拟化技术,核心技术是Hypervisor(管理程序),它是一种运行在基础物理服务硬件上的软件层,可以虚拟化硬件资源。VMWare是一种基于硬件的虚拟化技术。
Docker是一个开源的应用容器引擎,它是基于google公司推出的GO语言实现的。它是一种轻量级别的虚拟化解决方案。注意:Docker本身不是容器,只是管理容器的引擎。
容器是将代码和环境打包在一起的一个集合,虚拟机是在物理层面上,分出来的操作系统。
多个容器可以运行在一个物理服务器上,并共享一个操作系统内核资源。
Docker和传统虚拟化方式的不同:
虚拟机有独立的操作系统;
Docker不需要独立的操作系统;启动秒级别启动,硬盘空间一般MB,性能接近原生,系统支持上千个,与宿主机共享操作系统;
2,Docker环境搭建
Empowering App Development for Developers | Docker
安装:
(1)切换到自己的目录,cd /home/soft/
yum insatll docker -y
(2)检查
yum list installed|grep docker
docker --version/docker -v
(3)卸载:
yum remove docker.x86_64
yum remove docker-client.x86_64
yum remove docker-common.x86_64
(4)启动
先确认一下:ps -ef|grep docker/systemctl status docker
启动:systemctl start docker
停止:systemctl stop docker
重启:systemctl restart docker
(2)docker常用指令
查看docker系统信息:docker info
查看所有帮助信息:docker
查看某个commond命令的帮助信息:docker commond --help 例如:docker wait --help
3,docker运行机制
底层于运行原理:Docker服务启动->下载镜像->启动该镜像得到一个容器->容器里运行着我们想要的程序;
客户端-》Docker引擎-》远程镜像
1,服务启动
2,下载一个镜像,Docker运行前需本地存储对应的镜像,若不存在,会去远程镜像下载
默认:
centos如何下载镜像:从docker hub搜索,官方搜索:https://hub.docker.com/search?type=image,也可以使用命令行搜索
docker search tomcat,然后下载:
下载镜像:docker pull tomcat
远程镜像:docker run tomcat (默认前台运行,后台运行加参数 -d :docker run -d tomcat)
显示本地已有的镜像:docker images
4,Docker容器访问机制
Docker与linux基于桥接进行访问,需要做网络参数映射
查看当前运行的容器:docker ps
停止: docker stop cd00cba34aa0
再次查看:docker ps
再次启动(带端口映射):-p 8080:8080(端口映射)
docker run -d -p 8080:8080 tomcat
启动方式
可以使用容器名称或者容器ID
docker images
docker.io/tomcat latest fb5657adc892 4 days ago 680 MB
启动:
方式1:docker run -d docker.io/tomcat
方式2:docker run -d fb5657adc892
进入docker容器:
docker exec -it 1b02d7543739 bash
其中i表示交互式,保持标准输入流打开;t表示虚拟控制台,分配一个虚拟控制台;
ps:
选项 | 选项简写 | 说明 |
–detach | -d | 在后台运行容器,并且打印容器id。 |
–interactive | -i | 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。 |
–tty | -t | 分配一个伪tty,一般与 -i 连用。 |
-i 选项指示 docker 要在容器上打开一个标准的输入接口,-t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入。
ls -l查看
退出容器:exit
tomcat9以上404解决:
首先执行docker run -d -p 8888:8080 tomcat
查看防火墙是否关闭service firewalld status
如果开启使用service firewalld stop:关闭防火墙
docker ps
1b02d7543739
使用 docker exec -it [tomcat的CONTAINER ID] /bin/bash 进入容器内部
使用ls -l查看目录
把webapps先改为webapps2 命令: mv webapps webapps2
再把webapps.dist改成webapps 命令:mv webapps.dist webapps
退出exit
重新访问浏览器就可以了
*如果tomcat页面还没出来,把浏览器关掉,重新打开访问
5,Docker核心组件
Docker容器通过Docker镜像来创建,类似于面型对象编程中类和对象的关系;
三要素:
镜像(Image),容器(Container),仓库(Repository)
(一)镜像:一个只读模板,用来创建Docker容器。可以自己创建镜像
bootfs:引导文件系统;Base Image:基本运行环境
镜像的日常操作:
(1)下载镜像:docker pull [镜像名字]:[版本号]
一种是官方下载,一种是自己构建镜像Docerfile
(2)列出已经下载的镜像:docker images redis
(3)运行镜像: docker run -d redis
(4)查看容器镜像状态:docker ps
(5)删除镜像:docker rmi redis:[版本号],注意rmi是删除镜像,rm是删除容器
(二)容器:从镜像创建的运行实例。它可以启动,停止,删除,每个容器相互隔离。
(1)通过镜像启动容器 :docker run -d redis
查看运行容器:docker ps
查看所有容器:docker ps -a
停止容器:docker stop 容器id/容器名称
开启容器:docker start 容器id/容器名称
(2)删除和创建容器(容器太轻量化,存在损失删除)
删除容器:docker rm 容器id/容器名称(删除容器是,容器必须停止)
进入容器:docker exec -it 容器id/容器名称 bash
进入容器:docker inspect 容器id/容器名称
复杂命令:
停用所有容器 docker stop ${docker ps -q}
删除容器 docker rm ${docker ps -aq} 解释:a:所有容器;q:运行的容器
停用并删除容器:docker stop ${docker ps -q}&docker rm ${docker ps -aq}
切换到docker目录
cd /etc/docker/
小技巧:添加国内加速映射
vim daemon.json
{"registry-mirrors":["https://gg3gwnry.mirror.aliyuncs.com"]}
(三)仓库:仓库是集中存在镜像文件的场所。仓库和仓库注册服务器。仓库服务器包括很多仓库。
仓库分为公开仓库和私有仓库。
最大的仓库:https://hub.docker.com/
国内镜像:https://promotion.aliyun.com/ntms/act/kubernetes.html
私有仓库:公司内部
Docker仓库类似GIT,注册服务器类似github的托管服务;
(1)查找官方镜像:docker search redis
镜像分为两类:官方和非官方(用户创建)
下载镜像:docker pull [镜像名字]:[版本号]
6,docker容器安装
一,Mysql安装相关:
(1)下载docker pull mysql:[版本号]
(2)启动docker run -p 3306:3306 -e MYSQL_DATABASE=workdb[创建一个数据库] -e MYSQL_ROOT_PASSWORD=123456 -d mysql:[版本号]
其中-e指定环境变量
(3)进入容器:docker exec -it 容器id
(4)登陆mysql -uroot -p
(5)修改密码 AlTER USER 'root'@'localhost' IDENTIFIED BY '123456'
(6)创建一个test用户并授权远程登陆访问:
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* to 'test'@'%';
二,Nginx安装
(1)下载docker pull nginx
(2)docker run -d -p 80:80 nginx
docker ps
(3)进入容器 docker exec -it 容器id bash
which nginx
(4)访问nginx:
nginx相关目录:
(5)将文件部署到docker
nginx部署静态网站
docker cp /home/soft/test.html 2da8b3e4899f:/usr/share/nginx/html
三、Zookeeper
(1)docker pull zookeeper
(2)docker run -d -p 2181:2181 zookeeper
(3)docker ps
(4)docker exec -it 987f804ea5c4 bash
(5)客户端访问zookeeper
Zookeeper数据查看工具ZooInspector
Zookeeper数据查看工具ZooInspector - 简书
1、下载
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip;
7,Docker自定义镜像
(1)Dockerfile文件:用来构建Docker进行,命令行组成。
Dockerfile分为4部分:
基础镜像信息;(必须)
维护者信息;
镜像操作指令;(必须)
容器启动时执行指令;
构建镜像:docker build -t [自定义名字] .
-t指定标签 .表示当前文件
docker build -f ./Dockerfile -t [自定义名字] .
运行镜像:docker run -d
netstat命令不可用,安装net-tools:
yum install net-tools
net-tools工具箱包括arp, hostname, ifconfig, netstat, rarp, route, plipconfig, slattach, mii-tool and iptunnel and ipmaddr等命令。
# 基础镜像,继承的镜像
FROM centos:7.0
# 声明作者,邮箱使用 ‘<>’,用户名不需要,可选
MAINTAINER root
# 执行命令,可选 &&连接符
#Run<commmand> Run指令将在当前镜像基础上执行指定命令,并提交新的镜像,连接符“\”
RUN yum install -y net-tools java-1.8.0-openjdk-devel && yum clean all
# 增加文件,可选,有 ADD 和 COPY 两种,不同之处在于:
# ADD 会将压缩包解压,可能导致一些意外情况;COPY 不会
# ADD 可以添加远程文件;COPY 不可以
# 值得注意的是 <src> 和 <dest> 路径最后的 ‘/’ 要根据需求对应,否则会成为子目录
#ADD <src> <dest>
COPY ./rec-content-creep-rpc/script/lib /data/rec-content-creep-rpc/script/lib
COPY ./rec-content-creep-rpc/script/run_server.sh /data/rec-content-creep-rpc/script/
# 配置环境变量,可选
#ENV <key> <value>
# 入口命令,可选,有 ENTRYPOINT 和 CMD 两种,不同之处在于:
# docker-run 的指定命令不会覆盖 ENTRYPOINT,而是会追加到 ENTRYPOINT 之后;CMD 会被覆盖
# CMD 也作为 ENTRYPOINT 的参数,比如
# ENTRYPOINT ["ls"]
# CMD ["-a", "-l"]
# 这样的默认入口进程为 /bin/sh -c "ls -a -l"
#ENTRYPOINT <command>
#ENTRYPOINT ["cmd", "arg1", "arg2"]
#CMD <command>
#CMD ["cmd", "arg1", "arg2"]
#指定容器执行的命令,每个Dockerfile只有一条CMD命令,若指定多条,只有一条会执行
CMD sh /data/rec-content-creep-rpc/script/run_server.sh
或者
CMD /data/rec-content-creep-rpc/script/run_server.sh run
# 暴露的端口,可选
#告诉Docker服务器暴露的端口号,供调用使用,在启用容器时,需指定-p
# EXPOSE <port> [<port>...]
EXPOSE 8080
8,镜像加速器
阿里云:
开放云原生应用-云原生(Cloud Native)-云原生介绍 - 阿里云
加速地址:
https://2k0tlj0y.mirror.aliyuncs.com
9,Docker应用部署
10,java -jar和java -cp有什么区别?
假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World
package com.test;
public class Test {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
我们有以下两种方法
1. java -jar Test.jar
2. java -cp com.test.Test Test.jar
java -jar
我们解压jar包,META-INF文件夹下都有MANIFEST.MF,内容如图:
MANIFEST.MF样例:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: xxxx
Start-Class: com.example.testApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.1.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_191
Main-Class:com.test.Test(org.springframework.boot.loader.JarLauncher)
java -jar就是通过Main-Class来找到Test类并执行其中的main(),输出Hello World!
如果你的MANIFEST.MF文件中没有Main-Class,
就会提示Cant load main-class之类的错误。
所以在导出jar包的时候一定要指定main-class。
java -cp
对于java -cp就不需要指定Main-Class来指定入口。
因为第一个参数就是你的jar包,第二个参数就指定了你的入口类。
它会根据你的jar包找到第一个参数指定的启动类。
-cp其实就是classpath,在linux中多个jar包用 : 分割,代表了程序运行需要的所有jar包。这样就可以不用将所有依赖都放到Test.jar下.这样做的好处就是,假如修改了Test类,只上传修改后的Test.jar到服务器即可,不需要再将所有依赖放到Test.jar中再上传一遍,节约了时间。
linux(Mac)格式:
java -cp .:你的jar包路径 主类的全限定名称
举例:
java -cp .: myClass.jar org.springframework.boot.loader.JarLauncher
注意:
windows下为:.;myClass.jar
通配符版本:
java ${jvm_opt} ${system_prop} -cp .:${JAR_NAME} ${MAIN_CLASS}