1、虚拟机部署和容器化部署的区别是什么?
1、技术基础:
<1>.虚拟化技术在物理硬件上创建虚拟机,每台虚拟机运行自己完整的操作系统、从而实现资源隔离。
<2>.容器化技术:将应用程序打包在容器内,在进程空间上实现隔离。
2、资源效率和开销:
<1>.虚拟机比较占资源、导致资源使用率高。
<2>.容器共享宿主机操作内核、仅隔离程序进程。
3、隔离和安全性:
<1>.虚拟化:提供强大隔离性、提供高安全性,但资源占用率大。
<2>.容器化:虽然实现了隔离,但共享宿主内核,但是隔离性稍差。
2、什么是docker?什么是镜像、容器、仓库?
docker是一种开源平台,允许开发者将程序部署在容器中。可以部署在任何环境中,确保一致性和可移植性。
镜像是容器的模板,用来创建容器的。一个镜像可以创建出多个容器。
容器是用来运行各种应用程序、服务的。
仓库是用来存储镜像文件的地方。仓库分为公有仓库和私有仓库,存放了大量的镜像供用户下载
3、什么是docker容器?
docker容器是运行中的实例。
4、如何从dockerfile构建镜像?
使用docker build命令进行构建镜像。
docker build -t myimage:latest // -t用于指定镜像标签
5、如何运行一个docker?
使用docker run命令运行docker
docker run -d --name mycontainer myimage:latest
// 运行一个基于myimage:latest镜像的容器
6、如何查看正在运行的docker容器?
可以使用docker ps 命令进行查看。
如果要查看所有的容器,包括已经停止的docker ,可以使用
docker ps -a // 查看所有容器(包括已经停止的docker容器)
7、如何停止和删除一个容器?
使用docker stop 和 docker rm命令进行查看。
例如停止并删除mycontainer容器。
docker stop mycontainer // 停止使用mycontainer容器
docker rm mycontainer // 删除mycontainer容器。
8、Docker安装失败了如何进行排查?
1、检查系统是否满足Docker的安装要求。
2、在/var/log目录下进行查看日志
3、检查防火墙或云服务的安全组设置,确保Docker需要的端口没有被阻塞。
4、确保操作系统和所有软件包都是最新的,有时旧的软件包可能会导致安装问题。
5、尝试清理环境后重新安装
9、镜像管理
在dockers中镜像是容器的模板,当用户需要从Docker镜像中查找所需要的镜像。
1、查找镜像
docker search keyword(keyword表示要查找镜像所包含的关键词)
eg:要查找出包含mysql的关键词 // docker search mysql
2、下载镜像
查找到合适的镜像后,可以将其下载到本地计算机中,以便创建容器。
docker pull name:tag // name为镜像名称、tag参数指定镜像标签
eg:docker pull mysql // 将mysql镜像下载到本地计算机中
3、列出本地镜像
docker image ls // 列出本地镜像
docker images
4、删除镜像
对于当前系统中已经不需要的镜像,为了节省存储空间 。可以将其删除。
可以同时删除多个镜像,多个镜像名称使用空格进行隔开即可。
docker rmi image //image为镜像名称
docker rmi -f mysql //强行删除mysql镜像
5、查看镜像
对于下载到本地的镜像文件,可以使用docker inspect进行查看详细信息。
root@ubuntu-virtual-machine:/home/ubuntu# docker inspect mysql
6、构建镜像
构建docker镜像有两种方法:
1、docker commit命令进行构建
2、docker build 命令和Dockerfile文件进行构建,但是过程十分繁琐。因此一般我们使用docker commit进行构镜像。
3、使用docker commit进行构建镜像。
eg:在docker中进行创建数据库mysql并进行映射到主机的3306端口
1、在docker中创建数据库
docker run --name mysqltest -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
// --name 进行对容器进行命名
// -e 对创建的MySQL进行密码设置为123456 、账号为root
// -p 对docker创建的MySQL进行端口映射
// -d 后台运行容器
2、进入创建好的容器mysqltest中
docker exec -it mysqltest /bin/bash
// -i表示交互式,-t 表示分配一个虚拟终端。/bin/bash为要执行的命令。
3、进入交互式页面
mysql -uroot -p
password:123456 // 进入数据库
7、镜像标签管理
镜像标签可以区分不同的版本,镜像和标签之间可以使用冒号进行隔开。
docker提供了docker tag命令来设置镜像的标签。
docker tag httpd local/httpd // 将名称为httpd的镜像标识为local仓库的httpd
10、容器管理
容器是docker提供网络服务的主体,为了提供mysql,apache,nginx等网络服务,用户必须创建对应的容器。
在docker中常使用docker create 创建容器,但是创建的新容器处于停止状态。
另一种是通过docker run 创建新容器,但是容器会启动。
1、创建容器
docker create [option] image
用户可通过option为容器指定相应的选项。用来设置新的容器。
--add-host=[] //指定主机到IP地址之间的关系,格式为host:ip
--dns=[] //为容器指定域名服务器
-h //为容器指定主机名
-i //打开容器的标准输入
--name //指定容器名称
-u //创建用户
eg1:创建一个名为yunwei的容器
docker create yunwei
eg:创建一个名为yunwei的容器,创建之后立即启动该容器,并进入交互模式
root@ubuntu-virtual-machine:/home/ubuntu# docker run -it --name yunwei ubuntu /bin/bash
root@0dd80eac1c83:/# pwd
/
root@0dd80eac1c83:/# exit
root@ubuntu-virtual-machine:/home/ubuntu# docker run -d -it ubuntu /bin/bash
// 创建一个后台型容器
ec313748b83eeda0f07681480a27003616260b2f74566541ca8c3079f513b608
2、查看容器
docker ps //查看当前正在运行的容器
docker ps -a //查看当前系统中所有的容器,包括运行中的个处于停止状态的容器
有些容器的状态为Exited 表示已经停止运行
有些容器的状态为up 表示处于运行状态
有些容器的状态为Created 表示处于创建过,但是没有启用
查找某些特定的容器
docker ps -a -f name=crank // -f指定筛选条件
root@ubuntu-virtual-machine:/etc/docker# docker ps -a -f name=mysql
field=value //field表示name,image,以及status等字段docker ps -a --before=ubuntu //ubuntu容器之前所建的所有容器
docker ps -a --since=ubuntu //Ubuntu容器之后所建的所有容器
3、启动容器
通常使用docker start命令来进行启动容器。
使用docker restart命令来进行重启容器
使用docker stop 命令来进行停止容器
使用docker kill命令来强制终止容器
使用docker rm 命令来删除容器,加上-f参数就是强制删除容器。
11、网络管理
1、docker的网络原理
在docker安装完成后,宿主机中会创建一个虚拟网桥,通常情况下为docker 0。
网桥工作在OSI七层模型中的数据链路层,在docker中各个容器是通过一个名为docker 0的网桥进行转发流量实现互联的。
一般使用brctl show命令来查看虚拟网桥docker0的信息
root@ubuntu-virtual-machine:/home/ubuntu# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024277a58ad4 no vethdb861c4
2、docker的网络模式
网络模式可以在创建容器时使用 --network选项来指定。
docker网络模式一共分为4种,分别是host,container,none,bridge。
host模式:容器不会获得一个独立的Network命名空间,而是和宿主机共用一个Network命名空间。容器将不会虚拟出 自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
container模式(容器模式):新创建的容器和已经存在的容器共享一个Network命名空间,和指定容器共用一个IP地址,端口范围 等。
none模式(无模式):docker拥有自己的Network命名空间,但是不为docker配置任何网络,需要我们自己手动添加网络配置。
bridge模式(桥接模式):bridge模式是docker默认的网络模式,此模式会为每一个容器分配一个Network命名空间,并将主机上的 docker容器连接到一个虚拟网桥上。
docker容器的网络互联:
// 创建第一个容器
root@ubuntu-virtual-machine:/home/ubuntu# docker run -d -it centos /bin/bash
394b4650ba5bfeacc9c86217f681b79ef79dcf663f65d3021b2312be1949b628
// 创建第二个容器
root@ubuntu-virtual-machine:/home/ubuntu# docker run -d -it centos /bin/bash
720e4167f96280673f5193f025cb75eaf303b972d7dca4ecc552ef0d5b11abf2
// 查看容器运行状态
root@ubuntu-virtual-machine:/home/ubuntu# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c521fb7136cc centos "/bin/bash" 6 seconds ago Up 5 seconds blissful_leakey
720e4167f962 centos "/bin/bash" 16 seconds ago Up 15 seconds youthful_diffie// 获取容器的IP地址
root@ubuntu-virtual-machine:/home/ubuntu# docker exec c521fb7136cc ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@ubuntu-virtual-machine:/home/ubuntu# docker exec 720e4167f962 ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
// ip地址分别为:172.17.0.4/16;172.17.0.3/16// 使用icmp协议ping命令查看是否可以通信
root@ubuntu-virtual-machine:/home/ubuntu# docker exec c521fb7136cc ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.022 msroot@ubuntu-virtual-machine:/home/ubuntu# docker exec 720e4167f962 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.021 ms// 由此可见两容器之间都可以进行通信
// 容器与外部网络的互联通信
root@ubuntu-virtual-machine:/home/ubuntu# docker exec 720e4167f962 ping www.baidu.com
PING www.a.shifen.com (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=127 time=36.2 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=127 time=35.8 ms
12、Docker仓库
1、什么是Docker Hub?
Docker Hub是Docker提供的一项服务,帮助用户查找和共享容器镜像
2、Docker Hub的特点?
1、使用pull和push进行上传和拉取镜像。
docker pull从Docker Hub中进行拉取镜像到本地机器、创建容器进行使用。
docker push是将本地镜像上传到docker hub仓库,当对本地镜像进行修改之后想要分享给他人使用,可以使用
2、Docker官方镜像:提取并使用Docker提供的高质量容器镜像。
3、使用Docker Hub
答:1、使用Docker Hub和Docker Desktop进行镜像管理
2、使用docker login命令进行管理
13、Docker的数据管理
1、什么是数据卷?
数据卷是为一个或多个容器专门指定的目录。
特点:
1、可以在容器间共享和重用。
2、数据卷的数据改变可以直接修改
3、数据的改变不会包括在容器中
4、数据卷是持续的,直到没有容器使用。
2、如何创建数据卷?
docker提供volume进行管理数据卷
使用docker进行创建数据卷
docker volume create -d local volume_demo
// 创建一个volume_demo的数据卷
// 存在目录位于/var/lib/docker/volume路径下
使用docker inspect 命令可进行查看详细信息
3、数据卷的分类
在运行容器时可以通过指定-v 或 --mount参数来使用该Volume,并且可以依据数据卷类型不同挂在不同类型的数据卷。
在docker中数据卷分为三类:
volume普通数据卷,Bind绑定数据卷,tmpfs临时数据卷
volume普通数据卷:映射到特定位置:/var/lib/docker/volumes
Bind绑定数据卷:映射到主机的任意位置
tmpfs临时数据卷:只存在于内存中
查看运行的容器和数据卷信息
root@ubuntu-virtual-machine:/home/ubuntu# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef9d2eed6a28 mysql "docker-entrypoint.s…" 36 minutes ago Up 36 minutes 3306/tcp, 33060/tcp mysqltest
1d65b1b42524 httpd "httpd-foreground" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp, :::80->80/tcp reverent_fermatroot@ubuntu-virtual-machine:/home/ubuntu# ls -al /var/lib/docker/volumes/
数据迁移
数据卷可以有效的进行数据备份,恢复,和迁移。
14、Docker日志
1、docker logs
作用:docker logs主要是用来进行查看日志
docker logs [options] container
// 可以通过子命令来查看具体某个容器的日志
docker logs container (此时看到的容器日志是静态的)
// 如果想要看到动态的容器日志,加上-f参数即可
docker logs -f container
docker logs命令选项
Options:
--details 显示提供给日志的其他详细信息
-f, --follow 跟踪日志输出
--since string 显示给定的时间戳 (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string 从日志末尾显示n行的日志
-t, --timestamps 显示时间戳
--until string 显示给定的时间戳 (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
2、logging driver
docker允许我们从运行的容器中提取日志、这个机制就被称为logging driver
docker默认的logging driver文件格式为json-file
快速查看nginx的日志文件路径:
root@node:/home/ubuntu# docker inspect nginx_server | grep -i logpath
"LogPath": "/var/lib/docker/containers/1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008/1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008-json.log"root@node:/home/ubuntu# cd /var/lib/docker/containers/1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008/
root@node:/var/lib/docker/containers/1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008# ls
1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008-json.log checkpoints config.v2.json hostconfig.json hostname hosts mounts resolv.conf resolv.conf.hash
root@node:/var/lib/docker/containers/1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008# cat 1bcf7355d531834fd7d3b9cbf2408a897cb6756d205f0c12b46679e7a8677008-json.log
3、安装ELK日志监控系统
ELK是可以进行搜集、过滤、传输、存储以及实现多系统的组件日志进行集中管理,并且可以帮助运维人员进行线上业务的实时监控,以及业务异常的标准定位。
ELK优点:1、安全性、密钥库和访问控制。
2、可以进行管理日志和指标等
3、仪表盘和可视化界面
4、可以确定在哪里找到其他资源
1、采用docker方式进行部署
docker pull sebp/elk:640 // 下拉sebp/elk、640版本的镜像2、启动ELK服务
docker run -it --name=elk -p 5601:5601 -p 9200:9200 -p 5044:5044 -d sebp/elk:6403、浏览器访问ELK页面
http://192.168.159.131:56014、浏览器访问
http://192.168.159.131:9200 (查看API接口是否可用)