Docker介绍

1. 历史

  1. 官网 www.docker.com
  2. 开发语言: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. 原理

image.png
image.png

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

根据提示 :给需要上传的镜像打标记
image.png
[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
image.png
下载 (在其他服务器 )
[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工作原理

image.png
image.png

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

一、原理 作用

image.png

docker compose

一、原理

image.png

二、作用及命令

在一个文件中定义复杂的容器应用直接的关系,用一个命令即可执行
  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应用并发布

image.png

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 &lt<fontcolor=\"blue\">"+guest+"</font>&gt to WebServer &lt<font color=\"blue\">"+pair[1]+"</font>&gt</p>")
        else:
            file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +":<font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from &lt<fontcolor=\"navy\">"+guest+"</font>&gt to WebServer &lt<font color=\"navy\">"+pair[1]+"</font>&gt</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 :容器编排部署

Docker swarm集群管理