1.什么是Docker?
Go语言开发,容器虚拟化技术,C/S架构,具有隔离、快速、轻便的特点。
Docker是容器的一种,容器指的是:一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
2.Docker与虚拟机有何不同?
相比于虚拟机,docker更快速、轻便。
快速:秒级启动
轻便:联合文件系统
Docker容器是一种轻量级的虚拟化技术,目的和虚拟机一样,都是为了创造隔离环境。
但是Docker不像VM,VM是采用操作系统级的资源隔离,容器采用的是进程级的系统隔离。
所以,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
3.Docker镜像是什么?
联合文件系统。
可以通过DockerFile构建或通过容器Commit生成。
4.Docker容器是什么?
镜像实例
容器技术就是对计算机资源的隔离与控制,可以理解为一种沙盒技术,沙盒就像集装箱一样。
5.Docker容器有几种状态?
四种状态:运行,暂停,重启,退出
6.DockerFile常见指令
FROM
ADD COPY
ENV WORKDIR
RUN
CMD ENTRYPOINT
7.Dockerfile中的命令COPY和ADD命令有什么区别?
COPY是复制文件
ADD可以自动解压
8.Docker常用命令
容器、镜像、仓库、日志、进程、元数据、拷贝
9.容器与主机之间的数据拷贝命令
docker cp <主机路径> <容器ID>:<容器路径>
docker cp <容器ID>:<容器路径> <主机路径>
10.启动nginx容器(随机端口映射),并挂载数据卷
docker run -d --name myNginx -P -v <主机路径>:<容器路径> nginx
11.什么是Docker Swarm?
与Docker引擎集成的集群管理
12.如何批量清理临时镜像文件?
docker rmi -f $(docker images -q)
13.如何查看镜像支持的环境变量?
docker run <镜像ID> env
14.本地的镜像文件都存放在哪里?
镜像文件路径:/var/lib/docker/image
容器文件路径:/var/lib/docker/containers
15.构建Docker镜像应该遵循哪些原则?
1).尽量选取满足需求但较小的基础系统镜像
2).清理编译生成文件、安装包的缓存等临时文件
3).安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖
4).从安全的角度考虑,应用尽量使用系统的库和依赖
5).使用Dockerfile创建镜像时候要添加.dockerignore文件或使用干净的工作目录
16.容器退出后,通过docker ps 命令查看不到,数据会丢失么?
docker ps -a
17.如何停止所有正在运行的容器?
docker kill $(docker ps -q)
18.如何退出容器不终止容器
Ctrl+P+Q
19.如何清理批量后台停止的容器
docker rm $(docker ps -aq)
20.如何查看容器日志?
docker logs <容器ID>
21.可以在一个容器中同时运行多个应用进程吗?
一般不推荐在同一个容器内运行多个应用进程
22.如何控制容器占用系统资源(CPU,内存)的份额?
docker run 时,可以
使用-c|–cpu-shares[=0]参数来调整同期使用CPU的权重,
使用-m|–memory参数来调整容器使用内存的大小。
23.Docker能在非Linux平台(Windows+MacOS)上运行吗?
可以
24.如何将一台宿主机的docker环境迁移到另外一台宿主机?
停止Docker服务,将整个docker存储文件复制到另外一台宿主机上,然后调整另外一台宿主机的配置即可
25.什么是docker-compose?
实现批量docker容器编排
26.docker的优点?
1.灵活
即使是最复杂的应用程序也可能被容器化。
2.轻量级
容器利用和共享主机内核。
3.更快速的交付和部署
Docker 容器很轻很快,容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
4.高效的部署和扩容
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云等,这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
27. Docker 的三个核心特性?
1.Image
Docker镜像是创建容器的基础,类似于虚拟机的快照,可以理解为Docker容器引擎的只读模板。
简单的理解为:Docker镜像是Docker 容器的静态视角,Docker镜像是启动Docker容器的基础。
2.Container
容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。
从镜像创建的运行实例,可以启动、停止和删除,创建的每个容器都是相互隔离且不可见的,以确保平台的安全性。
3.Repository
Docker仓库,英文名Repository,就是集中存放Docker镜像的地方。
一个 docker 存储库,是不同 Docker 镜像的集合。
Docker官方维护了一个公共仓库:https:/hub.docker.com,这里提供了可以满足大部分需求的Docker镜像。
28. Docker容器互访三种方式
我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。
方式一、虚拟ip访问
安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。
[root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
......
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:35ff:feac:66d8 prefixlen 64 scopeid 0x20<link>
ether 02:42:35:ac:66:d8 txqueuelen 0 (Ethernet)
RX packets 4018 bytes 266467 (260.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4226 bytes 33935667 (32.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
......
运行一个centos镜像, 查看ip地址得到:172.17.0.7
[root@CentOS ~]# docker run -it --name centos-1 docker.io/centos:latest
[root@6d214ff8d70a /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.7 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:7 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:07 txqueuelen 0 (Ethernet)
RX packets 16 bytes 1296 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
以同样的命令再起一个容器,查看ip地址得到:172.17.0.8
[root@CentOS ~]# docker run -it --name centos-2 docker.io/centos:latest
[root@33fcf82ab4dd /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.8 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:8 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:08 txqueuelen 0 (Ethernet)
RX packets 8 bytes 648 (648.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
容器内部ping测试结果如下:
[root@33fcf82ab4dd /]# ping 172.17.0.7
PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.205 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.119 ms
64 bytes from 172.17.0.7: icmp_seq=3 ttl=64 time=0.118 ms
64 bytes from 172.17.0.7: icmp_seq=4 ttl=64 time=0.101 ms
缺点:这种方式必须知道每个容器的ip,在实际使用中并不实用。
方式二、link
运行容器的时候加上参数link
运行第一个容器:
docker run -it --name centos-1 docker.io/centos:latest
运行第二个容器:
[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest
--link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。
测试结果如下:
[root@e0841aa13c5b /]# ping centos-1
PING centos-1 (172.17.0.7) 56(84) bytes of data.
64 bytes from centos-1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=4 ttl=64 time=0.114 ms
缺点:此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。
方式三、创建bridge网络
1.安装好docker后,运行如下命令创建bridge网络:docker network create testnet
查询到新创建的bridge testnet。
2.运行容器连接到testnet网络。
使用方法:docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>
[root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
[root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest
3.从一个容器ping另外一个容器,测试结果如下:
[root@fafe2622f2af /]# ping centos-1
PING centos-1 (172.20.0.2) 56(84) bytes of data.
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms
4.若访问容器中服务,可以使用这用方式访问 <网络别名>:<服务端口号>
将jar包打包为docker镜像
一, 拉取openjdk:8-jre
docker pull openjdk:8-jre
二,编写dockerfile
vim DockerFile
#penjdk:8-jre 为基础镜像,来构建此镜像,可以理解为运行的需要基础环境
FROM openjdk:8-jre
#WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行。自己创建
WORKDIR /opt/sentinel/
#将当前metabase.jar 复制到容器根目录下
ADD sentinel-dashboard-1.8.0.jar sentinel-dashboard-1.8.0.jar
#将依赖包 复制到容器根目录/libs下,metabase.jar已不再需要添加其它jar包
#ADD libs /libs
#暴露容器端口为3000 Docker镜像告知Docker宿主机应用监听了3000端口
EXPOSE 3000
#容器启动时执行的命令
CMD java -jar sentinel-dashboard-1.8.0.jar
三,使用docker build构建镜像
注意:这个命令是在我的DockerFile所在目录执行的,还有别忘记了命令后边的空格和点
docker build -f DockerFile -t sentinel:1.0.0 .
构建完成后使用以下命令查看是否有我们的test/metabase镜像
docker images
效果如下
[root@VM-4-11-centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sentinel 1.0.0 0c4ef1bf5b43 15 minutes ago 295MB
openjdk 8-jre 0c14a0e20aa3 7 months ago 274MB
四,运行docker镜像
//-d 表示后台运行容器 ,-p表示将宿主机的3000端口映射到容器中的3000端口,–name指定容器的名称
docker run -d --name sentinel docker -p 3000:3000 sentinel:1.0.0