docker相关试题

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源&#xff0c;创建一个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