1、什么是虚拟化
在物理计算机上虚拟化出多台逻辑计算机
2、Docker与虚拟机的区别
Docker
Docker:基于宿主机操作系统内核级别的虚拟化,启动秒级,更加轻量更高效,能够快速迁移,内存MB级别,容器与容器之间安全隔离,在Docker上能启动上千个容器
虚拟机
虚拟机:在宿主机操作系统内安装虚拟机管理程序,虚拟化出多个操作系统,再让软件运行在这些操作系统环境内。相比docker会占用更多的资源,能启动的虚拟机数量一般为几个或十数个(多了会卡,吃内存),启动级别为分钟级别,内存GB级别,虚拟机之间完全隔离,迁移能力一般
3、Docker中的三大概念
镜像,容器,仓库。
4、什么是镜像
镜像:容器运行的模板,是一个静态的概念。同时,也是一个只读模板,一个镜像可以创建出来很多个容器
5、什么是容器
容器:一个运行的实体,真正对外提供服务。一个容器在系统内就是一个进程。可以被启动, 删除, 停止, 每个容器相互隔。
6、什么是镜像仓库
仓库:存放镜像的仓库。需要的时候可以通过docker pull命令从仓库内拉取镜像到本地,也可以推送镜像进去
7、简要说明一下docker网络
Docker网络使用到 LInux 网络有关的技术 : 网络名称空间, Veth, Iptables, 网桥,路由
1. 网络名称空间 通过不同的网络名称空间实现网络资源隔离 2.Veth 设备对 通过 Veth 设备对实现不同网络名称空间之间的通信 3.IPtables 相当于一个防火墙,实现对流入流出数据的精确过滤 4.网桥 网桥相当于一个二层交换机(虚拟),可以把若干个网络网络接口连接起来, 从而实现报文的相互转发
8、docker网络的原理有哪些
在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据Docker 网桥的网段分配给容器一个 IP 地址,称为 Container-IP。
9、Linux网络隔离的方式
通过划分不同的命名空间,在这些命名空间都有独立的网络协议栈,彼此互不关联。
10、Linux不同网络之间互联的方式
通过网桥互联
网桥相当于一个二层交换机(虚拟),可以把若干个网络网络接口连接起来, 从而实现报文的相互转发
通过 Veth 设备对互联
通过 Veth 设备对实现不同网络名称空间之间的通信
通过 Iptables 互联
相当于一个防火墙,实现对流入流出数据的精确过滤
11、Docker网络模式
Host 模式
Container 模式
None 模式
Bridge 模式
12、Docker网络模式的实现原理
none:容器内仅有回环网络,无法对外连接。 bridge:多个容器连接到同一个网桥,通过网桥进行转发。 host:容器共享宿主机的网络名称空间,直接使用宿主机的端口。 container:容器不创建新的网络名称空间,直接使用另一个容器的网络名称空间。
13、怎么实现使用在宿主主机使用127.0.0.1访问容器
设置端口映射
“-p” 指定端口映射
“-P” 随机端口映射
docker run -dit -p 8888:80 nginx:1.19.2 shcurl 127.0.0.1:8888 #出現 HTML 代码说明映射成功
14、怎么共享一个容器的网络
docker run -d --network 共享的容器名 镜像名称或ID
设置 container 网络模式
创建共享容器 "cont01"[root@shawn ~]#docker run -dit --name cont01 busybox:latest创建链接容器 "cont02", 并指定网络模式 "container"[root@shawn ~]#docker run -dit --name cont02 --network "container:cont01" busybox:latest 查看两个容器的 "ip", 发现一样[root@shawn ~]#docker exec cont01 ip a[root@shawn ~]#docker exec cont02 ip a
15、怎么实现一个容器完全的网络隔离
docker run -d --network none 镜像名称或ID
通过创建不同的网络名称空间实现
[root@shawn ~]#ip netns add test1[root@shawn ~]#ip netns add test2[root@shawn ~]#ip netns listtest2test1
16、怎么实现多对多网络互联
使用 bridge(网桥)模式实现
将多个容器连到同一个网桥。 docker run --network bridge
17、创建一个容器
“run” 命令
docker run -d 镜像名称或ID#示例:docker run -d busybox:latest
18、随机映射端口
“-P” 参数
docker run -d -P 镜像名称或ID#示例docker run -d -P busybox:latest
19、固定映射端口
“-p” 参数
docker run -d -p 8888:80 镜像名称或ID# 示例:docker run -d -p 8888:80 busybox:latest
20、挂载存储卷
“-v” 参数
docker run -d -v 本地文件路径:容器文件路径 镜像名称或ID#示例docker run -d -v /root/test01:/usr/share/nginx/html nginx:1.19.2
21、为容器设置一个名字
“–name” 参数
docker run -d --name 容器名称 镜像名称或ID# 示例docker run -d --name test01 busybox:latesr
22、以守护进程方式运行一个容器
“-d” 参数
docker run -d 镜像名称或ID#示例docker run -d --name test1 nginx:latest
23、构建一个Django容器
1、在宿主机上安装好python3以及Django。
yum install -y python3 pip3 install django -i https://mirrors.aliyun.com/pypi/simple --trusted-host aliyun.com/pypi/simple
2、创建一个app项目
django-admin startproject appcd app django-admin startapp application
3、修改settings.py文件。
cd app [root@localhost app ]# vim settings.py 。。。省略行。。。# 在中括号内插入'*'ALLOWED_HOSTS = ['*'] 。。。省略行。。。# 将以下几行注释掉。DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# 'NAME': BASE_DIR / 'db.sqlite3',# }} 。。。省略行。。。
4、在宿主机系统上测试运行。
cd .. python3 manage.py runserver 0.0.0.0:8000
5、编辑Dockerfile文件
[root@localhost ~ ]# vim Dockerfile# 基于python3.6构建DjangoFROM python:3.6# 安装DjangoRUN pip3 install django==2.2.2 -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com/pypi/simple/# 将宿主机生成的app目录复制到镜像内。COPY app /root/# 镜像启动为容器后,在容器内启动Django。CMD cd /root && python3 manage.py runserver 0.0.0.0:8000
6、构建镜像。
docker build -t python3/django:v1 .
7、启动镜像,指定映射端口。
docker run -dit -p 3800:8000 python3/django:v1
8、测试可正常访问。
[root@localhost ~ ]# curl 127.0.0.1:3800<!doctype html> <html> <head> <meta charset="utf-8"> <title>Django: the Web framework for perfectionists with deadlines.</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="/stat 。。。省略行。。。
24、构建一个NGINX容器
1、在宿主机上配置好nginx的yum源文件。
设置yum源,创建一个nginx.repo文件。vim nginx.repo [nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true[nginx-mainline]name=nginx mainline repobaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true
2、编辑Dockerfile文件。
[root@localhost ~ ]# vim Dockerfile# 指定依赖镜像FROM centos:7# 安装nginx基础环境。RUN yum install -y yum-utils# 将yum源文件复制到镜像内。ADD nginx.repo /etc/yum.repos.d/# 建立yum元数据缓存RUN yum makecache# 安装nginxRUN yum install -y nginx# 容器启动时启动nginxCMD nginx -g 'daemon off;'
3、构建镜像
docker build -t centos7/nginx:v1 .
4、运行镜像为容器。
docker run -d -p 8888:80 --name my_nginx centos7/nginx:v1
5、测试是否能访问。
[root@localhost ~ ]# curl 127.0.0.1:8888<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; 。。。省略行。。。
25、使用NGINX代理Django
1、本地创建default.conf文件。
vim default.conf server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://192.168.112.129:3800/; index index.html index.htm; } }
2、将本地文件复制到容器中。
docker cp default.conf my_nginx:/etc/nginx/conf.d/
3、重启容器。
docker restart my_nginx
4、测试访问nginx
[root@localhost ~ ]# curl 127.0.0.1:8888<!doctype html> <html> <head> <meta charset="utf-8"> <title>Django: the Web framework for perfectionists with deadlines.</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="/static/admin/css/fonts.css"> <style type="text/css">
26、将以上镜像上传到镜像仓库
1、登录仓库。
docker login --username=sepzhan registry.cn-shanghai.aliyuncs.com registry.cn-hangzhou.aliyuncs.com/dock_tst/test_cr:[镜像版本号]
2、更改镜像名。
# django改为v1docker tag python3_django:v1 registry.cn-shanghai.aliyuncs.com/sepzhan/zmc:v1# nginx改为v2docker tag centos7/nginx:v1 registry.cn-shanghai.aliyuncs.com/sepzhan/zmc:v2
3、推送镜像至仓库。
# 推送Django镜像docker push registry.cn-shanghai.aliyuncs.com/sepzhan/zmc:v1# 推送nginx镜像docker push registry.cn-shanghai.aliyuncs.com/sepzhan/zmc:v2