docker入门到入坟

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资源汇总

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.62C/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数据库。

步骤:

  1. 下载MySQL5.7镜像文件
  2. 准备所需的数据卷目录
  3. 拷贝容器中数据到宿主机数据卷目录
  4. 创建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&gt; 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

> 提示:如果有其他容器使用该网络,需要先清理容器。

容器之间如果想要通过容器名称进行通信的话,可以通过–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/

1653888604350

不同主机的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://Prometheus.io

项目托管:https://github.com/prometheus

Prometheus特点

作为新一代的监控系统框架,Prometheus具备以下特点:

  • 基于HTTP的 pull(拉取)方式采集指标数据,利用TSDB(时序数据库)存储指标数据
  • PromQL 作为TSDB数据库的灵活查询语言,可完成复杂的查询操作
  • P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值