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 sh
curl 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 list
test2
test1
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 app
cd 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构建Django
FROM python:3.6
# 安装Django
RUN 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 repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_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
# 安装nginx
RUN yum install -y nginx
# 容器启动时启动nginx
CMD 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改为v1
docker tag python3_django:v1 registry.cn-shanghai.aliyuncs.com/sepzhan/zmc:v1
# nginx改为v2
docker 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