Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

容器 安装 kali 容器装载_bash


容器 安装 kali 容器装载_bash_02

一、docker的安装与部署

系统环境:要求centos7以上,内核必须不小于3.10

下载包,安装 ,启动服务,并查看

[root@foundation50 Desktop]# ls
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
tidb
u=1157039478,3562742726&fm=11&gp=0.jpg
u=3125687640,261110254&fm=11&gp=0.jpg
u=769843676,2995011661&fm=11&gp=0.jpg
Untitled Folder
[root@foundation50 Desktop]# yum install -y docker-engine-*
[root@foundation50 Desktop]# systemctl start docker
[root@foundation50 Desktop]# docker info

容器 安装 kali 容器装载_docker_03

二、镜像的导入和容器的使用

1、导入镜像并查看

[root@foundation50 Desktop]# mv game2048.tar /var/www/html/images/
[root@foundation50 Desktop]# cd /var/www/html/images/
[root@foundation50 images]# ls
game2048.tar
[root@foundation50 images]# docker load -i game2048.tar 
011b303988d2: Loading layer  5.05 MB/5.05 MB
36e9226e74f8: Loading layer 51.46 MB/51.46 MB
192e9fad2abc: Loading layer 3.584 kB/3.584 kB
6d7504772167: Loading layer 4.608 kB/4.608 kB
88fca8ae768a: Loading layer 629.8 kB/629.8 kB
Loaded image: game2048:latest

容器 安装 kali 容器装载_docker_04

2、使用镜像创建容器,并查看信息

[root@foundation50 images]# docker run -d --name vm1 game2048

容器 安装 kali 容器装载_容器 安装 kali_05

[root@foundation50 images]# iptables -t nat -nL

容器 安装 kali 容器装载_docker_06

[root@foundation50 images]# docker inspect vm1

容器 安装 kali 容器装载_docker_07

3、网页查看

容器 安装 kali 容器装载_bash_08

4、同样的方式导入nginx查看

[root@foundation50 images]# docker images nginx 
[root@foundation50 images]# docker run -d --name vm2 -p 8080:80 nginx
[root@foundation50 images]# docker ps

容器 安装 kali 容器装载_bash_09

[root@foundation50 images]# docker inspect vm2

容器 安装 kali 容器装载_bash_10

在网页上可以搜 172.17.0.3

容器 安装 kali 容器装载_bash_11

输入真机 IP + 端口 ,意思是可以做端口映射:

容器 安装 kali 容器装载_bash_12

5、远程

[root@foundation50 images]# cd /etc/docker/
[root@foundation50 docker]# ls
key.json
[root@foundation50 docker]# vim deamon.json

{
  "registry-mirrors": ["https://4hih87cm.mirror.aliyuncs.com"]
}

[root@foundation50 docker]# systemctl daemon-reload
[root@foundation50 docker]# systemctl restart docker
[root@foundation50 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
64893efa7c20        nginx               "nginx -g 'daemon ..."   46 minutes ago      Exited (0) 13 minutes ago                         vm2
6a464e8a5b1c        game2048            "/bin/sh -c 'sed -..."   About an hour ago   Exited (137) 13 minutes ago                       vm1
[root@foundation50 ~]# docker rmi nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 64893efa7c20 is using its referenced image af4b3d7d5401
[root@foundation50 ~]# docker rm vm2
vm2
[root@foundation50 ~]# docker rmi nginx
Untagged: nginx:latest

容器 安装 kali 容器装载_容器 安装 kali_13

[root@foundation50 ~]# docker search nginx

容器 安装 kali 容器装载_bash_14

[root@foundation50 ~]# docker search nginx

容器 安装 kali 容器装载_bash_15

[root@foundation50 ~]# cd /etc/docker
[root@foundation50 docker]# ls
deamon.json  key.json  nginx.tar
[root@foundation50 docker]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
6a464e8a5b1cc67f7edf7425bb585a5440270276a9730e41e1a74f71a5e93624

Total reclaimed space: 4.074 kB
[root@foundation50 docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

容器 安装 kali 容器装载_nginx_16

[root@foundation50 docker]# docker load -i nginx.tar 
cdb3f9544e4c: Loading layer 58.44 MB/58.44 MB
a8c4aeeaa045: Loading layer 54.24 MB/54.24 MB
08d25fa0442e: Loading layer 3.584 kB/3.584 kB
Loaded image: nginx:latest
[root@foundation50 docker]# docker run -d --name vm1 nginx
ea5890cf08dd1102ff9691f3f2db6a4f3d4a92eb870fa50b9c7e2103aa101d01
[root@foundation50 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea5890cf08dd        nginx               "nginx -g 'daemon ..."   17 seconds ago      Up 16 seconds       80/tcp              vm1
[root@foundation50 docker]# cd
[root@foundation50 ~]# vim index.html

www.westos.org

容器 安装 kali 容器装载_docker_17

[root@foundation50 ~]# docker inspect vm1

容器 安装 kali 容器装载_nginx_18

在网页输入 所查询到的 172.17.0.2

容器 安装 kali 容器装载_nginx_19

[root@foundation50 tmp]# mkdir docker
[root@foundation50 tmp]# cd docker/
[root@foundation50 docker]# ls
[root@foundation50 docker]# mkdir web
[root@foundation50 docker]# cd web/
[root@foundation50 web]# cd
[root@foundation50 ~]# mv index.html /tmp/docker/web/
[root@foundation50 ~]# docker run -d --name vm1 -v /tmp/docker/web/:/usr/share/nginx/html nginx
docker: Error response from daemon: Conflict. The container name "/vm1" is already in use by container ea5890cf08dd1102ff9691f3f2db6a4f3d4a92eb870fa50b9c7e2103aa101d01. You have to remove (or rename) that container to be able to reuse that name..
See 'docker run --help'.
[root@foundation50 ~]# docker stop vm1
vm1
[root@foundation50 ~]# docker rm vm1
vm1
[root@foundation50 ~]# docker run -d --name vm1 -v /tmp/docker/web/:/usr/share/nginx/html nginx

容器 安装 kali 容器装载_容器 安装 kali_20

[root@foundation50 ~]#  docker inspect vm1

容器 安装 kali 容器装载_bash_21

[root@foundation50 ~]# cd /tmp/docker/web/
[root@foundation50 web]# ls
index.html
[root@foundation50 web]# vim index.html 
<h1>www.westos.org</h1>

网页上输入 172.17.0.2

容器 安装 kali 容器装载_容器 安装 kali_22

[root@foundation50 web]# docker save nginx > nginx.tar
[root@foundation50 web]# docker history nginx

容器 安装 kali 容器装载_容器 安装 kali_23

6、数据卷管理

创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录

[root@foundation50 web]# cd /etc/docker/
[root@foundation50 docker]# ls
deamon.json  key.json  nginx.tar  rhel7.tar
[root@foundation50 docker]# docker
docker                  docker-containerd-ctr   dockerd                 docker-proxy
docker-containerd       docker-containerd-shim  docker-init             docker-runc
[root@foundation50 docker]# docker load -i rhel7.tar 
e1f5733f050b: Loading layer 147.1 MB/147.1 MB
[root@foundation50 docker]# docker run -it --name vm2 rhel7 bash
bash-4.2# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
bash-4.2# exit

并且可以设置读写权限

[root@foundation50 docker]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash

容器 安装 kali 容器装载_容器 安装 kali_24

[root@foundation50 tmp]# cd data1/
[root@foundation50 data1]# ls
[root@foundation50 data1]# touch file1
[root@foundation50 data1]# pwd
/tmp/data1
[root@foundation50 data1]#
bash-4.2# cd /data2/
bash-4.2# ls
file
bash-4.2# rm -fr file
rm: cannot remove 'file': Read-only file system
bash-4.2# cd /data1
bash-4.2# ls
file1
bash-4.2# rm -fr file1

容器 安装 kali 容器装载_容器 安装 kali_25

[root@foundation50 ~]# cd /tmp/data2
[root@foundation50 data2]# ls
[root@foundation50 data2]# pwd
/tmp/data2
[root@foundation50 data2]# touch file
[root@foundation50 data2]#

容器 安装 kali 容器装载_bash_26

备份数据卷 –volumes-from

[root@foundation50 ~]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/yum.repo:/etc/yum.repos.d/yum.repo:ro rhel7 bash
8d88be8de230ce60cdf58e91092eab0dcfb34cf71540d548a55590388dea6a60
[root@foundation50 ~]# docker run -it --name vm1 --volumes-from datavol rhel7 bash

容器 安装 kali 容器装载_bash_27

对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置–rm选项,这样在容器退出时就能够自动清理容器内部的文件系统,如下图在ubuntu环境下打包一个文件

[root@foundation50 ~]# docker run --rm -v /tmp/backup:/backup ubuntu   tar cf /backup/etc.tar /etc

容器 安装 kali 容器装载_docker_28

[root@foundation50 docker]# cd /tmp/backup/
[root@foundation50 backup]# ls
etc.tar
[root@foundation50 backup]# docker inspect vm1 |grep Pid
            "Pid": 17485,
            "PidMode": "",
            "PidsLimit": 0,
[root@foundation50 17485]# cd ns/
[root@foundation50 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation50 ns]# ll

容器 安装 kali 容器装载_nginx_29

[root@foundation50 docker]# brctl show

容器 安装 kali 容器装载_容器 安装 kali_30

三、网络管理

Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址。
四种网络模型

容器 安装 kali 容器装载_容器 安装 kali_31

1、bridge模式,不需要-net指定,为默认设置

改模式docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

这里写代码片

2、host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的

3、container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

4、none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置

容器 安装 kali 容器装载_bash_32

Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0

在/var/run/下建立netns目录,并查看容器pid,建立链接

[root@foundation50 run]# cd netns/
[root@foundation50 netns]# pwd
/var/run/netns
[root@foundation50 netns]# ls
[root@foundation50 netns]# ln -s /proc/17485/ns/net /var/run/netns/17485
[root@foundation50 netns]# ip netns list
17485
[root@foundation50 netns]#  ip link add name veth0 type veth peer name veth1    ##容器间的互连
--link 参数可以在不映射端口的前提下为两个容器间建立安全连接, --link 参数可以连接一个或多个容器到将要创建的容器。
--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名
[root@foundation50 netns]# ip addr

容器 安装 kali 容器装载_docker_33

查看网桥,没有需要我们自建建立,在真机端和容器端建立连接

[root@foundation50 netns]# brctl show
[root@foundation50 netns]# brctl addif docker0 veth0

容器 安装 kali 容器装载_bash_34

[root@foundation50 netns]# ip link set up veth0
[root@foundation50 netns]# ip link set up veth1

容器 安装 kali 容器装载_docker_35

容器 安装 kali 容器装载_bash_36

容器 安装 kali 容器装载_bash_37

Pid 会变,所以我们得注意千万不能随意退掉进程,不然会释放掉,就不会起作用。

我们得重新编写软连接在作加网关等一系列的操作。

Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

[root@foundation50 netns]# ip link set veth1 netns PID
[root@foundation50 netns]# ip netns exec PID ip link set veth1 name eth0
[root@foundation50 netns]# ip netns exec PID ip link set up dev eth0
[root@foundation50 netns]# ip netns exec PID ip addr 172.17.0.100/24 dev eth0
[root@foundation50 netns]# ip netns exec PID ip route add default via 172.27.0.1

容器 安装 kali 容器装载_docker_35