ZL
第一章:Docker快速入门
夺命三连问:
- 什么是容器?
- 容器用在哪里?
- 容器解决了什么问题?
Docker介绍
Docker 是一个开源的容器运行时软件(容器运行时是负责运行容器的软件),基于 Go 语言编写,并遵从 Apache2.0 协议开源。
Docker可以让开发者打包自己的应用以及依赖到一个轻量的容器中,然后发布到任何流行的Linux系统上(docker主要理念:一次封装随处运行)
Docker的思想来源于集装箱,让容器与容器之间相互隔离,与系统相互隔离提高程序之间的安全,更重要的是容器性能开销极低。
docker官网:www.docker.com
Docker组成部分
镜像(images):用来创建容器的模板文件,一个镜像可以创建多个容器(容器动态)
容器(container): 程序的载体,程序运行在容器中,每个容器相互隔离,互不影响,但可以相互通讯
仓库(Repository):集中存放镜像的场所,仓库分为公开仓库(public)和私有仓库(private)两种
-
最大的公开仓库为docker hub:https://hub.docker.com
-
国内的公开仓库包括:阿里、网易、中科大等
容器应用场景
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
Docker资源汇总
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: Docker Docs
- Docker Store(镜像文件库): https://store.docker.com
- Docker Cloud(云平台文档): https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker 的源代码仓库: https://github.com/moby/moby
- Docker 发布版本历史: https://docs.docker.com/release-notes/
- Docker 常见问题: https://docs.docker.com/engine/faq/
- Docker 远端应用 API: SDK | Docker Docs
Kubernetes 支持使用的几种通用容器运行时软件:
-
Podman
-
containerd
-
CRI-O
-
Docker
还有必要学习Docker嘛?
- 从未来的角度我们无法预测。
- 从目前市场分析来看,Docker的市场占有率还是非常的高。
Docker版本介绍
Docker 从 1.17.03 版本之后分为:
- CE(Community Edition: 社区版) 功能有限,没有官方技术支持服务。
- EE(Enterprise Edition: 企业版)功能全面,提供官方技术支持服务。
官方安装文档:CentOS | Docker Docs
环境规划
| 主机名称 | IP地址 | 操作系统 | 硬件配置 |
|---|---|---|---|
| docker01 | 自定义 | CentOS 7.6 | 2C/4G |
安装docker软件包
由于centos7已不再维护所以
如何是centos7就先安装阿里云epel仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,方便您可以从仓库安装和更新 Docker:
yum install -y yum-utils
使用以下命令来设置稳定的仓库(阿里仓库):
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
卸载Docker方式:删除安装包, 删除镜像、容器、配置文件内容
yum remove docker-ce
rm -rf /var/lib/docker
配置镜像加速器
>默认情况下镜像从docker hub下载,由于docker hub服务器在国外,由于网络原因镜像下载速度较慢,一般会配置镜像加速器进行下载
> 国内镜像加速器有阿里云、网易云、腾讯云、中科大等,本实验配置阿里云镜像加速器,速度较快
阿里云的加速器:配置镜像加速器_容器镜像服务(ACR)-阿里云帮助中心
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc(中科大) 的镜像:https://docker.mirrors.ustc.edu.cn
Daocloud(云平台):https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
Docker命令介绍
查看docker可用命令:
docker
Docker命令根据Docker官方案例分为以下几种:
- Docker环境信息: docker [info|version]
- 容器生命周期管理:docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
- 容器操作命令: docker [ps|inspect|top|attach|wait|export|port|rename|stat]
- 镜像仓库命令: docker [login|pull|push|search]
- 本地镜像管理: docker [build|images|rmi|tag|save|import|load]
- 容器资源管理: docker [volume|network]
- 系统日志信息: docker [events|history|logs]
镜像常用管理命令
docker image 获取镜像管理命令
| 命令 | 作用 |
|---|---|
| docker images | 列出本地镜像 |
| docker search 镜像名 | 搜索镜像 |
| docker pull 镜像名:版本 | 拉取镜像 |
| docker rmi 镜像名:版本 | 删除镜像 |
列出本地镜像:docker images
常用选项:-q 只显示镜像ID
docker images
>输出详情介绍: > >REPOSITORY 镜像仓库源 >TAG 镜像的标签 >IMAGE ID 镜像的ID >CREATED 镜像更新时间 >SIZE 镜像大小
搜索镜像:docker search
常用选项:
- **–no-trunc 😗*显示完整的镜像描述
docker search centos
> 输出详情介绍: > > NAME 镜像仓库源的名称 > DESCRIPTION 镜像的描述 > STARS 点赞数量,表示喜欢的意思 > OFFICIAL 是否 docker 官方发布 > AUTOMATED 自动构建(表示个人发布)
下载镜像:docker pull
docker pull nginx:1.22.0
> 提示:下载镜像如果不指定镜像版本则是最新版本,如需指定版本可从docker hub查看对应版本信息在进行下载
查看镜像:docker images
docker images
容器常用管理命令
| 命令 | 作用 |
|---|---|
| docker ps | 查看正在运行容器 |
| docker ps -a | 查看所有容器 |
| docker run 参数 | 创建容器 |
| docker exec 容器ID/容器名 | 进入容器 |
| docker stop 容器名/容器ID | 停止容器 |
| docker rm 容器名/容器ID | 删除容器 |
| docker start 容器名/容器ID | 启动被停止的容器 |
| docker restart 容器名/容器ID | 重启容器 |
| docker kill 容器名/容器ID | 强制停止正在运行的容器(一般不用,除非卡了) |
| docker inspect 容器名称 | 查看容器元数据信息 |
| –restart=always | 启动容器时设置容器随机自启 |
| docker update --restart=always 容器名/容器ID | 容器启动后设置容器随机自启 |
| docker logs 容器名/容器ID | 查看容器日志信息 |
创建容器:docker run 参数...
常用选项:
- -id :指定容器在后台运行,并返回容器ID
- **–name=“名称” 😗*为容器指定一个名称
- **-p 😗*指定端口映射,格式为:主机(宿主)端口:容器端口
- **–dns 8.8.8.8 😗*指定容器使用的DNS服务器,默认和宿主一致
- **-h “名称” 😗*指定容器的hostname
- **-e username=“ritchie” 😗*设置环境变量
- **-m 😗*设置容器使用内存最大值
- **–net=“bridge” 😗*指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
- **–link=[] 😗*添加链接到另一个容器
- –expose=[]: 开放一个端口或一组端口
- **–volume , -v 😗*绑定一个数据卷
创建容器:docker run 参数
docker run -id --name=nginx nginx:1.22.0
查看容器信息:
docker ps 通过-it创建的容器退出后自动关闭
docker ps -a 查看所有容器,包括未运行的
查看容器元数据信息
docker inspect nginx
进入容器:docker exec -it 容器ID/容器名
docker exec -it nginx /bin/bash
停止容器:docker stop 容器名/容器ID
docker stop nginx
启动被停止的容器:docker start 容器名/容器ID
docker start nginx
启动被停止的所有容器:ps -aq 获取所有容器ID
docker start `docker ps -aq`
删除容器:docker rm 容器名/容器ID
常用选项: -f 强制删除(无需停止容器)
docker rm nginx
删除所有容器:ps -aq 获取所有容器ID
docker rm `docker ps -aq`
练习:通过Docker部署Nginx的web应用并实现浏览器访问:
创建容器并实现端口映射(默认容器无法被外网访问)
docker run -d --name=ngx_v1 --restart=always -p 81:80 nginx:1.22.0
> **-p 😗*指定端口映射,格式为:宿主机端口:容器端口 > > --restart=always #容器退出后,自动启动容器(一直)
浏览器访问:http://server_ip:port
第二章:Docker容器数据卷
数据卷概述
容器数据卷可以是宿主机中的一个目录或文件,通过将目录或文件挂载到容器中,可解决容器中的数据与宿主机之间立刻同步
数据卷可以间接的将外部主机文件传输到宿主机数据卷目录,可解决容器与外部主机之间文件交换的问题
一个数据卷目录可以同时挂载多个容器,解决多容器之间文件交换的问题
数据卷可以解决容器删除后容器数据丢失的问题,实现数据持久化
配置容器数据卷
-
在创建启动容器时,使用-v参数设置数据卷
-
docker run 参数 -v 宿主机目录/文件:容器内目录/文件…
-
目录必须是绝对路径
-
如果目录不存在,会自动创建
Docker部署MySQL
案例:在Docker容器中部署MySQL数据库,并通过外部MySQL客户端管理MySQL数据库。
步骤:
- 下载MySQL5.7镜像文件
- 准备所需的数据卷目录
- 拷贝容器中数据到宿主机数据卷目录
- 创建MySQL并挂载数据卷
下载MySQL镜像文件
docker pull mysql:5.7
创建数据卷目录
mkdir -p /docker_mysql/
创建容器拷贝配置文件目录到/docker_mysql目录
> - 格式1:docker cp 容器名:目录/文件 宿主机目录 #将容器中文件或目录拷贝到宿主机 > - 格式2:docker cp 宿主机目录/文件 容器名:目录 #将宿主机文件/目录拷贝到容器中
docker run -id --name=mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker cp mysql:/etc/mysql/ /docker_mysql
删除MySQL容器
docker rm -f mysql
创建MySQL容器并挂载数据卷
docker run -id --name=lnmp_mysql -p 3306:3306 \
-v /docker_mysql/mysql/:/etc/mysql \
-v /docker_mysql/data/mysql:/var/lib/mysql \
-v /docker_mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
进入数据库授权远程连接用户访问
docker exec -it lnmp_mysql /bin/bash
root@9c8c0dccccee:/# mysql -uroot -p123456
mysql> grant all on *.* to root@"%" identified by "123456";
Docker部署Nginx
案例:在Docker容器中部署Nginx的web服务,并通过外部浏览器访问Nginx。
下载Nginx镜像
docker pull nginx:1.22.0
创建数据卷目录
mkdir -p /docker_nginx/conf
创建容器拷贝配置文件目录到/docker_nginx目录
docker run -id --name=nginx -p 80:80 nginx:1.20.2
docker cp nginx:/etc/nginx /docker_nginx/conf
删除nginx容器
docker rm -f nginx
创建nginx容器并挂载数据卷
docker run -id --name=lnmp_nginx -p 80:80 \
-v /docker_nginx/conf/:/etc/nginx \
-v /docker_nginx/html:/usr/share/nginx/html \
-v /docker_nginx/logs/:/var/log/nginx \
nginx:1.20.2
浏览器访问容器Nginx服务:http://server_ip
Docker部署tomcat
案例:在Docker容器中部署tomcat,并通过外部浏览器访问tomcat。
下载tomcat镜像文件
docker pull tomcat:8.5-jre10-slim
创建数据卷目录
mkdir /docker_tomcat
拷贝容器数据
docker run -id --name=tomcat tomcat:8.5-jre10-slim /bin/bash
docker cp tomcat:/usr/local/tomcat /tomcat
#停止tomcat容器并删除
docker stop tomcat && docker rm tomcat
创建容器挂载数据卷
docker run -id --name=tomcat -p 8080:8080 \
-v /tomcat/tomcat:/usr/local/tomcat \
tomcat:8.5-jre10-slim
浏览器访问容器tomcat服务:http://server_ip:8080
第三章:Docker File定制镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.使用 Dockerfile 指令来创建一个新的镜像。
2.将已经创建的容器转为镜像,并且提交这个镜像。
DockerFile定制镜像
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,每条指令构建一层,最终构建出一个新的镜像。
| 关键字 | 作用 | 备注 |
|---|---|---|
| FROM | 指定父镜像 | 指定dockerfile基于哪个镜像构建 |
| MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
| LABEL | 标签 | 用来标明dockerfile的标签,可以使用label代替Maintainer,最终都是在docker image基本信息中可以查看 |
| RUN | 执行命令 | 容器创建过程中执行命令,默认是/bin/sh,格式:RUN 命令 或者 RUN [“命令”,“参数1”,“参数2”] |
| CMD | 容器启动命令 | 提供启动容器时候的默认命令,和ENTRYPOINT配合使用,格式:CMD 命令 参数1 参数2 或者 CMD [“命令”,“参数1”,“参数2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | 构建镜像时,复制文件到镜像中,COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。 |
| ADD | 添加文件 | ADD指令更擅长读取本地tar文件并解压缩。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。 |
| ENV | 环境变量 | 指定构建时的环境变量,后续的指令中,就可以使用这个环境变量。 |
| ARG | 构建参数 | 与 ENV 作用一致,如果有ENV,那么ENV的相同名字的值始终覆盖ARG的参数 |
| VOLUME | 定义外部可以挂载的数据卷 | 指定镜像中的目录可以挂载到数据卷目录,启动容器时用-v绑定,格式:VALUME [“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行时监听的端口,启动容器时,使用-p绑定暴露的端口,格式:EXPOSE 80 或者 EXPOSE 80/tcp |
| WORKDIR | 工作目录 | 指定容器内部的工作目录,作为用户首次登录容器时停留的目录,如果没有创建则自动创建,如果指定/,使用的是绝对地址,如果不是/开头,那么是在上一条workdir的路径的相对路径 |
| USER | 指定执行用户 | 指定构建或者启动时镜像时,用户在RUN,CMD,ENTRYPONT执行时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的命令,基本上没用,应为很多时候,应用本身自带健康检查机制 |
| ONBUILD | 触发器 | 当存在触发器关键字的镜像作为基础镜像时,当执行FROM完成之后,会执行ONBUILD的命令,但是不影响当前镜像,用处也不大 |
| STOPSIGNAL | 发送信号到宿主机 | 该信号指令设置将发送到容器的系统调用信号以退出 |
| SHELL | 执行执行脚本的shell | 指定执行 RUN,CMD,ENTRYPOINT执行命令时,使用的shell |
构建CentOS镜像
案例1:通过dockerfile自定义CentOS7镜像
- 定义CentOS默认登录目录为/root目录
- 可以使用vim命令
实现步骤:
- 定义父镜像:FROM centos:7
- 定义作者信息:MAINTAINER zhangsan@example.com
- 执行安装常用工具:RUN
- 定义默认登录目录:WORKDIR /root
- 定义容器启动执行命令:CMD /bin/bash
编写Dockerfile文件(文件名自定义):
mkdir centos_dockerfile && cd centos_dockerfile
vim dockerfile
FROM centos:7
MAINTAINER yesir@163.com
RUN yum -y install vim wget \
&& wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
&& wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
WORKDIR /root
CMD /bin/bash
构建镜像格式:docker build -f dockerfile文件 -t 镜像名称:镜像标签 .
docker build -f ./dockerfile -t centos7:v1 .
> 注:最后的 . 代表本次执行的路径,如需将当前路径的文件打包到镜像中,docker build 会将路径下的所有内容打包到镜像(不要放无用的文件)。
创建容器验证
docker run -it --name=centos-test centos7:v1 /bin/bash
构建Nginx镜像
案例1:通过dockerfile自定义Nginx镜像
- 定义Nginx网页
实现步骤:
- 定义父镜像:FROM nginx:1.22.0
- 定义Nginx网页
mkdir ngx_dockerfile && ngx_dockerfile
vim dockerfile
FROM nginx:1.20.2
ADD . /usr/share/nginx/html
#上传项目后构建镜像
docker build -t ngx:choujiang .
镜像转为压缩文件
案例:将前边构建的镜像转为压缩文件,以便于保存和传输。
格式:docker save -o 压缩文件名称 镜像名称:版本号
docker save -o ngx_choujiang.tar ngx:choujiang
压缩文件转为镜像
案例:将将前边制作的镜像删除在进行导入验证。 格式:docker load -i 压缩文件名称
docker load -i ngx_choujiang.tar
创建容器验证
docker run -id --name=ngx_choujiang -p 80:80 ngx:choujiang
容器转为镜像
容器转为镜像时,容器的配置或数据也会被保存到新镜像文件中,但是容器数据卷不会被保存到新镜像中,转为镜像时,容器可以是运行状态,也可以是退出状态。
命令格式:docker commit 容器ID/容器名称 镜像名称:版本号
docker commit ngx_choujiang ngx_choujiang:v1
第四章:Docker容器网络
Docker四种网络模式
1. bridge网络(默认)
docker使用Linux虚拟网络技术在宿主机虚拟一个名为docker0的虚拟网桥,docker启动一个容器时会根据docker0网桥的网段分配给容器一个IP地址(可通过:docker inspect 容器名/ID 查看容器地址)
同时docker0网桥作为每个容器的默认网关,同一宿主机内的容器都接入同一个docker0网桥,这样主机上的所有容器就通过docker0直接通信。
当创建一个容器的时候,同时也会创建一个veth开头名称接口,这个接口对接容器内的eth0网卡,通过这种方式,主机可以跟容器通信。
使用需求:当需要多个容器在同一个docker主机上进行通信时,使用桥接模式(bridge)最佳。
查看容器网络
docker inspect 容器名称
...
"bridge": {
2. Host模式
在Host类型的网络中,容器不会虚拟出自己的网卡,而是与物理机共享网络,拥有物理机的IP地址和网卡信息,而容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
Host最大的优势就是网络性能比较好,不需要进行NAT,可以直接使用宿主机的IP地址/端口与外界通信。
使用需求:当容器需要与宿主机在同一网络,但又希望隔离容器的其他方面时,使用Host网络最佳。
创建容器并指定Host模式,格式:--net=host
> 提示:此模式无法通过-p为容器做端口映射,容器内的服务直接占用宿主机端口。
docker run -id --name=ngx_host --net=host nginx:1.22.0
docker inspect ngx_host
...
host": {
3. Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个网络,除了网络方面,其他的如文件系统、进程等还是隔离的,两个容器的进程可以通过 lo(回环) 网卡设备通信。
4. None模式
使用none模式,docker并不为容器进行任何网络配置,也就是说,这个容器没有网卡、IP、路由等信息,需要我们自己为容器添加网卡、配置IP等。
Docker自定义网络
自定义容器网络可使在同一个宿主机的容器使用不同的网络,避免相互影响。
查看所有docker网络:docker network ls
docker network ls
NETWORK ID NAME DRIVER SCOPE
网络 ID 网络名称 网络模式 作用域
docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.254 mynet
create #创建网络
--driver #定义网络模式
--subnet #定义地址段
--gateway #指定网关
mynet #自己定义的网络名称
查看网络详细信息:docker network inspect 网络名称/ID
docker network inspect mynet
创建容器使用自定义网络
docker run -id --name=ngx_mynet --net=mynet --ip 172.16.0.10 -p 81:80 nginx:1.22.0
--net=网络名称
--ip IP地址 #定义容器IP,如果不自定义,将默认分配
查看容器详细信息
docker inspect ngx_mynet
容器加入网络:docker network connect 网络名 容器名
> 自定义网络和默认网络是不通的,这样就起到了隔离的作用,那如果我们想要打通这两个网络,使用 connect 将容器加入到该网络
查看容器网络
docker inspect ngx_choujiang
...
Networks": {
"bridge": {
docker network connect mynet centos01
docker inspect centos01
...
"bridge": {
"mynet": {
提示:打通后不同网络之间的容器就可以互相通信
删除网络:docker network rm 网络名
docker network rm mynet
> 提示:如果有其他容器使用该网络,需要先清理容器。
Docker容器互联 --link
容器之间如果想要通过容器名称进行通信的话,可以通过–link来实现容器互联(单方向互联)
格式:--link name:alias
- name表示要链接的容器的名称
- alias是别名(也可以不指定别名)
创建centos01容器
docker run -id --name=centos01 centos:7
创建centos02容器,并与centos_1互联
docker run -id --name=centos02 --link centos01 centos:7
进入容器验证(注意:是单方向互联)
docker exec -it centos02 /bin/bash
ping centos01
查看容器的/etc/hosts文件,当容器创建并启动后,会自动在hosts文件里添加解析
cat /etc/hosts
172.17.0.3 centos01 c64ac9f7fbb0
Docker容器跨主机通信
docker默认的自定义网络的类型就是bridge,但是跨主机的时候bridge就明显不可用的。
原生的docker跨主机通信方案有macvlan和overlay两种。
1.Macvlan网络?
macvlan 本质上是一种网卡虚拟化技术,首先使宿主机物理网卡工作在 “混杂模式”,这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。
>使用Macvlan需要注意: > 容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络变多,广播包占比快速升高而引起的网络性能下降问题;
2.Overlay网络
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密(在docker swarm集群环境overlay是最佳选择)因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
> 字面意思就是叠加的网络,指的就是在物理网络层上再搭建一层网络(称为逻辑网)他具有物理网络的所有特性,跟物理网络一模一样。 >
Overlan环境准备
| 主机名 | IP地址 | 角色 |
|---|---|---|
| docker01 | 自定义 | docker主机 |
| docker02 | 自定义 | docker主机 |
| consul | 自定义 | consul主机 |
注:每个节点安装Docker服务,每台宿主机的hostname必须不同。
运行consul服务
Overlay 网络需要一个 key value分布式数据库来保存网络状态信息,而Consul、Etcd、ZooKeeper都是docker支持的数据库类型,我们这里使用consul。
在consul主机执行如下命令(提前安装好docker)
[root@consul ~]# docker run -id -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
解释:
--server -bootstrap #指定运行模式(该模式指定本机为server端)
--h #设置容器主机名
--restart always #设置容器随机自启
节点加入consul
修改/usr/lib/systemd/system/docker.service文件,将文件中的ExecStart参数替换成如下参数(根据自己的环境修改consul地址及网卡名称)
> 使得每一台都通过本机的2376(docker监听端口)端口被转发到192.168.0.12:8500,consul收集存储并使用这些信息实现网络一致。
[root@consul ~]# vim /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.0.22:8500 --cluster-advertise=ens32:2376
解释:
--cluster-store #指定consul地址
--clusteradvertise #指定本机网卡及端口
重启服务
[root@consul ~]# systemctl daemon-reload && systemctl restart docker
直接将配置文件拷贝到docker01与docker02主机即可
[root@consul ~]# scp /usr/lib/systemd/system/docker.service root@192.168.0.10:/usr/lib/systemd/system/docker.service
[root@consul ~]# scp /usr/lib/systemd/system/docker.service root@192.168.0.11:/usr/lib/systemd/system/docker.service
docker01重启服务
[root@docker01 ~]# systemctl daemon-reload && systemctl restart docker
docker02重启服务
[root@docker02 ~]# systemctl daemon-reload && systemctl restart docker
访问consul
最后我们可以通过浏览器访问consul服务:http://server_ip:8500/

不同主机的docker已经添加到了一起。
创建Overlan网络
在任意一个节点创建一个网络,我们在docker创建一个网络
[root@docker01 ~]# docker network create -d overlay myovernet
[root@docker01 ~]# docker network inspect myovernet
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
提示:网络默认使用的10.0.0.0/24网段,如果需要自定义网络地址通过下边命令创建(别跟宿主机在同一个网络,容易发生地址冲突)
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 myovernet
验证Overlan网络
这时候每一个节点都会有这个网络
[root@docker02 ~]# docker network ls
60210366228b myovernet overlay global
consul主机查看
[root@consul ~]# docker network ls
60210366228b myovernet overlay global
docker01、docker02创建容器测试跨主机通信
[root@docker01 ~]# docker run -it --name=c01 --net=myovernet centos:7 /bin/bash
[root@docker02 ~]# docker run -it --name=c02 --net=myovernet centos:7 /bin/bash
测试连通性:docker自定义的网落是自带域名解析的,所以直接ping名字
[root@097d21377fcc /]# ping c01
[root@097d21377fcc /]# ping c02
查看容器IP
[root@097d21377fcc /]# hostname -I
10.0.0.2 172.18.0.2
注:10.0.0.2是容器内部的地址,172.18.0.2是容器与宿主机之间的网关,如果宿主机可以访问外网,容器借助该网关转换成宿主机IP访问外网。
第五章:Docker资源限额
内存限额
大多数的场景要对容器的运行内存进行限制,防止使用过多的内存。
案例:创建一个centos容器,并指定内存资源为1G
格式:-m 或 --memory
[root@docker01 ~]# docker run -id --name=centos01 -m 1G centos:7
通过容器元数据过滤内存信息
[root@docker01 ~]# docker inspect centos01 | grep "Memory"
"Memory": 1073741824 #单位是Byte(字节)
也可以在容器的/sys/fs/cgroup/memory/memory.limit_in_bytes文件中查看
CPU限额
大多数的场景要对容器的CPU利用率进行限制,防止使用过多的CPU。
案例:创建一个centos容器,并指定分配1核心CPU资源
格式:--cpuset-cpus
[root@docker01 ~]# docker run -id --name=centos02 --cpuset-cpus 1 centos:7
通过容器元数据过滤CPU信息
[root@docker01 ~]# docker inspect centos2 | grep "CpusetCpus"
"CpusetCpus": "1",
第六章:Docker Compose
Docker Compose 是一款单机版容器编排工具,遵循 YAML 文件形式来创建或启动所有的容器
> 提示:现在主流的容器编排工具是Kubernetes(K8s)
Docker Compose 使用的步骤:
-
docker-compose.yml 定义构成应用程序的服务
-
执行 docker-compose up 命令来启动
Compose部署wordpress
案例:通过Docker Compose部署个人的wordpress
#下载docker-compose二进制文件
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#添加执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version
创建Compose目录
[root@docker01 ~]# mkdir wordpress && cd wordpress
创建docker-compose.yml文件
[root@docker01 wordpress]# cat docker-compose.yml
version: '3' #docker-compose的版本,目前3为最新版本
services: #定义服务
db: #容器名称
image: mysql:5.7 #容器镜像,如果不存在会自动下载
volumes: #容器数据卷
- ./db_data:/var/lib/mysql #./当前目录:容器目录
ports: #暴露端口
- "3306:3306" #宿主机端口:容器端口
restart: always #容器随机自启
environment: #定义一些容器内部环境变量
MYSQL_ROOT_PASSWORD: somewordpress #数据库密码
MYSQL_DATABASE: wordpress #数据库
MYSQL_USER: wordpress #用户名
MYSQL_PASSWORD: wordpress #密码
wordpress: #容器名称
depends_on: #容器排序,表示db容器优先
- db
image: wordpress:latest
volumes:
- ./web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes: #卷挂载路径
db_data:
web_data:
docker-compose 运行服务(检查其他容器占用的端口,避免端口冲突)
[root@docker01 wordpress]# docker-compose up -d
-d #后台运行
访问wordpress:http://server_ip/
docker-compose 关闭服务
[root@docker01 wordpress]# docker-compose down
第七章:Docker私有仓库
Docker仓库概述
Docker官方的Docke rhub是一个公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把自己的镜像推送上去,但有时候我们的服务器无法访问互联网,或者不希望将自己的镜像放到公网中,那么我们可以自己搭建私有仓库来存储镜像。
Docker 官方提供了一个registry镜像来搭建私有仓库,只需把镜像下载下来,运行容器并暴露5000端口(registry服务默认监听的是5000端口)就可以使用了。
创建私有仓库
[root@docker01 ~]# mkdir /registry
[root@docker01 ~]# docker run -d --name registry -p5000:5000 \
-v /registry/:/var/lib/registry \
--restart=always \
registry
注:/var/lib/registry/ 目录来实现数据的持久化
访问registry仓库
通过浏览器访问:http://server_ip:5000/v2/_catalog
Docker添加仓库
在 /etc/docker/daemon.json 文件中添加仓库地址及端口
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://d3p1s1ji.mirror.aliyuncs.com"],
"insecure-registries": ["仓库服务器IP:5000"]
}
重启docker
[root@docker01 ~]# systemctl restart docker
为镜像打标签
为什么要打标签?如果镜像是上传到docker hub默认是不需要为镜像打标签,应为默认走的就是公共仓库(docker hub),如果是上传到本地私有仓库,那么标签是为了指定本地私有仓库的地址。
语法:docker tag 镜像名:tag 仓库地址:5000/镜像名:tag
[root@docker01 ~]# docker tag choujiang:v1 192.168.0.20:5000/choujiang:v1
[root@docker01 ~]# docker images
注:当你对源镜像打标签后,原镜像与新镜像ID号是相同的,删除镜像时如果按照镜像ID删除,则相同ID的所有不同标签的镜像也全部删除。
上传镜像到私有仓库
格式:docker push 镜像名:tag
[root@docker01 ~]# docker push 192.168.0.20:5000/choujiang:v1
浏览器访问:http://server_ip:5000/v2/_catalog
拉取仓库镜像至本地
> 先删除本地同名镜像文件在进行拉取
[root@docker01 ~]# docker pull 192.168.0.20:5000/choujiang:v1
私有仓库Harbor
Docker官方提供了Registry镜像仓库,但是Registry的功能相对简陋,Harbor是VMware公司提供的一款镜像仓库,提供了权限控制、分布式发布、强大的安全扫描与审查机制等功能
Harbor 私有仓库,它以 Registry 为基础,提供了对用户友好的管理界面,可以帮助我们快速搭建一个企业级的 Docker Registry 服务。
Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 进行部署。
Harbor优势
- 基于角色控制:有管理员与普通用户,可赋权普通⽤户,比如只能上传和下载,可根据项⽬来进⾏操作和管理。
- 基于镜像的复制策略:也与权限相关,比如有只⼀些⽤户与组才能对此项⽬进⾏相对应的操作。
- ⽀持LDAP/AD域控制:比如南京去下载北京harbor私有仓库的镜像,两端打上局域网的地址,连接在一块,数据信息的传输通过⼀条隧道,会通过两层加密,第⼀层为隧道加密,第⼆层为数据加密,安全可靠。
- 图像删除和垃圾收集:即回收站机制。
- 图形UI:具有统计功能,比如访问量与镜像下载热度。
安装 harbor仓库
#下载harbor离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.5.1/harbor-offline-installer-v2.5.1.tgz
#解压harbor
tar xf harbor-offline-installer-v2.5.1.tgz -C /
#创建配置文件
cd harbor/ && mv harbor.yml.tmpl harbor.yml
#修改配置文件中的如下内容
vim harbor.yml
#上述内容省略...
hostname: 192.168.0.20 指定Harbor主机地址
http: #访问方式为http(不用修改)
port: 80 #默认端口(不用修改)
#https: 注释https访问方式(需要证书才可以使用)
# port: 443 注释端口
# certificate: /root/harbor/6864844_kubemsb.com.pem 注释证书文件
# private_key: /root/harbor/6864844_kubemsb.com.key 注释证书文件
harbor_admin_password: 12345 访问密码
执行预备脚本(下载harbor所需的镜像文件)
# ./prepare
执行安装脚本
# ./install.sh
...
✔ ----Harbor has been installed and started successfully.----
验证运行情况
# docker ps
登录到Harbor:http://server_ip
Harbor使用流程
1)创建私有仓库
2)修改/etc/docker/daemon.json文件,指定Harbor地址
3)上传镜像到Harbor仓库中
3)下载镜像验证仓库
[root@docker01 harbor]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://d3p1s1ji.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.0.20"]
}
#重启docker
[root@docker01 harbor]# systemctl restart docker
#重新启动Harbor服务(默认它不会跟着docker重启)
[root@docker01 harbor]# docker-compose down
[root@docker01 harbor]# docker-compose up -d
上传镜像到Harbor
#先通过命令行登录到Harbor(应为我们创建的仓库是私有的,需要用户认证)
[root@docker01 harbor]# docker login 192.168.0.20
Username: admin
Password: 12345
#按照提示修改镜像标签
docker tag nginx:1.22.0 192.168.0.20/test/nginx:1.22.0
#上传镜像
docker push 192.168.0.20/test/nginx:1.22.0
#下载镜像
docker pull 192.168.0.20/test/nginx:1.22.0
第八章:Prometheus容器监控
Prometheus介绍
Prometheus(普罗米修斯)基于Go语言开发,是一套开源且免费的监控系统。
Prometheus于2016年加入CNCF(云原生基金会)成为继Kubernetes之后的第二个托管项目,目前主要应用在云原生与容器领域的监控解决方案。
Prometheus使用时序数据库TSDB(Time Series Database)存储指标数据,既指标信息与记录的时间戳一起存储的特点。
项目托管:https://github.com/prometheus
Prometheus特点
作为新一代的监控系统框架,Prometheus具备以下特点:
- 基于HTTP的 pull(拉取)方式采集指标数据,利用TSDB(时序数据库)存储指标数据
- PromQL 作为TSDB数据库的灵活查询语言,可完成复杂的查询操作
- P
871

被折叠的 条评论
为什么被折叠?



