Docker
2019-12-25 16:46:48 110 举报
AI智能生成
Docker,未完待续
作者其他创作
大纲/内容
第七章:容器编排Docker Swarm
多容器产生的问题
怎么去管理这么多容器
怎么能方便的横向扩展
如果容器down了,怎么能自动恢复
如何去更新容器而不影响业务
如何去监控追踪这些容器
怎么去调度容器的创建
保护隐私数据
创建一个三节点的集群
Paly with docker https:/labs.play-with-docker.com/
docker swarm init --advertise-addr=192.168.205.10
docker swarm join --token SWMTKN-1-0f1kirl6asnidkw4jwnx2n82p9oiwi5kkzdveglnftowx90g49-3hyxut911qiwxjmfvue7do4iy 192.168.0.13:2377
docker node ls
Service的创建维护和水平扩展
docker service create --name demo busybox sh -c "while true;do slep 3600;done"
docker service ls
docker service ps demo
docker service scale demo=5
docker service rm demo
在swarm集群里通过serivce部署wordpress
docker network create -d overlay demo
docker network ls
docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7
docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST==mysql --network demo wordpress
集群服务间通信之RoutingMesh
实践
docker network create -d overlay demo
docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami
docker service ps whoami
docker ps
docker exec -it a173 sh
ping whami
docker service scale whoami=2
nslookup
nslookup tasks.whoami
Routing Mesh的两种体现
Internal—-Container和Container之间的访问通i过overlay
网络(通过VIP虚拟IP)
网络(通过VIP虚拟IP)
Ingress——如果服务有绑定接口,则此服务可以通过任意swarm节点的相应接口访问
Ingress Network
外部访问的负载均衡
服务端口被暴露到各个swarm节点
内部通过IPVS进行负载均衡
第八章:DevOps初体验——Docker Cloud和Docker企业版
第九章:容器编排Kubernetes
第十章:容器的的运维和监控
第十一章:Docker+DevOps实战——过程和工具
第一章:容器技术和Docker简介
虚拟化的优点
资源池一—一个物理机的资源分配到了不同的虚拟机里
很容易扩展——加物理机器or加虚拟机
很容易云化——亚马逊AWS,阿里云等
虚拟化的局限性
每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多
容器解决了什么问题
解决了开发和运维之间的矛盾
在开发和运维之间搭建了一个桥梁,是实现devops的最佳解决方案
什么是容器
对软件和其依赖的标准化打包
应用之间相互隔离
共享同一个OS Kernel
可以运行在很多主流操作系统上
容器和虚拟机的区别
容器是APP层面的隔离
虚拟化是物理资源层面的隔离
第二章:Docker环境的各种搭建方法
vagrant
新建目录
vagrant init centos/7
vagrant up
vagrant ssh
yum version
CentOs安装Docker
https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce
http://dbase.cc/2017/12/12/docker/02_docker%E7%9A%84%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85-Centos/
若安装不成功可尝试设置DNS为8.8.8.8
https://yeasy.gitbooks.io/docker_practice/install/
Docker Machine
https://docs.docker.com/machine/install-machine/
简化 sudo
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo service docker restart
重新连接shell
docker启动,重启,关闭命令
启动 systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker
第三章:Docker的镜像和容器
Docker的架构和底层技术
Docker Engine
后台进程(dockerd)
后台进程(dockerd)
CLI接口(docker)
Docker Architecture
Client
DOCKER_HOST
Registry
底层技术支持
Namespaces:做隔离pid,net,ipc,mnt,uts
Control groups:做资源限制
Union file systems:Container和image的分层
Docker Image概述
什么是Image
文件和meta data的集合(root filesystem)
分层的,并且每一层都可以添加改变删除文件,成为一个新的image
不同的image可以共享相同的layer
Image本身是read-only的
操作
sudo docker version
sudo docker image ls
Image的获取
Build from Dockerfile
Pull from Registry
DIY一个BaseImage
docker pull hello-word
docker image ls
docker run hello-word
mkdir hello-world
cd hello-world/
vim hello.c
gcc-static hello.c-o hello
vim Dockerfile
docker build -t xiaopeng163/hello-world.
docker history accalle86101
什么是Container
通过Image创建(copy)
在lmage layer之上建立一个
container layer(可读写)
container layer(可读写)
类比面向对象:类和实例
Image负责app的存储和分发,Container负责运行app
docker container 查看相关操作
Dockerfile语法梳理及最佳实践
FROM
FROM scratch#制作base image
FROM centos#使用base image
FROM ubuntu:14.04
尽量使用官方的image作为base image!
LABEL
LABEL maintainer="xiaoquwl@gmail.com"
LABEL version="1.0"
LABEL description="This is description"
LABEL version="1.0"
LABEL description="This is description"
Metadata不可少!
RUN
RUN yum update&&yum install-y vim\
python-dev#反斜线换行
python-dev#反斜线换行
RUN apt-get update&&apt-get install-y perl\
pwgen--no-install-recommends&&rm-rf\
/var/lib/apt/lists/*#注意清理cache
pwgen--no-install-recommends&&rm-rf\
/var/lib/apt/lists/*#注意清理cache
RUN/bin/bash -c' source $HOME/. bashrc; echo
$HOME'
$HOME'
为了美观,复杂的RUN请用反斜线换行!
避免无用分层,合并多条命令成一行!
避免无用分层,合并多条命令成一行!
WORKDIR
WORKDIR/root
WORKDIR/test#如果没有会自动创建test目录
WORKDIR demo
RUN pwd#输出结果应该是/test/demo
WORKDIR demo
RUN pwd#输出结果应该是/test/demo
用WORKDIR,不要用RUNcd!
尽量使用绝对目录!
尽量使用绝对目录!
ADD and COPY
ADD hello/
ADD test.tar.gz/#添加到根目录并解压
WORKDIR /root
ADD hello test/ # /root/test/hello
ADD hello test/ # /root/test/hello
大部分情况,COPY优于ADD!
ADD除了COPY还有额外功能(解压)!
添加远程文件/目录请使用curl或者wget!
ADD除了COPY还有额外功能(解压)!
添加远程文件/目录请使用curl或者wget!
ENV
ENV MYSQL VERSION 5.6#设置常量
RUN apt-get install-y mysql-server="${MYSQL_VERSION}"\
&&rm-rf/var/lib/apt/lists/*#引用常量
RUN apt-get install-y mysql-server="${MYSQL_VERSION}"\
&&rm-rf/var/lib/apt/lists/*#引用常量
尽量使用ENV增加可维护性!
run vs cmd vs entrypoint
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
如果docker run指定了其它命令,CMD命令被忽略
如果定义了多个CMD,只有最后一个会执行
ENTRYPOINT:设置容器启动时运行的命令
让容器以应用程序或者服务的形式运行
不会被忽略,一定会执行
最佳实践:写一个shell脚本作为entrypoint
Shell和Exec格式
Shel格式
RUN apt-get install-y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
Exec格式
RUN["apt-get"arsmd"install","-y","vim"]
CMD["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]
CMD["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]
Dockerfile 出错调试
可以run 最后一个成功的image
docker run -it 591df7f80666 /bin/bash
docker ps
第四章:Docker的网络
单机
Bridge Network
Host Network
None Network
多机
Overlay Network
基于数据包的通讯方式
网络的分层
公有IP和私有IP
Public IP:互联网上的唯一标识,可以访问internet
Private IP:不可在互联网上使用,仅供机构内部使用
A类10.0.0.0--10.255.255.255(10.0.0.0/8)
B类172.16.0.0--172.31.255.255(172.16.0.0/12)
C类192.168.0.0--192.168.255.255(192.168.0.0/16)
B类172.16.0.0--172.31.255.255(172.16.0.0/12)
C类192.168.0.0--192.168.255.255(192.168.0.0/16)
网络地址转换NAT
Ping和telnet
Ping(ICMP):验证IP的可达性
telnet:验证服务的可用性
wireshark
Linux网络命名空间
docker exec-it d528e96bbd1f /bin/sh
ip a
sudo ip netns list
sudo ip netns delete test1
sudo ip netns add test1
sudo ip netns exec test1 ip a
ip link
sudo ip netns exec test1 ip link set dev lo up
sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link set veth-test1 netns test1
sudo ip netns exec test1 ip link
sudo ip link set veth-test2 netns test2
sudo ip netns exec testl ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test1 ip a
Docker Bridge
多机器通信
VXLAN
overlay
etcd
第五章:Docker的持久化存储和数据共享
Docker持久化数据的方案
基于本地文件系统的Volume
可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。
基于plugin的Volume
,支持第三方的存储方案,比如NAS,aws
Data Volume
Volume的类型
受管理的data Volume,由docker后台自动创建
绑定挂载的Volume,具体挂载位置可以由用户指定
实操
docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD mysql
docker logs mysql1
docker rm mysql1
docker volume ls
docker volume inspect 46b9dda16f
docker volume rm 904433
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
Bind Mouting
docker run -v /home/aaa:/root/aaa
$ docker build -t cxd/nginx .
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web cxd/nginx
docker exec -it web /bin/bash
touch est.txt
ls
exit
ls
开发者利器 - dk+bind mount.
docker build -t cxd/flask-skeleton .
docker run -d -p 80:5000 -v $(pwd):/skeleton --name flask cxd/flask-skeleton
第六章:Docker Compose多容器部署
部署wordpress
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
多容器的APP
要从Dockerfile build image或者Dockerhub拉取image
要创建多个container
要管理这些container(启动停止删除)
Docker Compose
Docker Compose 是一个工具
这个工具可以通过一个yml文件定义多容器的docker应用
通过一条命令就可以根据yml文件的定义去创建或者管理这
多个容器
多个容器
docker-compose.yml
Services
一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建
Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用
Networks
Volumes
常用操作
docker-compose --version
docker-compose up
docker-compose ps
docker-compose up -d
水平拓展和负载均衡
haproxy
docker-compose up--scale web=3-d
curl 127.0.0.1:8080
部署一个复杂的投票应用
主要用于开发环境,测试,不在生产环境使用
Docker — 从入门到实践
特别推荐阅读
0 条评论
下一页