docker的简单应用

一.什么是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  images    ###查看容器里面的镜像
###现有的镜像的导入和容器的使用
 1040  docker  load  -i   game2048.tar
 1041  docker  load  -i  ubuntu.tar
 1042  docker  load  -i   rhel7.tar    ##仓库中加载镜像


 1043  docker  images   ##查看导入的镜像
 1044  docker  run     -d  --name  vm1  game2048  ##-d   打入后台,--name  起名字


 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  history  ubuntu:latest   ##查看他做过的历史
 1059  docker  history   rhel7:latest   ###因为我们什么都没有做,所以比显示
 1060  docker ps   ##此时应该有两个进程在跑,


 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  ##发现我们建立的文件还在


 1072  docker  history   ubuntu:latest
 1073  docker  ps
 1074  docker  attach   vm2
       touch  file{1..10}  
 1075  docker  commit   vm2  ubuntu:v1  #将vm2封装成一个镜像,然后进行提交

docker   history    ubuntu:v1


 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这个文件


 1096  docker  exec   vm2  rm  /tmp/passwd  ##不用进容器里面,直接在外面就可以看有没有passwd这个文件
 1097  docker  exec  vm2  ls  /tmp/passwd  ###因为已经删除了。在外面直接看,就没有了


 1098  docker  attach   vm2
       cd   /tmp
       ls  ##显示文件有没有


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


 1110  docker  run  -d  --name  vm1  -p 8080:80  game2048   ##端口影射
 1111  iptables -t nat  -nL   ##可以看见他内部端口的影射


 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
         ##粘贴复制的内容


 1120  systemctl   daemon-reload    #重新加载
 1121  systemctl  restart docker
 1122  systemctl    status  docker
 1123  docker  search   nginx  ##从阿里云搜索nginx镜像


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


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


 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


 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


df   #看的不够清晰
cd  /data1  ##即使没有data2,也可以进去目录看
mount   ##可以看的更加清析
uname  -r   #查看内核
cd   /data1
touch  file1
cd  ..
cd  /data2
touch   file2


##另外开一个终端,
cd   /tmp/docker
ls   ##有data1和data2这个目录,进去data1和data2里面看,有文件,挂在表示容器和物理机同步,当在物理机删除文件时,容器里面的文件也会不再
##在容器里面做
cd   /etc/yum.repos.d/
rm   -fr    dvd.repo  ##发现删除不掉,因为我问让他只读挂载


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   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    ##我门发现删除不了,因为我们让他只读挂在


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


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   attach   vm1   ##链接vm1
ip  addr   ##可以看见他的ip
docker   inspect   vm1  |  grep  Pid   ##过略出Pid
cd    /proc/Pid号/ns
ll    我们发现他是以net模式进行链接的


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设置的一样


ip   addr   ##和vm1的ip应该是一样的
docker   run   -it  --name  vm4  --net  none  ubuntu   ##采用无模式


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   ##列出网络号


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


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


ip  link    set   up   veth1
ip  link    set  up  veth0


ip  addr
brctl   addif   docker0   veth0
brctl  show   ##我们可以看见veth0在桥接上


ip  netns  list  ##出现一个ip号
ip   link   set  veth1  netns    ip号
docker  attach  vm4
ip addr   ##我们发现增加了一个网卡veth1,但是他是down的


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  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通


####删除ip不被允许
docker   rm -f  vm4
docker   rm -f  vm3
docker  attach   vm2
ip  addr del   172.27.0.3/16  dev   eth0  #被拒绝


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


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  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


cd   /sys/fs/cgroup
cd  cpu
cat    cpu.rt_period_us    ##表示让cpu跑满
cat   cpu.cfs_quota_us    ##-1表示不限制


top   ##查看cpu的动态信息
dd   if=/dev/zero  of=/dev/null  &
top   ##发现cpu跑满了


killall  dd    ##cpu又恢复正常了
cgcreate  -g  cpu:x1  ##相当于在在/sys/fs/cgroup/cpu下面建立一个x1,cgdelete  -g  cpu:x1   相当于在/sys/fs/cgroup/cpu删除目录
cd  x1


ls    ##里面的内容和上层的内容没有什么区别
echo   10000 > cpu.cfs_quota_us ##我们也可以利用命令进行设置  cgset  -r   cpu.cfs_quota_us=10000   x1
cgget  -g  cpu:x1    ##我们让他跑了10%


dd  if=/dev/zero  of=/dev/null  &
top   #查看dd的ip号
echo   dd的ip号  >  tasks
top   ##我们发现他基本cpu就在10%左右跑,说明设置成功


cgdelete  -g  cpu:x1   ##删除我们设置的
top   ##发现他又是满格跑
killall  add   


###对于容器的限定
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  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


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%左右

 

####对于企业六怎么进行设置呢
开启一个企业六的虚拟机
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


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


/etc/init.d/cgconfig  restart ##记得一定要退出/cgroup/memory这个目录重启,否则会报错
cd  /cgroup/memory/
ls   x1   #有x1显示
cd  x1
cat   memory.limit_in_bytes   ##应该是自己在文件中设置的


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


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


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;
    }
}


/etc/init.d/cgconfig  restart
cd   /dev/shm   ##必须在这个目录下进行设置,因为他才占据内存的一半
cgexec -g memory:x1 dd  if=/dev/zero  of=bigfile   bs=1M  count=300  ##发现建立不了了
free  -m



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/


/etc/init.d/cgred   start
su  - wb
./memapp1
./memapp2   #发现他被限制了


####自己搭建镜像
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  build  -t   rhel7:v1  .
docker  images   ##我们发现自己封装的镜像在里面


docker  run  -d  --name  vm1  rhel7:v1
docker  inspect  vm1  ##查看vm1的详细信息
curl   172.17.0.2   ##因为vm1下载了httpd,所以我门可以看见httpd的首页

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  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  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  build   -t   rhel7:v4 .
docker  history  rhel7:v4
docker images rhel7


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   ##显示的都是抽取的安装包

##抽取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  build  -t  nginx:v1  .
docker   images  nginx


docker  run  -d  --name  vm4 nginx:v1
docker  ps   ##每定制一个镜像,都要测试一下他能不能跑,否则不知道自己定制的好坏


docker  inspect    vm4
curl   172.17.0.2   ##能看见首页

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


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


docker   tag  nginx:v1 localhost:5000/nginx:v1
docker images  ##发现镜像多了一个


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


cd   /tmp/docker/registry/
ls   ##有docker显示
cd   docker
ls   ##显示registry
tree  .  ##可以看见他的结构图


###现在我们采用走http协议,不走https协议
docker  tag  rhel7   172.25.17.250:5000/rhel7
docker  images


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"]
}


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)))


##记得一定要做解析
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


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 #推送成功


###验证登陆
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  run --rm  --entrypoint htpasswd  registry:2.3.1  -Bbn wb westos >> auth/htpasswd  ##用户名为admin ,密码为westos
cat  auth/htpasswd


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  tag  game2048:latest  westos.org/game2048


docker  login   westos.org  ##登陆


docker push westos.org/game2048


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


#####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


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


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


###另外开一个终端
首先在浏览器访问  http://172.25.17.250
  http://172.25.17.250/status  
 docker  ps   ##可以看见集群的所有组成


 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-compose  stop  #集群的开始和停止都要在/tmp/docker/compose路径下,否则会报错

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值