Docker介绍
1. 历史
官网 :www.docker.com
开发语言:golang(谷歌公司)
1.7,1.8,1.9.1.11,1.12,1.13
2017年3月后
把docker做成商业开源
docker-ce
docker-ee
Moby: 更名后的开源名
学习使用:docker-ce
2. 原理
仓库:里面有镜像—-网上
镜像:打包好的服务,系统
容器:通过镜像来运行服务,系统
1.(docker client)客户端发送命令--->docker守护进程(docker daemon)
2.守护进程在宿主机(docker host) 守护进程用来启动镜像给客户端用
3.守护进程(docker daemon)会找自己的本地仓库 内找镜像
4.守护进程(docker daemon)到镜像仓库下载镜像
3. 安装
# docekr
# 卸载部分已安装软件
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装yum-config-manager和yum-utils
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 安装20.10版本Docker
yum -y install docker-ce-20.10.8-3.el7 docker-ce-cli-20.10.8-3.el7 containerd.io
# 配置加速源
[ ! -d /etc/docker ] && mkdir /etc/docker && touch /etc/docker/daemon.json
cat >> /etc/docker/daemon.json << OFF
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
OFF
# 启动
systemctl enable --now docker
docker run hello-world
# 安装Docker-Compose
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# docker 开启ipv4转发
sysctl -w net.ipv4.ip_forward=1
Docker使用
1. 基础操作
# 查看docker信息(docker版本...)
docker info
# 镜像操作
docker search nginx # 查找某个镜像
docker pull nginx:1.22.0 # 下载拉取某个镜像
docker images # 查看所有镜像
docker rmi -f hello-world # 删除一个镜像
# 启动一个容器
docker run{ # 通过镜像启动运行容器
docker run -d --name nginx-01 nginx:1.22.0
docker run -it --name nginx-02 nginx:1.22.0 /bin/bash
docker run -d --name nginx-03 -p 8080:80 nginx:1.22.0
docker run -it -v /data/docker:/data --name q2 /bin/bash
# 时间同步
docker run -it -v /etc/localtime:/etc/loacltime centos:latest /bin/bash
}
# 容器的操作
docker ps -a # 查看运行的容器,-a【查看容器的所有状态】
docker rm -f [ID/NAMES] # 删除某个容器
docker [stop/start/restart] [ID/NAMES] # 启动某个容器
docker logs [ID/NAMES] # 查看容器日志
docker exec -it nginx-03 /bin/bash # 进入容器内部
docker inspect nginx-03 # 查看容器信息(ip,存储,端口...)
# 查看容器信息(ip地址...)
docker inspect 容器ID
# 启动一个容器
docker run{ # 通过镜像启动运行容器
docker run -d --name nginx-01 nginx:1.22.0
docker run -it --name nginx-02 nginx:1.22.0 /bin/bash
docker run -d --name nginx-03 -p 8080:80 nginx:1.22.0
docker run -it -v /data/docker:/data --name q2 /bin/bash
# 时间同步
docker run -it -v /etc/localtime:/etc/loacltime centos:latest /bin/bash
}
docker run -it -d \
-v /usr/local/nginx/nginx.conf:/usr/local/nginx/nginx.conf \
-v /usr/local/nginx/http:/usr/local/nginx/http \
-p 8080:80 \
--name nginx-8080 \
-v /etc/localtime:/etc/loacltime /bin/bash
docker exec -it nginx-8080 /bin/bash
# 1. 开启7000-7100:7000-7100 ,55555:22
# 2. 软件包在本地/packages里面,docker容器中找/work目录 # 数据持久化
# 3. 初始化/etc/init.d:/etc/init.d ; /usr/sbin/init
# 4. 开启systemd权限管理容器 --privileged=true
# 5. 设置语言 env LANG=en_US.utf8
docker run -d -it \
--publish 7000-7100:7000-7100 \
--publish 55555:22 \
--volume /packages:/work \
--volume /etc/init.d:/etc/init.d \
--name centos1 \
--privileged=true centos:7 env LANG=en_US.utf8 /usr/sbin/init
docker exec -it centos1 /bin/bash
2. 远程管理
远程管理dockers daemon 条件
可以把client和daemon 分开部署
可以通过第三方软件管理daemon
1.修改docker配置文件 先stop守护进程
systemctl stop docker
2.修改配置文件
vim /usr/lib/systemd/system/docker.server
ExecStart=/usr/bin/dockerd
3.加载配置文件
systemctl daemon-reload
4.重新开启docker
systemctl start docker
5.添加对docker的配置
vim /etc/docker/daemon.json
{
["",""]
}
6.远程管理
docker -H 192.168.11.102 images
3. 将镜像导出打包
1.打包
docker save -o cetos.tar centos7u7:latest
2.传输
scp centos7u7 192.168.11.102:/root
导入镜像
docker load -i centos7u7.tar
4. 数据持久化存储
mkdir -p /data/nginx/html
echo "123 web" > /data/nginx/html/index.html
docker run -it -v /data/nginx/html:/data --name q3 -p 8080:80 centos
5. 镜像制作
1.打包操作系统根目录(排除/proc/sys)
tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7u7.tar /
scp centos7u7.tar 192.168.11.101:/root
2.把打包的文件导入到Docker host 中
docker import centos7u7.tar cnetos7u7:latest
3.使用基础镜像启动容器
docker -it --name a1 cnetos7u7:latest /bin/bash
1.指定应用程序运行环境
docker commit a1 centos7u7-httpd:v1
2.使用镜像
[root@localhost ~]# docker run -it centos7u7-httpd:v1 /bin/bash
[root@81426b40a61b /]# httpd -k start
docker-阿里加速器(加速源)
https://www.cnblogs.com/ludangxin/p/15097035.html
Dockerfile镜像制作
1. Dockerfile关键字
https://cloud.tencent.com/developer/article/1896354
#关键字
FROM(指定image)
MAINTAINER(用来指定镜像创建者信息)
RUN(运行命令)
CMD(设置启动是执行的操作)
USER(设置容器用户)
EXPOSE(指定容器需要映射的主机端口)
WORKDIR (切换工作目录)
ADD (拷贝到镜像)
格式 ADD 源路径 目标路径
2. Dockerfile案例
# 1. 从官网上下载一个centos系统镜像
[root@localhost test]# docker pull centos:centos7.9.2009
# 2. 开启一个容器名为system
[root@localhost test]# docker run -d --name system centos:centos7.9.2009
# 3. 进入容器内部
[root@localhost test]# docker exec -it system /bin/bash
# 4. 做优化
[root@localhost test]# 做yum,安装软件的优化 exit
# 5. 从容器中创建一个新的镜像
[root@localhost test]# docker commit system centos7:latest
# 6. 打包(导出)镜像 名为mysystem.tar
[root@localhost test]# docker save -o mysystem.tar centos7:latest
# 导入命令 docker load -i mysystem.tar
[root@localhost test]# 重命名tag docker tag centos7:latest centos7yum:v1
# 查看Dockerfile信息
[root@localhost test]# cat Dockerfile
FROM centos7yum:v1
MAINTAINER "brook make"
RUN yum -y install httpd
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh
WORKDIR /var/www/html
ADD index.html index.html
EXPOSE 80
CMD ["/bin/bash","/run-httpd.sh"]
[root@localhost test]# cat run-httpd.sh
#!/bin/bash
httpd -k start
# qiantian yunxing
for i in {1..365}
do
sleep 10d
done
[root@localhost test]# cat index.html
It work!!
# 执行下面命令
docker build -t apache:v4 . #使用当前目录的 Dockerfile 创建镜像,标签为apache:v4
docker images
docker run -d -p 8080:80 --name web apache:v4
curl 127.0.0.1:8080
docker exec -it web /bin/bash
# NGINX----dockerfile
[root@localhost test]# cat Dockerfile
FROM centos7yum:v1
MAINTAINER 'sand'
RUN yum -y install nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx
Docker存储
1. 原理
docker info #查看系统信息
overlay 共享数据方式通过硬连接
/var/lib/docker #docker存储位置
/var/lib/docker/overlay2 #镜像存储位置
Docker镜像仓库
1. 公有仓库DockerHub
1.1 dockerhub登录
0. 官方镜像仓库
属于公有仓库
网址hub.docker.com 网站名称
1. 注册,登录
进入dockerhub官网:https://hub.docker.com
2. 创建仓库
1.2 dockerhub创建仓库
# 把本地的镜像标记为远程的仓库名字 然后push
# 登录账号
[root@localhost ~]# docker login #登录
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: brook0813com
Password:
[root@localhost ~]# docker logout #登出
Removing login credentials for https://index.docker.io/v1/
# 上传镜像
2. 私有仓库Harbor
1、下载registey容器镜像
[root@localhost ~]# docker pull registry
2、创建用于挂载registry镜像仓库,便于容器持久保存
mkdir -p /data/dockerregistry
3、启动容器获取镜像仓库
[root@localhost ~]# docker run -d -p 5555:5000 --restart=always -v /data/dockerregistry/:/var/lib/registey --name a1 registry:latest
4、验证是否可用
第一种方式
[root@localhost ~]# curl 192.168.11.101:5555/v2/_catalog
{"repositories":[]}
第二种方式
添加私有仓库经demon.json #vim /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.11.101:5555"],
"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker tag centos:centos7.9.2009 192.168.11.101:5555/centos:v1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.11.101:5555/centos v1 eeb6ee3f44bd 9 months ago 204MB
5、上传
[root@localhost ~]# docker push 192.168.11.101:5555/centos:v1
The push refers to repository [192.168.11.101:5555/centos]
174f56854903: Pushed
v1: digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f size: 529
#+++++++++++++++++++++++++++++介绍+++++++++++++++++++++++++++++#
1.作用
用Web管理界面,可以方便管理Docker镜像
#++++++++++++++++++++++++++++环境准备++++++++++++++++++++++++++#
1.安装docker #参考docker安装
yum -y install docker-ce-20.10.8-3.el7 docker-ce-cli-20.10.8-3.el7 containerd.io
2.安装docker-compose工具 进行启动
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
#+++++++++++++++++++++++++++++安装+++++++++++++++++++++++++++++#
1.下载harbor
[root@server2 ~]# ls
harbor-offline-installer-v1.8.2.tgz
2.将harbor压缩包解压
tar -xf harbor-offline-installer-v1.8.2.tgz
3.安装harbor
[root@server2 ~]# cd harbor/ # harbor会自动起80端口 所以确保电脑没80端口
[root@server2 harbor]# ls
harbor.v1.8.2.tar.gz harbor.yml install.sh LICENSE prepare
[root@server2 harbor]# vim harbor.yml
5 hostname: 192.168.11.102 #修改的内容
[root@server2 harbor]# ./prepare #执行修改的文件
[root@server2 harbor]# ./install.sh #启动安装脚本
#+++++++++++++++++++++++++++++管理工具+++++++++++++++++++++++++++++#
compose工具进行启动
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
yum -y install docker-compose
#+++++++++++++++++++++++++++++++测试+++++++++++++++++++++++++++++++#
1.harbor会自动起80端口
[root@server2 harbor]# ss -antl |grep 80
LISTEN 0 128 127.0.0.1:2380 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:80 [::]:*
curl 192.168.11.102
web页面登录 http://192.168.11.102
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7.9.2009 eeb6ee3f44bd 9 months ago 204MB
[root@localhost ~]# docker tag centos:centos7.9.2009 brook0813com/centos:v1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
broocomkdocker/centos v1 eeb6ee3f44bd 9 months ago 204MB
centos centos7.9.2009 eeb6ee3f44bd 9 months ago 204MB
[root@localhost ~]# docker push brook0813com/centos:v1
docker pull centos:centos7.9.2009
Harbor的使用
harbor :默认管理员和密码<br /> admin harbor12345<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21674592/1655967521090-3f739958-3c5e-4148-a02d-6397bce9b648.png#clientId=u897203e5-1ae8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=730&id=u15fbd630&margin=%5Bobject%20Object%5D&name=image.png&originHeight=730&originWidth=1028&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49953&status=done&style=none&taskId=u89477670-6d7b-4672-a5af-ec1b7aa55ae&title=&width=1028)
上传镜像到harbor镜像私有仓库
在daemon.json中添加此仓库地址
[root@server2 harbor]# cat /etc/docker/daemon.json
{
“insecure-registries”: [“http://192.168.11.102“],
“registry-mirrors”:“[https://docker.mirrors.ustc.edu.cn”,”https://mirror.baidubce.com”],
“bip”: “172.20.2.1/24”,
“mtu”: 1472
}
[root@server2 harbor]# systemctl restart docker
根据提示 :给需要上传的镜像打标记
[root@server2 harbor]# docker tag centos:7 192.168.11.102/library/centos-7:v1
[root@server2 harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
192.168.11.102/library/centos-7 v1 eeb6ee3f44bd 9 months ago 204MB
上传
登录Harbor
[root@server2 harbor]# docker login 192.168.11.102
Username: admin
Password:
上传镜像
docker push 192.168.11.102/library/centos-7:v1
下载 (在其他服务器 )
[root@server3 ~]# docker pull 192.168.11.102/library/centos-7:v1
Docker网络
1. docker的四种网络模型
docker run --link q1:mysql -it --name q2 centos /bin/bash
第一种: bridge NAT模式
#桥 用于连接外网 使用NAT人员可以访问外网
[root@localhost ~]# yum -y install bridge-utils # 安装查看桥网络工具
[root@localhost ~]# brctl show # 查看命令
bridge name bridge id STP enabled interfaces
docker0 8000.02423843f6bd no veth1a902bd
第二种: host模式
所有的容器与docker host 在同一网络中
docker network ls # 查看网络
docker inspect 容器id # 查看容器ip
#使用--netowork选择完成对容器的网络选择
docker run -d --network host --name aw centos:centos7.9.2009
第三种: none 模式
容器仅与lo网卡,不能与外界连接,在高级应用中使用到
docker run -d --network none --name sw centos:centos7.9.2009
第四种: 容器网络或联盟网络
容器间共享同一个网络命名空间,实现容器键数据传输
时间跨主机容器通信的工具
pipework flannel weave
Flannel工作原理
是overlay 网络及覆盖型网络
通过etcd保存子网信息及网络分配信息
给每台Docker Host配置一个网段
通过UDP传输
2. Flannel工作原理
3. 应用部署—容器跨网络
#+++++++++++++++++++++++++ 基础配置 +++++++++++++++++++++++++#
# node1,node2
1、主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
2、配置/etc/hosts
vim /etc/hosts
192.168.11.101 node1
192.168.11.102 node2
3、安全配置
setenforce 0
sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config
systemctl disable --now firewalld
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
#+++++++++++++++++++++++++ node1配置 +++++++++++++++++++++++++#
# node1
1、安装软件
yum -y install etcd flannel
2. etcd配置 配置文件
vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #通知客户端
systemctl enable --now etcd.service #开启
2.1 验证
etcdctl -C http://192.168.11.101:4001 cluster-health
3. 在etcd中添加网段
etcdctl mk /atomic.io/network/config '{ "Network": "172.20.0.0/16" }'
4. flannel配置 配置文件
vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.11.101:4001"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
5. flannel启动
systemctl start flanneld && systemctl enable flanneld
#+++++++++++++++++ 配置flanneld与docker结合 +++++++++++++++++#
######### node1配置 #########
1. 查看仓库subnet信息
[root@node1 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.2.1/24 # "bip": "172.20.2.1/24",
FLANNEL_MTU=1472 # "mtu": 1472
FLANNEL_IPMASQ=false
2. 配置daemon.json
vim /etc/docker/daemon.json #配置docker daemon 添加上面查找到信息
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://mirror.baidubce.com"],
"bip": "172.20.2.1/24",
"mtu": 1472
}
3. 重启docker
systemctl restart docker
docker-compose stop
######### node2配置 #########
1. 安装flannel
yum -y install flannel
2. 配置flannel
vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.11.101:4001" # node1的地址
3. 启动flannel
systemctl start flanneld
4. 配置flannel与docker结合
[root@node2 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.3.1/24 # "bip": "172.20.3.1/24",
FLANNEL_MTU=1472 # "mtu": 1472
FLANNEL_IPMASQ=false
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"],
"bip": "172.20.3.1/24",
"mtu": 1472
}
5. 重启docker
systemctl restart docker
#+++++++++++++++++ 测试 +++++++++++++++++#
[root@node1 ~]# docker pull centos:7
[root@node1 ~]# docker run -itd --name test1 centos:7
[root@node1 ~]# docker run -itd --name test1 centos:7
# 查看docker容器test1的ip地址
[root@node1 ~]# docker inspect test1 |grep IPAddress
"IPAddress": "172.20.2.3",
[root@node1 ~]# docker inspect test2 |grep IPAddress
"IPAddress": "172.20.2.4",
[root@node1 ~]# docker exec test1 ping -c 4 172.20.2.4
64 bytes from 172.20.2.3: icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from 172.20.2.3: icmp_seq=2 ttl=64 time=0.118 ms
64 bytes from 172.20.2.3: icmp_seq=3 ttl=64 time=0.125 ms
64 bytes from 172.20.2.3: icmp_seq=3 ttl=64 time=0.125 ms
[root@node2 ~]# docker pull centos:7
[root@node2 ~]# docker run -itd --name test1 centos:7
[root@node2 ~]# docker run -itd --name test1 centos:7
# 查看docker容器test1的ip地址
[root@node2 ~]# docker inspect test1 |grep IPAddress
"IPAddress": "172.20.3.3",
[root@node2 ~]# docker exec test1 ping -c 4 172.20.2.3
64 bytes from 172.20.2.3: icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from 172.20.2.3: icmp_seq=2 ttl=64 time=0.118 ms
64 bytes from 172.20.2.3: icmp_seq=3 ttl=64 time=0.125 ms
64 bytes from 172.20.2.3: icmp_seq=3 ttl=64 time=0.125 ms
Docker 编排
一、作用
实现复杂容器应用架构直接的互联
减少大量容器部署成本
二、容器编排工具
docker machine #用于准备docker主机
docker compose #用于对复杂应用的部署 通过一个文件定义负载的容器应用直接的关系
docker swarm #用于管理容器(docker)主机 把docker主机变成一个集群 可以使用YAML文件实现负载容器应用编排
k8s #容器编排
mesos #集群资源管理工具
docker machine
一、原理 作用
docker compose
一、原理
二、作用及命令
在一个文件中定义复杂的容器应用直接的关系,用一个命令即可执行
0.YAML语言类似html,xmk #标记语言
0.YAML格式文件
0.docker-compose 使用YAML文件启动容器
0.1 start & stop
0.2 down & up
docker-compose # 拉取镜像
docker-compose up -d nginx # 运行nginx容器
docker-compose up -d # 运行所有容器
docker-compose ps # 查看容器运行状态
docker-compose down # 停止容器和容器网络
docker-compose rm nginx # 删除nginx容器
● 使用缩进表示层级关系,不支持制表符tab键缩进,只能使用空格键缩进;
● 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
● 通常开头缩进2个空格;
● 字符后缩进1个空格,如冒号:空格 逗号,空格 横杠-空格文本之间的空格>;
● 用#号注释;
● 如果包含特殊字符用单引号' '引起来;
● 布尔值必须用引号" "括起来;
● 区分大小写
● 字符串可以不用引号标注
version: #定义compose的版本,定义关乎与docker的兼容性
services: #定义了服务的配置信息,包含应用于该服务启动的每个容器的配置
networks: #定义了网络信息,提供给 services 中的 具体容器使用,类似于命令行的 docker network create
volumes: #定义了卷信息,定义了卷信息,提供给 services 中的 具体容器使用,类似于命令行的 docker volume create
ports: #建立宿主机和容器之间的端口映射关系
三、docker-compose定义方法
在线检查Yam文件语法格式的错误
网站1:http://nodeca.github.io/js-yaml/
网址2:http://yaml-online-parser.appspot.com/
容器分(包裹)三层
0.工程 project #一个目录
0.服务 server #用于定义容器的镜像(网络、依赖....)资源
0.容器 container #用于运行服务
3.1步骤
1. 准备工作
1.1手动创建运行一个nginx容器 主要是为了获取 Nginx 容器内部的配置文件
mkdir /usr/local/nginx
cd /usr/local/nginx/
mkdir -p ./{conf.d,html,logs,www,etc}
touch ./conf.d/default.conf
touch ./docker-compose.yml
touch ./nginx.conf
touch ./index.html
touch ./etc/{cert,letsencrypt}
touch ./html/index.html
touch ./logs/{access.log,error.log}
1.2拷贝容器内 Nginx 默认配置文件到本地当前目录下的 nginx 目录($PWD 当前全路径)
docker run -d --name nginx nginx:latest
docker stop nginx #停止容器
docker rm nginx #删除镜像
1.3安装docker-compose/v2.3.4
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.3.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2. 创建一个docker-compose.yaml文件 #用于定义服务
[root@server3 nginx]# vim docker-compose.yml
[root@server3 nginx]# cat docker-compose.yml
version: '2.3'
services:
weba:
buile: ./web
expose:
- 80
webb:
buile: ./web
expose:
- 80
webc:
buile: ./web
expose:
- 80
haproxy:
image: nginx:latest
volumes:
- ./data/front:/usr/share/nginx/html
- ./usr/local/nginx/logs:/var/log/nginx
- ./usr/local/nginx/nginx.conf/:/etc/nginx/nginx.conf
- ./usr/local/nginx/etc/cert:/etc/nginx/cert
- ./usr/local/nginx/conf.d:/etc/nginx/conf.d
links:
- weba
- webb
- webc
ports:
- "80:80"
- "70:70"
expose:
- "80"
- "70"
3. 启动docker-compose.yaml定义的服务 #使用docker-compose命令启动服务
docker-compose up -d
4.查看创建的容器
docker ps
3.2 使用docker-compose工具部署
1. 安装docker-compose (一键安装)
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
四、应用案例
4.1使用compose实现web应用发布
使用docker-compose.yaml文件控制haproxy接受web应用并发布
1.创建文件夹(工程)
[root@localhost ~]# mkdir docker-haproxy
[root@localhost ~]# cd docker-haproxy/
2.定义web服务
[root@localhost web]# mkdir web
[root@localhost web]# cd web/
[root@localhost web]# vim Dockerfile
[root@localhost web]# cat Dockerfile
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
[root@localhost web]# vim index.py
[root@localhost web]# cat index.py
#!/usr/bin/python
#date:
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import socket
import fcntl
import struct
import pickle
from datetime import datetime
from collections import OrderedDict
class HandlerClass(SimpleHTTPRequestHandler):
def get_ip_address(self,ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def log_message(self, format, *args):
if len(args) < 3 or "200" not in args[1]:
return
try:
request = pickle.load(open("pickle_data.txt","r"))
except:
request=OrderedDict()
time_now = datetime.now()
ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
s erver = self.get_ip_address('eth0')
host=self.address_string()
addr_pair = (host,server)
if addr_pair not in request:
request[addr_pair]=[1,ts]
else:
num = request[addr_pair][0]+1
del request[addr_pair]
request[addr_pair]=[num,ts]
file=open("index.html", "w")
file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\"face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></center>");
for pair in request:
if pair[0] == host:
guest = "LOCAL: "+pair[0]
else:
guest = pair[0]
if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d%H:%M:%S')).seconds < 3:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +":<font color=\"red\">"+str(request[pair][0])+ "</font> requests " + "from <<fontcolor=\"blue\">"+guest+"</font>> to WebServer <<font color=\"blue\">"+pair[1]+"</font>></p>")
else:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +":<font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from <<fontcolor=\"navy\">"+guest+"</font>> to WebServer <<font color=\"navy\">"+pair[1]+"</font>></p>")
file.write("</body> </html>");
file.close()
pickle.dump(request,open("pickle_data.txt","w"))
if __name__ == '__main__':
try:
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
HandlerClass.protocol_version = Protocol
httpd = ServerClass((addr, port), HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
except:
exit()
[root@localhost web]# touch index.html
3.定义haproxy服务
[root@localhost web]# cd ..
[root@localhost docker-haproxy]# mkdir haproxy
[root@localhost docker-haproxy]# cd haproxy/
[root@localhost haproxy]# vim haproxy.cfg
[root@localhost haproxy]# cat 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
listen stats
bind *:70
stats enable
stats uri /
frontend balancer
bind 0.0.0.0:80
mode http
default_backend web_backends
backend web_backends
option forwardfor
balance roundrobin
server weba weba:80 check
server webb webb:80 check
server webc webc:80 check
option httpchk GET /
http-check expect status 200
4.通过docker-compose.yaml整合以上服务
[root@localhost docker-haproxy]# vim docker-compose.yaml
[root@localhost docker-haproxy]# ls
docker-compose.yaml haproxy web
[root@localhost docker-haproxy]# cat docker-compose.yaml
weba:
build: ./web
expose:
- 80
webb:
build: ./web
expose:
- 80
webc:
build: ./web
expose:
- 80
haproxy:
image: haproxy:latest
volumes:
- ./haproxy:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- weba
- webb
- webc
ports:
- "80:80"
- "70:70"
expose:
- "80"
- "70"
5.使用docker-compose命令启动工程
[root@localhost docker-haproxy]# docker-compose up
6.访问测试
192.168.11.104
4.2创建一个python web应用,使用flask,把用户访问次数写入redis,通过web首页显示访问次数
1.创建工程
[root@localhost ~]# mkdir pythondir
[root@localhost ~]# cd pythondir
2.创建一个app.py程序
[root@localhost pythondir]# vim app.py
[root@localhost pythondir]# cat app.py
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis',port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello world! I have been seen %s time.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0",debug=True)
3.创建一个txt文件(创建安装的软件需求列表)
[root@localhost pythondir]# vim requirements.txt
[root@localhost pythondir]# cat requirements.txt
flask
redis
4.编写Dockerfile
[root@localhost pythondir]# vim Dockerfile
[root@localhost pythondir]# cat Dockerfile
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py
5.编写docker-compose.yaml文件
[root@localhost pythondir]# cat docker-compose.yaml
version: '2' #yaml版本
services: #服务
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis:latest
6.运行docker-compose
[root@localhost pythondir]# docker-compose up
7.测试
192.168.11.104:5000
4.3 使用容器运行一个wordpress应用
由php语言开发
要有数据库
1.创建工程目录
[root@localhost ~]# mkdir wordpress #wordpress
[root@localhost ~]# cd wordpress
2.创建一个docker-compose.yaml文件
[root@localhost wordpress]# vim docker-compose.yaml
[root@localhost wordpress]# cat docker-compose.yaml
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
links:
- db
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
3.启动
[root@localhost wordpress]# docker-compose up
docker sarwrm
一、介绍
目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。
它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,
使得容器可以组成跨主机的子网网络。
二、作用
用于管理容器(docker)主机 把docker主机变成一个集群 可以使用YAML文件实现负载容器应用编排
kubernetes
一、介绍
简称k8s
googel公司内部使用使劲伯格系统的开源
归云原生计算基金会
能够实现负载容器的应用编排部署
容器的字段装箱功能
容器滚动功能及回滚
容器水平扩展
mesos+marathon
mesos:集群资源管理工具<br /> marathon :容器编排部署