微服务改造:
分离微服务的方法建议:
• 审视并发现可以分离的业务逻辑业务逻辑
• 寻找天生隔离的代码模块,可以借助于静态代码分析工具
• 不同并发规模,不同内存需求的模块都可以分离出不同的微服务,此方法可提高资源利用率,节省成本
一些常用的可微服务化的组件:
• 用户和账户管理
• 授权和会话管理
• 系统配置
• 通知和通讯服务
• 照片,多媒体,元数据等
Docker好处:
在 ubuntu 上安装 Docker 运行时,参考 https://docs.docker.com/engine/install/ubuntu/
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
启动:docker run
-it 交互
-d 后台运行
-p 端口映射
-v 磁盘挂载
启动已终止容器:docker start
停止容器:docker stop
查看容器进程:docker ps
查看容器细节:docker inspect
进入容器:docker exec -it xxx bash
Docker attach
通过 nsenter
PID=$(docker inspect --format "{{ .State.Pid }}" )
$ nsenter --target $PID --mount --uts --ipc --net --pid
查询docker内容器的pid:docker inspect xxx | grep -i pid
#进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker exec
#进入容器正在执行某个命令的终端,不能在里面操作
docker attach
拷贝文件至容器内:
docker cp file1 :/file-to-path
将 Dockerfile 打包成镜像
docker build -t cncamp/httpserver:${tag} .
docker push cncamp/httpserver:v1.0
运行容器
docker run -d cncamp/httpserver:v1.0
查看当前系统的 namespace:
lsns –t
查看某进程的 namespace:
ls -la /proc//ns/
进入某 namespace 运行命令:
nsenter -t -n ip addr
1、在新 network namespace 执行 sleep 指令:
unshare -fn sleep 60
2、查看进程信息
ps -ef|grep sleep
root 32882 4935 0 10:00 pts/0 00:00:00 unshare -fn sleep 60
root 32883 32882 0 10:00 pts/0 00:00:00 sleep 60
3、查看网络 Namespace
lsns -t net
4026532508 net 2 32882 root unassigned unshare
4、进入改进程所在 Namespace 查看网络配置,与主机不一致
nsenter -t 32882 -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
Union FS
Linux
Docker 启动
以OverlayFS为例
OverlayFS 也是一种与 AUFS 类似的联合文件系统,同样属于文件级的存储驱动,包含了最初的 Overlay 和更新更稳定的 overlay2。
Overlay 只有两层:upper 层和 lower 层,Lower 层代表镜像层,upper 层代表容器可写层。
Null(–net=None)
Host
Container
Bridge(–net=bridge)
Remote(work with remote drivers)
这一个过程是docker的驱动做的,在容器启动进行端口映射的时候,会写入到iptables-save -t nat
测试自主搭建network
https://github.com/cncamp/101/blob/master/module3/setup-network.md
1、Create network ns
mkdir -p /var/run/netns
find -L /var/run/netns -type l -delete
2、Start nginx docker with non network mode
docker run --network=none -d nginx
Check corresponding pid
docker ps|grep nginx
docker inspect <containerid>|grep -i pid
"Pid": 876884,
"PidMode": "",
"PidsLimit": null,
3、Check network config for the container
nsenter -t 876884 -n ip a
4、Link network namespace
export pid=876884
ln -s /proc/$pid/ns/net /var/run/netns/$pid
ip netns list
5、Check docker bridge on the host
brctl show
ip a
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:35:40:d3:8b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:35ff:fe40:d38b/64 scope link
valid_lft forever preferred_lft forever
6、Create veth pair
ip link add A type veth peer name B
7、Config A
brctl addif docker0 A
ip link set A up
8、Config B
SETIP=172.17.0.10
SETMASK=16
GATEWAY=172.17.0.1
ip link set B netns $pid
ip netns exec $pid ip link set dev B name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $SETIP/$SETMASK dev eth0
ip netns exec $pid ip route add default via $GATEWAY
9、Check connectivity
curl 172.17.0.10
Overlay network sample — Flannel
docker build -f $GOPATH/src/github.com/cncamp/golang/httpserver/Dockerfile;
docker build $GOPATH/src/github.com/cncamp/golang/httpserver/;
构建容器镜像时,Docker 依次读取 Dockerfile 中的指令,并按顺序依次执行构建指令。
Docker 读取指令后,会先判断缓存中是否有可用的已存镜像,只有已存镜像不存在时才会重新构建。
docker save/load
docker tag
docker push/pull
docker tag 命令可以为容器镜像添加标签
docker tag 0e5574283393 hub.docker.com/cncamp/httpserver:v1.0
hub.docker.com: 镜像仓库地址,如果不填,则默认为 hub.docker.com
cncamp: repositry
httpserver:镜像名
v1.0:tag,常用来记录版本信息
创建私有镜像仓库
docker run -d -p 5000:5000 registry
FROM ubuntu
ENV MY_SERVICE_PORT=80
ENV MY_SERVICE_PORT1=80
ENV MY_SERVICE_PORT2=80
ENV MY_SERVICE_PORT3=80
LABEL multi.label1="value1" multi.label2="value2" other="value3"
ADD bin/amd64/httpserver /httpserver
EXPOSE 80
ENTRYPOINT /httpserver