一:生成容器时加-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