生成容器时加-rm是什么意思,利用LXCFS提升容器资源可见性,Docker Compose

一:生成容器时加-rm是什么意思

在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统

二:利用LXCFS提升容器资源可见性

Linuxs利用Cgroup实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的procfs的/proc目录,其包含如:meminfo, cpuinfo,stat, uptime等资源信息。一些监控工具如free/top或遗留应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,引起错误和不便。

社区中常见的做法是利用 lxcfs来提供容器中的资源可见性。lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器
1:安装lxcfs
[root@server1 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y

2:LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件。
[root@server1 ~]# cd /var/lib/lxcfs/
[root@server1 lxcfs]# ls   ##没启动之前是一个空目录
启动:
[root@server1 lxcfs]# lxcfs /var/lib/lxcfs/ &  ##放入后台
hierarchies:
  0: fd:   5: pids
  1: fd:   6: blkio
  2: fd:   7: cpuset
  3: fd:   8: memory
  4: fd:   9: net_prio,net_cls
  5: fd:  10: freezer
  6: fd:  11: hugetlb
  7: fd:  12: cpuacct,cpu
  8: fd:  13: devices
  9: fd:  14: perf_event
 10: fd:  15: name=systemd

启动完之后发现目录下有目录了
[root@server1 lxcfs]# pwd
/var/lib/lxcfs
[root@server1 lxcfs]# ls
cgroup  proc

3:测试,查看总共的内存大小,为我们设置的200M,说明配置生效
[root@server1 ~]# docker run -it --name vm1 -m 200m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo -v /var/lib/lxcfs/proc/stat:/proc/stat -v /var/lib/lxcfs/proc/swaps:/proc/swaps -v /var/lib/lxcfs/proc/uptime:/proc/uptime ubuntu
root@9d5fead06194:/# free -m
             total       used       free     shared    buffers     cached
Mem:           200          5        194         20          0          0
-/+ buffers/cache:          5        194
Swap:          200          0        200
root@9d5fead06194:/# 

三:Docker Compose

前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具


Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
1:将Docker Compose启动脚本放到/usr/local/bin/目录下,并给与执行权限  
 [root@server1 ~]# mv docker-compose-Linux-x86_64-1.22.0 /usr/local/bin/docker-compose
[root@server1 ~]# chmod +x /usr/local/bin/docker-compose 
2:可执行
[root@server1 ~]# docker-compose 

3:建立相关目录,创建.yml文件
[root@server4 tmp]# mkdir -p /tmp/docker/compose
[root@server4 tmp]# cd /tmp/docker/compose
[root@server4 compose]# vim docker-compose.yml   # compose配置文件,写入创建docker时的相关参数,本例创建三个docker

web1:
    image: nginx
    volumes:
        - ./web1:/usr/share/nginx/html
    expose:
        - 80
web2:
    image: nginx
    volumes:
        - ./web2:/usr/share/nginx/html
    expose:
        - 80

haproxy:
    image: haproxy
    volumes:
        - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro   # 只读挂载
    links:
        - web1
        - web2
    ports:
        - "80:80"
    expose:
        - "80"               # haproxy对外的端口80

4:建立所需要的目录
[root@server1 compose]# mkdir web1
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# echo web2 > web2/index.html
[root@server1 compose]# ls web1/
index.html
[root@server1 compose]# ls web2/
index.html
[root@server1 compose]# mkdir haproxy
[root@server1 compose]# cd haproxy/
[root@server1 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 server1 web1:80 check
    server server2 web2:80 check


[root@server1 haproxy]# cd ..
[root@server1 compose]# ls
docker-compose.yml  haproxy  web1  web2

5:导入所需镜像
[root@server1 ~]# docker load -i haproxy.tar 
[root@server1 ~]# docker load -i nginx.tar 

6:启动
[root@server4 compose]# docker-compose up -d         # 必须在compose目录下执行命令,配置文件里都是相对目录
Creating compose_web1_1 ... done
Creating compose_web2_1 ... done
Creating compose_haproxy_1 ... done

7:查看日至
[root@server1 compose]# docker-compose logs
Attaching to compose_haproxy_1, compose_web2_1, compose_web1_1
haproxy_1  | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 

8:此时浏览器访问172.25.60.1,发现实现了论询
# 若80端口被占用,先关闭占用端口的服务
浏览器访问 172.25.6.14/status 会进入haproxy状态页面, 直接访问172.25.6.14 会轮询访问web1和web2

9:每进行一次轮询,日至中都可以查看到
[root@server1 compose]# docker-compose logs
Attaching to compose_haproxy_1, compose_web2_1, compose_web1_1
web2_1     | 2019/03/25 12:05:04 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.4, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "172.25.60.1"
web2_1     | 172.17.0.4 - - [25/Mar/2019:12:05:04 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
web2_1     | 172.17.0.4 - - [25/Mar/2019:12:05:06 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
web2_1     | 172.17.0.4 - - [25/Mar/2019:12:05:18 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
haproxy_1  | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
web1_1     | 172.17.0.4 - - [25/Mar/2019:12:05:04 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
web1_1     | 2019/03/25 12:05:04 [error] 6#6: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.4, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "172.25.60.1"
web1_1     | 172.17.0.4 - - [25/Mar/2019:12:05:04 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
web1_1     | 172.17.0.4 - - [25/Mar/2019:12:05:07 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"


10:关闭,删除
[root@server1 compose]# docker-compose stop
Stopping compose_haproxy_1 ... done
Stopping compose_web2_1    ... done
Stopping compose_web1_1    ... done

Going to remove compose_haproxy_1, compose_web2_1, compose_web1_1
Are you sure? [yN] y
Removing compose_haproxy_1 ... done
Removing compose_web2_1    ... done
Removing compose_web1_1    ... done
此时docker ps查看不到镜像
再次提起来
[root@server1 compose]# docker-compose up -d
Creating compose_web1_1 ... done
Creating compose_web2_1 ... done
Creating compose_haproxy_1 ... done
[root@server1 compose]# docker ps   ###可以查看到正在运行的容器
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                NAMES
e1f0d35cf466        haproxy                "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   compose_haproxy_1
1bf031901f57        nginx                  "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        80/tcp               compose_web1_1
fd9c70663a40        nginx                  "nginx -g 'daemon of…"   8 seconds ago       Up 5 seconds        80/tcp               compose_web2_1

猜你喜欢

转载自blog.csdn.net/yinzhen_boke_0321/article/details/88874371
今日推荐