一.什么是Docker

Docker容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器 上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

二 .Docker的用途

1)快速交付你的应用程序
Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应用程序和服务的容器进行开发,之后可以集成到连续的一体化和部署工作流中。
举个例子,开发者们在本地编写代码并且使用Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进行一切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进行部署。

2)开发和拓展更加简单
Docker的以容器为基础的平台允许高度可移植的工作。Docker容器可以在开发者机器上运行,也可以在实体或者虚拟机上运行,也可以在云平台上运行。
Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以用Docker快速地增加应用规模或者关闭应用程序和服务。Docker的快速意味着变动几乎实时是的。

3)达到高密度和更多负载
Docker轻巧快速,它提供了一个可行的、符合成本效益的替代基于虚拟机管理程序的虚拟机。这在高密度的环境下尤其有用。例如,构建你自己的云平台或者PaaS,在中小的部署环境下同样可以获取到更多的资源性能。

三.Docker的部署与安装在7.3的主机做,依赖性较小
1.安装docker和相关依赖性:

yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm  
            docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm

   systemctl  status   docker    ##查看docker的状态
   systemctl  start  docker
   docker  version    ##查看docker的版本
   docker  info    ##docker宿主机的信息
   ###在安装好docker之后,linux系统会为docker容器分配一个ip,利用ip addr中查看docker0ip   

docker 功能点 docker可以实现什么功能_docker 功能点


    docker  images    ###查看容器里面的镜像

###现有的镜像的导入和容器的使用

 1040  docker  load  -i   game2048.tar

 1041  docker  load  -i  ubuntu.tar

 1042  docker  load  -i   rhel7.tar    ##仓库中加载镜像

docker 功能点 docker可以实现什么功能_docker 功能点_02


 1043  docker  images   ##查看导入的镜像

 1044  docker  run     -d  --name  vm1  game2048  ##-d   打入后台,--name  起名字

docker 功能点 docker可以实现什么功能_nginx_03


 1045  docker  ps     ##显示正在运行的进程

 1046  docker  ps  -a  ##显示所有存在的进程

 1047  docker  inspect   vm1   ##查看主机vm1的ip

 1049  brctl   show   ###可以看见他为容器增加了一个桥接

###取浏览器里面访问:http://172.17.0.2  可以看见游戏,一定要访问游戏的ip,ip可由docker inspect   vm1  得知

 1053  docker  history   game2048:latest    #可以知道做过了那些

 1054  docker  images    ##docker内部的镜像有哪些

 1055  docker  run  -it  --name  vm2  ubuntu  ##-it为交互式登陆,本身他支持交互式登陆,所以她就不用再命令后面加bash了,如果不支持,则需要加bash,进行交互式登陆

docker 功能点 docker可以实现什么功能_docker 功能点_04


       docker  history  ubuntu:latest   ##查看他做过的历史

 1059  docker  history   rhel7:latest   ###因为我们什么都没有做,所以比显示

 1060  docker ps   ##此时应该有两个进程在跑,

docker 功能点 docker可以实现什么功能_docker_05


 1071  docker  run  -it  --name vm2  ubuntu

         ip   addr   ##我们发现系统分配的ip是逐渐递增的

         touch  file{1..9}

##然后我们正常退出后,ctrl+pq  

docker  attach   vm2

ls  ##发现我们建立的文件还在

##然后我们异常退出后,ctrl+d

docker  start  vm2

docker attach  vm2

ls  ##发现我们建立的文件还在

docker 功能点 docker可以实现什么功能_nginx_06


 1072  docker  history   ubuntu:latest

 1073  docker  ps

 1074  docker  attach   vm2

       touch  file{1..10}  

 1075  docker  commit   vm2  ubuntu:v1  #将vm2封装成一个镜像,然后进行提交

docker 功能点 docker可以实现什么功能_nginx_07

docker   history    ubuntu:v1

docker 功能点 docker可以实现什么功能_nginx_08

docker 功能点 docker可以实现什么功能_nginx_09


 1077  docker  images   ##可以看见提交的镜像

 1079  docker  rmi  ubuntu:v1 ##可以看见他是分层提交的,我们刚才建立的文件在读写层的最上面,当底下层一模一样的时候,docker不会再次建立,而会重复利用,当我们删除时,发现底层有人用,那我们就值删除只属于他自己的东西,共有的东西不动

 1081  docker  images  ##发现我们建立的镜像不见了,原来的镜像还在

 1089  docker  ps   ##看vm2有没有在开

 1090  docker  cp   /etc/passwd  vm2:/tmp  ##cp文件到容器里面

 1091  docker  attach  vm2

       cd   /tmp

       ls    ##显示有没有passwd这个文件

docker 功能点 docker可以实现什么功能_nginx_10


 1096  docker  exec   vm2  rm  /tmp/passwd  ##不用进容器里面,直接在外面就可以看有没有passwd这个文件

 1097  docker  exec  vm2  ls  /tmp/passwd  ###因为已经删除了。在外面直接看,就没有了

docker 功能点 docker可以实现什么功能_docker 功能点_11


 1098  docker  attach   vm2

       cd   /tmp

       ls  ##显示文件有没有

docker 功能点 docker可以实现什么功能_docker_12


 1103  docker  logs vm2   ##查看vm2做过的步骤

docker 功能点 docker可以实现什么功能_docker_13


 1110  docker  run  -d  --name  vm1  -p 8080:80  game2048   ##端口影射

 1111  iptables -t nat  -nL   ##可以看见他内部端口的影射

docker 功能点 docker可以实现什么功能_docker_14


 1115  docker  port    vm1    ##也可以看见端口影射

 1117  docker  top   vm1  ###可以看见动态信息

进入浏览器:http://172,25,17.250:8080  #端口映射,通过访问物理机的8080端口就可以访问172.17.0.2的游戏界面

###注册阿里云

产品服务,镜像容器服务,镜像加速器,CentOs  ,复制配置文件

 1119  vim  /etc/docker/daemon.json

         ##粘贴复制的内容

docker 功能点 docker可以实现什么功能_docker_15


 1120  systemctl   daemon-reload    #重新加载

 1121  systemctl  restart docker

 1122  systemctl    status  docker

 1123  docker  search   nginx  ##从阿里云搜索nginx镜像

docker 功能点 docker可以实现什么功能_nginx_16


 1124  docker  pull  nginx    ##从阿里云拉取镜像下来

docker 功能点 docker可以实现什么功能_ubuntu_17


 1127  docker  ps -a

docker  container   prune   ##移除所有停止的镜像,等加与docker  rm `docker  ps -aq`

docker 功能点 docker可以实现什么功能_docker_18


 1129  docker  ps  -a ##都没有了

 1130  docker  run  -d  --name  vm1 -p 8080:80  nginx

        ##取浏览器http://172.25.17.250:8080  ##发现登陆到了nginx界面

 1131  docker  history   nginx:latest

 1133  mkdir   /tmp/docker/

 1134  vim /tmp/docker/index.html

      写入wb

 1135  docker  cp  /tmp/docker/index.html   vm1:/usr/share/nginx/html ##将写的文件放到容器nginx的目录下

       ##取浏览器http://172.25.17.250:8080  ##发现登陆到了nginx界面,为wb

docker 功能点 docker可以实现什么功能_docker_19

docker 功能点 docker可以实现什么功能_ubuntu_20


 1141  mkdir   /tmp/docker/website

       mv /tmp/docker/index.html  /tmp/docker/website

 1142  docker  run   -d   --name  vm1  -p  8080:80  -v  /tmp/docker/website/:/usr/share/nginx/html   nginx   ##-v  挂在

##取浏览器http://172.25.17.250:8080  ##发现登陆到了nginx界面wb

 1143  docker  ps  ###发现端口链接

        docker  port  vm1  ##端口列出

 1161  docker  run   -it  --name  vm2  ubuntu  ##是以桥接的方式链接的

       ping   baidu.com  ##可以ping同

       ping   172.25.17.250  #也可以ping通

iptables  -t  nat -nL  ##可以看见ip出口,记得在此过程中,不要重启网络,重启网络之后,可能ping不同外网cd  /tmp/docker

vim   dvd.repo

[dvd]

name=rhel7.3

baseurl=http://172.25.17.250/rhel7.3

gpgcheck=0

docker  run  -it  --name  vm2   -v /tmp/docker/dvd.repo:/etc/yum.repos.d/dvd.repo:ro -v  /tmp/docker/data1:/data1 -v /tmp/docker/data2:/data2 rhel7    bash

docker 功能点 docker可以实现什么功能_docker 功能点_21


df   #看的不够清晰

cd  /data1  ##即使没有data2,也可以进去目录看

mount   ##可以看的更加清析

uname  -r   #查看内核

cd   /data1

touch  file1

cd  ..

cd  /data2

touch   file2

docker 功能点 docker可以实现什么功能_ubuntu_22


##另外开一个终端,

cd   /tmp/docker

ls   ##有data1和data2这个目录,进去data1和data2里面看,有文件,挂在表示容器和物理机同步,当在物理机删除文件时,容器里面的文件也会不再

##在容器里面做

cd   /etc/yum.repos.d/

rm   -fr    dvd.repo  ##发现删除不掉,因为我问让他只读挂载

docker 功能点 docker可以实现什么功能_docker_23


yum  install    -y  httpd   net-tools  ##但是我们可以下载东西

netstst  -antlupe  

cd   /var/www/html/

echo   wb > index.html

sbin/httpd   ##开启这个服务

###我们在外面做

docker    inspect   vm2

ping  vm2的ip   ##物理机能ping通容器

curl   vm2的ip   ##我们看到的时httpd的首页内容

docker 功能点 docker可以实现什么功能_docker 功能点_24


docker   rm  -f  vm2

docker  create  --name  datavol  -v  /tmp/docker/dvd.repo:/etc/yum.repos.d/dvd.repo:ro  -v  /tmp/docker/data1:/data1:ro  -v   /tmp/docker/data2:/data2  rhel7  bash  ##创建逻辑卷组

docker  ps  -a  ##可以显示我们刚才创建的

docker  run  -it  --volumes-from  datavol   rhel7  bash

cd  data1

rm  -fr  file1    ##我门发现删除不了,因为我们让他只读挂在

docker 功能点 docker可以实现什么功能_docker_25

docker 功能点 docker可以实现什么功能_docker_26

ip  addr   ##我们看见物理机给容器分了一个ip
brctl  show   ##我们此时看见docker0并没有桥接
docker  run   -d  nginx
brctl  show   ##我们看见桥接了一个

docker 功能点 docker可以实现什么功能_ubuntu_27


docker  run  -it  --name  vm1  ubuntu

ping  172.17.0.2    ##可以ping通nginx的id

ip   addr   ###可以看见物理机给他分配的id号是递增的

brctl  show  ##物理机中做,发现桥接多了一个

docker  network   ls   ##列出docker网络的工作方式,有bridge,host,null,container这四种形式,下面分别介绍,默认采用桥接的方式

docker 功能点 docker可以实现什么功能_docker 功能点_28


docker   attach   vm1   ##链接vm1

ip  addr   ##可以看见他的ip

docker   inspect   vm1  |  grep  Pid   ##过略出Pid

cd    /proc/Pid号/ns

ll    我们发现他是以net模式进行链接的

docker 功能点 docker可以实现什么功能_nginx_29


docker   run   -it  --name  vm2 --net  host ubuntu ##以host的方式进行连接,host相当于和物理机共有一个ip

ip   addr   ##发现他和物理机列出的ip一模一样

brctl  show   ##我们发现一共开启了三个容器,但是只有两个桥接

docker  run   -it  --name  vm3  --net  container:vm1  ubuntu  ##自定义的方式设置ip  我们设置的和vm1设置的一样

docker 功能点 docker可以实现什么功能_docker 功能点_30


ip   addr   ##和vm1的ip应该是一样的

docker   run   -it  --name  vm4  --net  none  ubuntu   ##采用无模式

docker 功能点 docker可以实现什么功能_docker 功能点_31


ip  addr  ####此时应该没有ip

###退出来在物理机中做

ip  netns  add  test   ##我门增加了网络的工作方式

ip  netns  list

cd   /var/run/netns

ls   ##有我们刚才设置的方式

ip   netns  del  test   ##删除

ls   #发现没有了

docker  inspect vm4 | grep Pid

cd   /proc/Pid号/ns

ln    -s   /proc/Pid号/ns/net  /var/run/netns/Pid号  ##将ip号连接

ip    netns  list   ##列出网络号

docker 功能点 docker可以实现什么功能_ubuntu_32


ip   link   add  name  veth0  type   veth  peer  name  veth1##我们增加一个网络对,物理机桥接veth0,容器桥接veth1,这样可以使两方进行联系

docker 功能点 docker可以实现什么功能_docker 功能点_33


ip  addr  ##可以看加有么有增加上,但是他是down,我们让他up

docker 功能点 docker可以实现什么功能_ubuntu_34


ip  link    set   up   veth1

ip  link    set  up  veth0

docker 功能点 docker可以实现什么功能_ubuntu_35


ip  addr

brctl   addif   docker0   veth0

brctl  show   ##我们可以看见veth0在桥接上

docker 功能点 docker可以实现什么功能_ubuntu_36


ip  netns  list  ##出现一个ip号

ip   link   set  veth1  netns    ip号

docker  attach  vm4

ip addr   ##我们发现增加了一个网卡veth1,但是他是down的

docker 功能点 docker可以实现什么功能_docker 功能点_37


ip   addr  add  172.17.0.100/24 dev  veth1  ##我们发现增加ip被拒绝了

ip  netns  exec  ip号   ip  link  set  veth1 name  eth0  ##我们给网卡改了名字

ip  netns  exec   ip号  ip  link   set  up  eth0  ##首先将网卡up

ip  netns  exec  ip号  ip  addr  add  172.17.0.100/24 dev   eth0  ##增加ip

docker 功能点 docker可以实现什么功能_docker 功能点_38


docker  attach  vm4

ip  addr   ##我们发现多了ip

ping  172.17.0.1  

ping   172.25.17.250  ##ping外网发现ping不同,因为我门没有加网关

route  -n   

ip   netns  exec  ip号  ip  route add  default  via  172.17.0.1

ping    172.25.17.250  ##可以ping通

ping    www.baidu.com   ##也能ping通

docker 功能点 docker可以实现什么功能_docker_39


####删除ip不被允许

docker   rm -f  vm4

docker   rm -f  vm3

docker  attach   vm2

ip  addr del   172.27.0.3/16  dev   eth0  #被拒绝

docker 功能点 docker可以实现什么功能_nginx_40


docker   inspect    -f   {{.HostConfig.Privileged}}  vm2  ##我们发现是false,不允许我们修改ip

docker 功能点 docker可以实现什么功能_ubuntu_41


docker  rm -f   vm2  #删除vm2,重现建立可以修改ip的vm2

docker run  -it  --name  vm2  --privileged=true  ubuntu  

ip   addr

ip  addr  del   172.17.0.4/16  dev  eth0   #可以删除

docker 功能点 docker可以实现什么功能_ubuntu_42


docker  run  -d   --name vm3    nginx

docker   run   -it   --name  vm4  --link  vm3:nginx  ubuntu  ##将vm3和vm4连接起来,将两个仓库连接起来

ping  vm3/nginx

ping  172.17.0.3   ##都可以ping通

ping  vm2    #ping不同,因为没有将他们连接在一起,但是ping  ip能ping通

cat   /etc/hosts   ##系统自动将他们连接在一起

###cgroup用来限制资源配额
mount  -t  cgroup

docker 功能点 docker可以实现什么功能_nginx_43


cd   /sys/fs/cgroup

cd  cpu

cat    cpu.rt_period_us    ##表示让cpu跑满

cat   cpu.cfs_quota_us    ##-1表示不限制

docker 功能点 docker可以实现什么功能_nginx_44


top   ##查看cpu的动态信息

dd   if=/dev/zero  of=/dev/null  &

top   ##发现cpu跑满了

docker 功能点 docker可以实现什么功能_docker 功能点_45


killall  dd    ##cpu又恢复正常了

cgcreate  -g  cpu:x1  ##相当于在在/sys/fs/cgroup/cpu下面建立一个x1,cgdelete  -g  cpu:x1   相当于在/sys/fs/cgroup/cpu删除目录

cd  x1

docker 功能点 docker可以实现什么功能_docker 功能点_46


ls    ##里面的内容和上层的内容没有什么区别

echo   10000 > cpu.cfs_quota_us ##我们也可以利用命令进行设置  cgset  -r   cpu.cfs_quota_us=10000   x1

cgget  -g  cpu:x1    ##我们让他跑了10%

docker 功能点 docker可以实现什么功能_docker 功能点_47


dd  if=/dev/zero  of=/dev/null  &

top   #查看dd的ip号

echo   dd的ip号  >  tasks

top   ##我们发现他基本cpu就在10%左右跑,说明设置成功

docker 功能点 docker可以实现什么功能_ubuntu_48


cgdelete  -g  cpu:x1   ##删除我们设置的

top   ##发现他又是满格跑

killall  add   

docker 功能点 docker可以实现什么功能_ubuntu_49

###对于容器的限定
docker  rm -f  `docker  ps  -aq`
docker  run  -d  --name  vm1  nginx
cd  /sys/fs/cgroup/cpu/docker
ls   ##发现一个很长的pid号码
cd  很长的pid号码
cat    cpu.cfs_quota_us
cat    cpu.cfs_period_us

docker 功能点 docker可以实现什么功能_nginx_50


docker  inspect  vm1  ##得到他的ip

##在浏览器里面访问  http://172.17.0.2/  可以访问到nginx页面

ab   -c 100  -n  100000  http://172.17.0.2/index.html

top   ##看到压侧跑满格

docker  run  -d  --name  vm2  --cpu-quota  10000  nginx

docker 功能点 docker可以实现什么功能_nginx_51


cd   /sys/fs/cgroup/cpu/docker/

cd   ##刚才有限制的ip号

cat   cpu.cfs_quota_us   ##观看我们所设置的

docker  inspect  vm2

ab  -c  100  -n  100000 http://172.17.0.3/index.html  ##对有设置的进行压侧

top   ##可以看见他限制在10%左右

docker 功能点 docker可以实现什么功能_nginx_52

 

####对于企业六怎么进行设置呢
开启一个企业六的虚拟机
yum  install   libcgroup  -y  
cat    /etc/cgrules.conf
/etc/init.d/cgconfig  start
cd    /cgroup/memory/
cat   memory.limit_in.bytes
cgcreate  -g   memory:x1

docker 功能点 docker可以实现什么功能_nginx_53


cd   x1 ##此时如果我们reboot的话,刚才建立的东西就没有了,reboot之后,记得一定要重启服务,否则进入/cgroup/memory里面啥都不显示/etc/init.d/cgconfig  start ,要想重启之后还能有自己建立的文件,必须在配置文件里面加

vim   /etc/cgconfig.conf

##在最后加入

group x1 {

       memory {

            memory.limit_in_bytes  = 209715200;

    }

}

docker 功能点 docker可以实现什么功能_nginx_54


/etc/init.d/cgconfig  restart ##记得一定要退出/cgroup/memory这个目录重启,否则会报错

cd  /cgroup/memory/

ls   x1   #有x1显示

cd  x1

cat   memory.limit_in_bytes   ##应该是自己在文件中设置的

docker 功能点 docker可以实现什么功能_docker 功能点_55


df   ##查看挂在

cd   /dev/shm

free  -m     ##可以看到空闲的,和缓存的内存

cgexec -g  memory:x1 dd  if=/dev/zero  of=bigfile   bs=1M  count=100

ls   ##有bigfile这个文件

free  -m    #发现占据了100M

docker 功能点 docker可以实现什么功能_nginx_56


cgexec -g memory:x1 dd  if=/dev/zero  of=bigfile   bs=1M  count=200

free   -m  ##发现占据了200M

cgexec -g memory:x1 dd  if=/dev/zero  of=bigfile   bs=1M  count=300

free  -m  ##我们发现还能加,但是我们给他进行了设置,为什么还能加呢,是因为他给交换区加了,所以我门应该同时控制内存和交换区

docker 功能点 docker可以实现什么功能_docker_57


cd    /cgroup/memory/

cat    memory.memsw.limit_in_bytes

vim    /etc/cgconfig.conf

group x1 {

       memory {

            memory.limit_in_bytes  = 209715200;

            memory.memsw.limit_in_bytes = 209715200;

    }

}

docker 功能点 docker可以实现什么功能_docker_58


/etc/init.d/cgconfig  restart

cd   /dev/shm   ##必须在这个目录下进行设置,因为他才占据内存的一半

cgexec -g memory:x1 dd  if=/dev/zero  of=bigfile   bs=1M  count=300  ##发现建立不了了

free  -m

docker 功能点 docker可以实现什么功能_docker 功能点_59



useradd    wb

su - wubain

###得到两个网业  memapp1  memapp2

chmod  +x   memapp1  memapp2   ##在root用户下做,然后把他移动到普通用户下

yum  provides   -y   */ld-linux.so.2

su  - wb

./memapp1  

./memapp2

free  -m

cd   /dev/shm   ##在root用户下做

rm  -fr  bigfile

vim /etc/cgconfig.conf

##将数据改为20480000;

/etc/init.d/cgconfig  restrat

su  - wb

./memapp1

./memapp2   ##发现他还能做

vim   /etc/cgrules.conf

##在末尾加

wb:memapp1  memory  x1/  ###在root用户下做

wb:memapp2  memory  x1/

docker 功能点 docker可以实现什么功能_docker 功能点_60


/etc/init.d/cgred   start

su  - wb

./memapp1

./memapp2   #发现他被限制了

docker 功能点 docker可以实现什么功能_docker 功能点_61

####自己搭建镜像
systemctl  start  docker
systemctl status  docker
docker  images   ##查看自己仓库里面的镜像
docker  ps  -a   #查看自己建立的仓库有哪些
docker  container  prune  ##移除所有停掉的容器,注意是停掉的
cd   /tmp/docker
ls
rm  -fr  data1/  data2/
vim     Dockerfile
FROM  rhel7      ##自己搭建镜像的基础是rhel7
ENV HOSTNAME server1    ##给服务器起名字
EXPOSE 80               ##暴露的端口为80
COPY  dvd.repo /etc/yum.repos.d/dvd.repo   
RUN   rpmdb  --rebuilddb && yum install -y httpd && yum  clean all
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

docker 功能点 docker可以实现什么功能_nginx_62


docker  build  -t   rhel7:v1  .

docker  images   ##我们发现自己封装的镜像在里面

docker 功能点 docker可以实现什么功能_docker_63


docker  run  -d  --name  vm1  rhel7:v1

docker  inspect  vm1  ##查看vm1的详细信息

curl   172.17.0.2   ##因为vm1下载了httpd,所以我门可以看见httpd的首页

docker 功能点 docker可以实现什么功能_ubuntu_64


docker  rm  -f  vm1  

###源码编译nginx

首先把nginx的源码包考到/tmp/docker下面

vim   Dockerfile

                                                                                                                                                                                                    FROM  rhel7

EXPOSE 80

COPY  dvd.repo /etc/yum.repos.d/dvd.repo

ADD  nginx-1.14.0.tar.gz  /mnt

RUN rpmdb --rebuilddb

RUN  yum install -y gcc  pcre-devel  zlib-devel  make

RUN  yum clean  all

WORKDIR /mnt/nginx-1.14.0

RUN ./configure --prefix=/usr/local/nginx  --with-threads --with-file-aio --with-http_stub_status_module

RUN make

RUN make  install

CMD  ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

docker 功能点 docker可以实现什么功能_docker_65


docker  build  -t  rhel7:v2  .  ##搭建一个rhel7的v2镜像

docker   run  -d   --name  vm1   rhel7:v2

docker   run  -d   --name  vm1   rhel7:v2   /usr/local/nginx/sbin/nginx  -g "daemon  off;"  ##这条命令将会覆盖文件写的CMD命令

docker  inspect  vm2

curl   172.17.0.3  ##可以看见nginx的首页

                                                                                      
###可以对他进行瘦身,比如说,缩小层,从别的地方考包,减小base,抽取的动态数据库就可以了    
缩小层   
 vim  Dockerfile
                                                                                                                                                 
FROM  rhel7
EXPOSE 80
COPY  dvd.repo /etc/yum.repos.d/dvd.repo
ADD  nginx-1.14.0.tar.gz  /mnt
WORKDIR /mnt/nginx-1.14.0
RUN rpmdb --rebuilddb && yum install -y gcc  pcre-devel  zlib-devel  make && yum clean all && sed 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g'  auto/cc/gcc && ./configure --prefix=/usr/local/nginx  --with-threads --with-file-aio --with-http_stub_status_module && make && make  install  && cd .. && rm -fr  nginx-1.14.0
CMD  ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

docker 功能点 docker可以实现什么功能_docker_66


docker  build   -t    rhel7:v3  .

docker  history  rhel7:v3

docker  images  rhel7    ##查看大小

docker   run  -d   --name  vm1   rhel7:v3

docker   run  -d   --name  vm1   rhel7:v3   /usr/local/nginx/sbin/nginx  -g "daemon  off;"  ##这条命令将会覆盖文件写的CMD命令

docker  inspect  vm3

curl   172.17.0.3  ##可以看见nginx的页

                                                                                             

##进一步的瘦身 ,抽取安装包

vim  Dockerfile

FROM  rhel7  as build

COPY  dvd.repo /etc/yum.repos.d/dvd.repo

ADD  nginx-1.14.0.tar.gz  /mnt

WORKDIR /mnt/nginx-1.14.0

RUN rpmdb --rebuilddb && yum install -y gcc  pcre-devel  zlib-devel  make && yum clean all && sed 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g'  auto/cc/gcc && ./configure --prefix=/usr/local/nginx  --with-threads --with-file-aio --with-http_stub_status_module && make && make  install  && cd .. && rm -fr  nginx-1.14.0

FROM  rhel7
EXPOSE 80
COPY --from=build /usr/local/nginx  /usr/local/nginx
CMD  ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

docker 功能点 docker可以实现什么功能_ubuntu_67


docker  build   -t   rhel7:v4 .

docker  history  rhel7:v4

docker images rhel7

docker 功能点 docker可以实现什么功能_nginx_68


docker  run   -it  --name  vm2  rhel7:v4  bash

cd    /usr/local/nginx/sbin/

docker  rm -f    vm2

docker   run  -d  --name   vm2   rhel7:v4  ##必须把他打入后台才能看见nginx的页面

docker  ps

docker   inspect  vm2

curl  172.17.0.3   ##可以看见nginx的页面就行

docker  run  -it --name  vm3  rhel7:v4  bash

ldd   /usr/local/nginx/sbin/nginx   ##显示的都是抽取的安装包

docker 功能点 docker可以实现什么功能_ubuntu_69

##抽取base
###得到一个distroless.tar  的包
docker  load  -i  distroless.tar  ##把他放在仓库里面
docker  images  ##这相当于一个base
cd   /tmp/docker
mkdir  test
cd  test
vim   Dockerfile
                                                                               
FROM nginx as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai

RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base

COPY --from=base /opt /

EXPOSE 80

ENTRYPOINT ["nginx", "-g", "daemon off;"]

docker 功能点 docker可以实现什么功能_ubuntu_70


docker  build  -t  nginx:v1  .

docker   images  nginx

docker 功能点 docker可以实现什么功能_nginx_71


docker  run  -d  --name  vm4 nginx:v1

docker  ps   ##每定制一个镜像,都要测试一下他能不能跑,否则不知道自己定制的好坏

docker 功能点 docker可以实现什么功能_nginx_72


docker  inspect    vm4

curl   172.17.0.2   ##能看见首页

###得到一个仓库的镜像,registry
docker  load  -i  registry.tar   ##将仓库镜像加入到仓库里面

docker 功能点 docker可以实现什么功能_docker 功能点_73


docker  images

docker   run   -d  --name  registry  -p 5000:5000  -v /tmp/docker/registry:/var/lib/registry  registry:2.3.1

docker  ps

docker 功能点 docker可以实现什么功能_ubuntu_74


docker   tag  nginx:v1 localhost:5000/nginx:v1

docker images  ##发现镜像多了一个

docker 功能点 docker可以实现什么功能_docker_75


docker  push   localhost:5000/nginx:v1  ##我们采用本地推送,不走ip/http协议,

docker 功能点 docker可以实现什么功能_docker_76


cd   /tmp/docker/registry/

ls   ##有docker显示

cd   docker

ls   ##显示registry

tree  .  ##可以看见他的结构图

docker 功能点 docker可以实现什么功能_docker_77


###现在我们采用走http协议,不走https协议

docker  tag  rhel7   172.25.17.250:5000/rhel7

docker  images

docker 功能点 docker可以实现什么功能_docker 功能点_78


docker  push   172.25.17.250:5000/rhel7 ##我们发现push不上去,所以我们要采用http模式进行push

cd   /etc/docker

vim  daemon.json

{

  "registry-mirrors": ["https://0qvjftbh.mirror.aliyuncs.com"],

  "insecure-registries" : ["172.25.17.250:5000"]

}

docker 功能点 docker可以实现什么功能_nginx_79


systemctl   restart  docker  ##重启docker之后,所有的docker仓库都会掉线,所以我们要开启他们

docker  ps

docker   start  registry

docker  push  172.25.17.250:5000/rhel7

docker   inspect  registry  

###用https加密的方式传送

cd    /tmp/docker

mkdir  certs

openssl req \

  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \

  -x509 -days 365 -out certs/domain.crt    (((cn,shaanxi,xi'an,westos,linux,westos.org,root@localhost)))

docker 功能点 docker可以实现什么功能_nginx_80


##记得一定要做解析

ls    certs/   ##有两把钥匙

vim  /etc/hosts

172.25.17.250    westos.org

ping  westos.org   ##可以ping通

docker  ps

docker  rm  -f registry  ##删除仓库

docker   run   -d  --name  registry  -v `pwd`/certs:/certs -v  /tmp/docker/registry:/var/lib/registry -e  REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e  REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1

docker 功能点 docker可以实现什么功能_ubuntu_81


netstat  -antlupe |  grep :443

docker  tag  ubuntu:latest  westos.org/ubuntu

iptables  -t  nat  -nL

cd    /etc/docker

mkdir   certs.d

cd  certs.d

mkdir   westos.org

cd  westos.org

cp  /tmp/docker/certs/domain.crt    ca.crt

docker  push westos.org/ubuntu #推送成功

docker 功能点 docker可以实现什么功能_nginx_82

docker 功能点 docker可以实现什么功能_docker 功能点_83


###验证登陆

cd   /tmp/docker

mkdir  auth

docker  run --rm  --entrypoint htpasswd  registry:2.3.1  -Bbn admin westos > auth/htpasswd  ##用户名为admin ,密码为westos

cat  auth/htpasswd   

docker 功能点 docker可以实现什么功能_docker_84


docker  run --rm  --entrypoint htpasswd  registry:2.3.1  -Bbn wb westos >> auth/htpasswd  ##用户名为admin ,密码为westos

cat  auth/htpasswd

docker 功能点 docker可以实现什么功能_docker_85


docker  ps -a

docker  rm -f  registry

docker   run   -d  --name  registry  -v `pwd`/certs:/certs -v  /tmp/docker/registry:/var/lib/registry -e  REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e  REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v `pwd`/auth:/auth -e  REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e  REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  -p 443:443 registry:2.3.1

docker  ps

docker 功能点 docker可以实现什么功能_nginx_86


docker  tag  game2048:latest  westos.org/game2048

docker 功能点 docker可以实现什么功能_ubuntu_87


docker  login   westos.org  ##登陆

docker 功能点 docker可以实现什么功能_docker_88


docker push westos.org/game2048

docker 功能点 docker可以实现什么功能_ubuntu_89


cd

cd .docker

ls

cat  config.json   ##其实密码和用户名都在这里面

docker 功能点 docker可以实现什么功能_docker 功能点_90


#####docker的集群

docker  load   -i haproxy.tar

docker  images  haproxy

得到一个docker-compose-linux-x86_64-1.22.0

cp    docker-compose-linux-x86_64-1.22.0   /usr/local/bin/docker-compose

chmod  +x   /usr/local/bin/docker-compose

docker 功能点 docker可以实现什么功能_nginx_91


which   docker-compose

cd   /tmp/docker

ls

mkdir   compose

cd  compose

vim  docker-compose.yml

web1:

    image: nginx

    expose:

        - 80

web2:

    image: nginx

    expose:

        - 80

haproxy:

    image: haproxy

    volumes:

        - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg

    links:

        - web1

        - web2

    ports:

        - "80:80"

    expose:

        - 80

docker 功能点 docker可以实现什么功能_ubuntu_92


mkdir   haproxy

cd  haproxy

vim  haproxy.cfg        

global

   log 127.0.0.1 local0

   log 127.0.0.1 local1 notice

defaults

   log global

   mode http

   option httplog

   option dontlognull

   timeout connect 5000ms

   timeout client 50000ms

   timeout server 50000ms

   stats uri /status

frontend balancer

   bind 0.0.0.0:80

   default_backend web_backends

backend web_backends

   balance roundrobin

   server a web1:80 check

   server b web2:80 check

cd  ..

pwd   ##此时的路径在/tmp/docker/compose

docker-compose  up

docker 功能点 docker可以实现什么功能_docker 功能点_93


###另外开一个终端

首先在浏览器访问  http://172.25.17.250

  http://172.25.17.250/status    docker  ps   ##可以看见集群的所有组成

docker 功能点 docker可以实现什么功能_docker_94


 cd  /tmp/docker/website

 vim   index.html  ##g改内容wb1

docker cp  index.html  compose_web1_1:/usr/share/nginx/html

 vim   index.html  ##g改内容wb2

 docker cp  index.html  compose_web2_1:/usr/share/nginx/html

 首先在浏览器访问http://172.25.17.250   发现轮询了

docker 功能点 docker可以实现什么功能_nginx_95


                          

###集群停止命令 docker-compose  stop  #集群的开始和停止都要在/tmp/docker/compose路径下,否则会报错