Docker

docker简介

注:本文所有笔记均记录自B站UP主 狂神说 的学习视频。
https://www.bilibili.com/video/BV1og4y1q7M4?p=1

Docker是一个开源的容器引擎,基于LXC容器技术,使用GO语言开发。
Docker采购C/S架构,其可以轻松的为任何应用创建一个轻量级、可移植的、自给自足的容器。简单来说:Docker就是一种快速解决生产问题的技术手段,可以使用Docker构建项目运行所依赖的环境。
容器化技术

  • 容器化技术不是模拟的一个完整的操作系统。(与虚拟机技术区分)。
  • 容器内的应用直接运行在宿主机内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了。
  • 每个荣期间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。

Docker的优势:

  • 应用更快速的交付和部署。
  • 更便捷的升级和扩缩容。
  • 更简单的系统运维。
  • 更高效的计算资源利用。

Docker的基本组成

  • 镜像(image)
    docker镜像就好比是一个模板,可以通过这个模板来创建容器。通过镜像可以创建多个容器。最终服务运行或项目运行就是在容器中。
  • 容器(container)
    docker利用容器技术,独立运行一个或者一组应用。通过镜像来创建。
  • 仓库(repository)
    存放镜像的地方。分为公有仓库和私有仓库。公有仓库:Docker Hub(官方),阿里云。。。

Docker安装

# 1.卸载旧的版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2.需要的安装包
sudo yum install -y yum-utils

# 3.设置镜像仓库(推荐使用阿里云仓库)
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# (可选步骤)更新yum软件包索引
yum makecache fast

# 4.安装docker。 docker-ce 社区版 docker-ee 企业版
sudo yum install docker-ce docker-ce-cli containerd.io

# 5.启动docker
sudo systemctl start docker

# 6.验证是否安装成功
docker verison
# 或
sudo docker run hello-world

# 7.查看下载的镜像
docker images   # 会展示出hello-world这个镜像。

卸载docker

# 1.卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
sudo rm -rf /var/lib/docker    # /var/lib/docker  docker的默认工作路径。
sudo rm -rf /var/lib/containerd

Docker底层原理

Docker是一个C/S结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。
DockerServer接收到 Docker-Client的指令,就会执行这个命令。

Docker命令

在这里插入图片描述

# 帮助命令
docker version
docker info
docker [命令] --help
镜像命令
docker images  # 查看本地镜像信息
docker search name [--filter] # 搜索镜像 可根据filter来进行过滤。
docker pull name[:tag]  # 下载镜像。其中tag为版本号,如果不写,默认为最新。
docker rmi -f imageid  # 删除指定的镜像。
容器命令
# 容器启动命令或者说容器创建命令,从镜像实例化出一个容器。
docker run [可选参数] imagename
# 常用可选参数说明:
--name="Name"   # 容器命名   mysql01  mysql02 ..
-d              # 后台方式运行
-it             # 使用交互方式运行,进入容器查看内容
-p              # 指定容器的端口。
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口   常用
    -p 容器端口
-P              # 大写字母P,随机指定端口

# 从容器交互界面退回主机
exit   # 交互台输入。退出并停止容器。
Ctrl+p+q   # 组合键,容器不停止退出
# 列出运行的容器
docker ps    # 列出正在运行的容器。
# 常用可选参数说明:
-a           # 正在运行容器和历史容器运行记录。
-n=?         # 显示最近创建n个的容器
-q           # 只显示容器的编号

# 删除容器
docker rm 容器id      # 删除指定容器,不能删除正在运行的容器,如果要强制删除,使用 docker rm -f
docker rm -f $(docker ps -aq)   # 删除所有容器,包括正在运行的容器。

# 启动和停止容器操作。
docker start 容器id     # 启动容器,和run作区分,start需要先有一个实例化的容器。
docker restart 容器id   # 重启容器
docker stop 容器id      # 停止当前正在运行的容器
docker kill 容器id      # 强制停止容器
其他常用命令
# 后台启动容器
docker run -d centos
# 这里要注意一点,docker容器在使用-d 后台运行的时候,必须要有一个前台进程,docker发现没有前台使用容器,就会自动停止该容器。

# 查看日志
docker logs 容器id

# 查看容器中的进程信息,类似linux中的ps
docker top 容器id

# 查看镜像的元数据
docker inspect 容器id

# 进入当前正在运行的命令
docker exec -it 容器id bashshell
docker attach 容器id 
# 两者的区别:
    # docker exec  进入容器后开启一个新的终端,可以在里面进行操作。
    # docker attach  进入容器正在运行的终端,不会启动新的进程。

# 从容器内拷贝文件到主机上。
docker cp 容器id:容器内部路径 目的主机路径
docket stats   # 查看cpu的状态
可视化

portainer

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

安装启动之后,用浏览器访问8088端口,即可看到可视化操作界面。

Docker镜像讲解

镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时需要的库、环境变量、和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:

  • 从远程仓库下载
  • 自己制作一个镜像DockerFile
镜像加载原理

UnionFS(联合文件系统)
UnionFileSystem 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFileSystem是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们经典的linux\unix系统是一样的,包含boot加载器和内核。当boot加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时的系统也会卸载bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型linux系统中的/dev /proc /bin /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等。

对一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了。因为底层直接用Host的kernel,自己只需要提供rootfs就可以。由此可见,对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

分层理解
commit镜像

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层是通常讲到的容器层,容器之下都叫镜像层。

docker commit  # 提交容器成为一个新的副本。
docker commit -m="提交的描述信息" -a="作者" 容器id  目标镜像名:[TAG]

容器数据卷

docker的理念是将应用和环境打包成一个镜像。通过镜像生成容器来运行。这时候会出现一个问题,应用的数据存储到哪里?如果数据存储到容器中,一旦容器被删除,数据即丢失。这种情况不是我们想要的。实际项目中,需要数据的持久化。

概念

容器之间的一个数据共享技术。Docker容器产生的数据,同步到本地。这就是卷技术。
原理是目录的挂载。将容器内的目录,挂在到主机linux上面。

使用卷技术
docker run -it -v 主机目录:容器内目录 name  # 就是容器启动命令加上-v参数。可以配置多个-v参数。
-v 主机目录:容器内目录
# 启动之后可以通过inspect 命令查看是否挂载成功。查看其中的Mounts信息。
docker inspect 容器id
具名和匿名挂载
# 匿名挂载
docker run -v 容器内路径  ...   # -v后只写容器内路径
# 查看所有的卷volume 情况。
docker volume ls
# 通过上面的命令发现,我们再-v只写容器内路径时,文件也会存储,不过是匿名存储。(一串字符)

# 具名挂载
docker run -v 卷名:容器内路径 ...
# 通过这样的方式可以为卷定义一个名字。

# 所有的docker容器内的卷,在没有指定目录的情况下都是在 /var/lib/docker/volumes/ 目录下。

docker volume inspect 卷名  # 可以查看卷的具体信息。
# 卷使用(-v参数)的三种方式
-v 容器内部路径         # 匿名挂载
-v 卷名:容器内部路径    # 具名挂载
-v 主机目录:容器内目录  # 指定路径挂载,与具名挂载,可以简单的通过是否以/ 开头区分。

# 读写权限设置
# 通过在容器内部路径后加 :ro  或  :rw
# ro,说明这个路径只能通过宿主机操作,容器内部无法操作!
-v 主机目录:容器内部路径:ro
DockerFile

dockerfile 就是用来构建docker 镜像的构建文件。dockerfile就是一个命令脚本文件。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

# 创建一个dockerfile 文件,名字可以随机,建议使用dockerfile
# 文件中的内容,指令(大写) 参数(小写)
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end------"
CMD /bin/bash
数据卷容器

多个容器间进行数据卷共享。

# 使用 --volumes-from 参数
docker run -it --name 容器名1 --volumes-from 容器名2 镜像名
# 容器名1 通过 --volumes-from 的挂载方式,继承了容器名2 的数据卷。这时候,这个数据卷被两个容器共享。容器名2 被称为 数据卷容器。

# 当数据卷被共享时,只要有一个容器还在使用这个数据卷,其他容器都停止并删除,数据卷依然存在。内容被拷贝到剩下的容器中。
# 上面这个特性多用于数据备份。

数据卷容器的生命周期,一直到没有容器使用为止。但是在我们创建第一个数据卷时,如果持久化到了本机,则数据一直存在。

DockerFile

dockerfile 就是用来构建docker 镜像的构建文件。dockerfile就是一个命令脚本文件。
构建步骤

  • 编写一个dockerfile 文件
  • docker build 命令构建成为一个镜像。
  • docker run 运行镜像
  • docker push 发布镜像
DockerFIle构建过程

基本知识

  • 每个保留关键字(指令)都必须是大写字母。
  • 执行从上到下顺序执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交。
DockerFile指令
FROM        # 基础镜像,一切从这里开始构建
MAINTAINER  # 镜像是谁写的。一般是姓名+邮箱
RUN         # 镜像构建的时候需要运行的命令
ADD         # 一层一层的添加镜像功能。eg:MySQL,nginx
WORKDIR     # 镜像的工作目录。进入镜像之后的默认目录。
VULOME      # 挂载的目录
EXPOSE      # 暴露端口配置
CMD         # 指定容器启动的时候要运行的命令,只有最后一个回生效,可被替代。
ENTRYPOINT  # 指定容器启动的时候要运行的命令,可以追加命令
ONBUILD     # 当构建一个被继承DockerFile,这个时候就会运行ONBUILD指令。触发指令。
COPY        # 类似ADD,将我们的文件拷贝到景象中。
ENV			# 构建的时候设置环境变量。

Docker Hub中99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来构建。

# 1.编写DockerFile文件。mydockerfile
FROM centos
MAINTAINER dsprain<4@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

# 2.构建镜像
# 官方默认的DockerFIle文件名为 Dockerfile 。当使用这个名字的时候,不需要在用-f 参数进行指定。
docker build -f mydockerfile -t mycentos:0.1 .
# Successfully built c7a14ea84ac8
# Successfully tagged mycentos:0.1

# 3.测试
docker run -it mycentos:0.1

# 4.查看镜像构造历史记录
docker history 镜像id
CMD ENTRYPOINT 区别

CMD

# DokcerFile
FROM centos
CMD ["ls","-a"]

# 构建测试
docker build -f dockerfilename -t imagename:tag

# 运行测试
docker run imageid  # 打印出 ls -a 的输出

docker run imageid -l  # 报错,-l不是命令。

ENTRYPOINT

# DokcerFile
FROM centos
ENTRYPOINT ["ls","-a"]

# 构建测试
docker build -f dockerfilename -t imagename:tag

# 运行测试
docker run imageid  # 打印出 ls -a 的输出

docker run imageid -l  # 打印出 ls -al 的输出
发布镜像

DockerHub

  • 在hub.docker.com 注册账号
  • 在服务器上 docker login -u username (docker logout 退出当前用户)
  • 在服务器上提交自己的镜像 docker push name[:tag]

docker tag 可以对镜像版本进行设置。

阿里云镜像服务

  • 登录阿里云,找到容器镜像服务。
  • 创建命名空间
  • 创建容器镜像
  • 在服务器上登录。docker login -u username aliyunurl
  • 在服务器上提交自己的镜像 docker push name[:tag]

Docker 网络

理解Docker0

1.通过 ip addr 命令,可以查看到当前所有的ip地址。
在这里插入图片描述

  • lo :本机回环ip地址
  • eth0:阿里云内网地址
  • docker0:docker0IP地址

2.测试宿主机是否可以ping通容器内部ip地址。

# 启动一个容器
docker run -d -P --name tomcat01 tomcat
# 查看容器内部ip地址
docker exec -it tomcat01 ip addr
# 在宿主机ping 容器ip
ping ..
# 再查看宿主机的ip地址。
ip addr

原理

  • 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了一个docker,就会有一个网卡docker0。网络使用桥接模式,使用evth-pair技术。
  • 启动容器后,我们查看宿主机ip,发现增加了一对网卡。这就是evth-pair技术带来的。evth-pair 就是一对的虚拟设备接口,它们都是成对出现的,一段连着协议,一段批次相连。这个特性使得evth-pair 充当了一个桥梁,连接着各种虚拟网络设备。

3.测试容器间是否可以连通

# 新建一个容器
docker run -d -P --name tomcat02 tomcat
# 查看新建容器的ip
docker exec -it tomcat02 ip addr
# 从上一个容器中ping新容器的ip
docker exec -it tomcat01 ping ...

结论:Tomcat01和Tomcat02共用的一个路由器,docker0。所有容器在不指定网络的情况下,都是docker0路由,docker会自动给容器分配一个默认的可用ip。

docker network

这个命令可以查看docker 网卡的具体信息。和对网卡进行操作。

- -link

容器停止之后,重新开启,会自动分配一个新的ip。如果希望通过 容器名 来进行容器间的网络互通,需要使用 --link 参数。

# 新建一个容器tomcat03,与tomcat02进行容器名网络互连。
docker run -d -P --name tomcat03 --link tomcat02 tomcat
# 在tomcat03中进行测试
docker exec -it tomcat03 ping tomcat02

注意一个问题,此时,tomcat02 并不能通过此方法访问tomcat03。
这是因为,–link 操作,是tomcat03链接tomcat02,这个链接,是命令对tomcat03 中的 /etc/hosts 文件中对,tomcat02做了映射。而并没有对tomcat02进行修改。
我们再实际操作中,不建议使用–link ,建议使用下面的自定义网络操作。

自定义网络
# 通过 network 命令查看docker网卡信息
docker network ls

网络模式

  • bridge:桥接 docker(默认,自己创建也使用bridge模式)
  • none:不配置网络
  • host: 和宿主机共享网络
  • container:容器网络连通(用的少,局限很大)

测试

# 我们在直接启动启动时,会默认添加一个 --net bridge 信息,这个就是docker0。还可以通过--ip 来指定绑定的ip地址。
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点:默认域名不能访问,--link可以打通连接

# 自定义网络。--driver 网络模式 --subnet 子网掩码 --gateway 网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 查看docker所有的网络。
docker network ls
# 查看刚创建的网络详细信息
docker network inspect mynet

# 创建两个容器,使用刚刚创建的网络服务
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
# 测试两个容器使用 容器名 互连
docker exec -it tomcat-net-01 ping tomcat-net-02
# 发现可以直接ping通。
网络连通
# 测试在默认网络环境 bridge下的容器,和自定网络mynet下的容器 互连。
docker exec -it tomcat01 ping tomcat-net-01
# 结果不能连通

# 测试打通tomcat01 和 mynet网络之间的壁垒
docker network connect mynet tomcat01
# 查看mynet网络信息
docker network inspect mynet
# 发现tomcat01 被添加到了这个网络下,并分配了一个该网段的ip。
# 这时,实现了 一个容器 两个ip的结果。类似阿里云服务器,每个服务器,都有公网,私网两个ip。

# 再次测试tomcat01 ping tomcat-net-01
docker exec -it tomcat01 ping tomcat-net-01
# 发现已经可以互连。
部署redis集群。练习

Docker Compose

简介

Docker compose 定义运行多个容器,轻松高效管理容器。
docker compose 三个步骤:

  • DockerFile
  • docker-compose.yml 文件
  • 启动docker compose

Compose的重要概念:

  • 服务services。容器,应用。
  • 项目project。一组关联的容器。
安装

1.docker compose 命令没有集成在docker中,需要安装。
官方安装地址

curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

国内地址

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.授予执行操作权限

chmod +x /usr/local/bin/docker-compose

3.测试命令

docker-compose version

4.启动命令

docker-compose up [-d]  # 部署项目,-d为后台运行。

5.重新构建项目

docker-compose up --build   # 重新构建
官方提供案例

https://docs.docker.com/compose/gettingstarted/

一个基于flask框架的python 计数器应用。

1.编写应用app.py
2.dockerfile 应用打包为镜像
3.docker-compose yaml文件(定义整个服务,需要的环境。web redis)
4.启动compose项目(docker-compose up)

启动之后,我们可以看到,docker-compose生成了一个自定义网络。通过docker network inspect 命令查看这个网络信息,可以看到redis和应用容器都在这个网段内。所以,redis和应用可以通过容器名进行互联。

docker-compose up命令会在终端前台运行。可以通过ctrl + c停止。也可以在开启一个终端,从yaml文件目录下通过 docker-compose down 命令停止。

docker-compose up -d 后台启动。

yaml规则

官方参考信息:
https://docs.docker.com/compose/compose-file/compose-file-v3/

# 3层
version ""  # compose 版本。和docker版本对应。向下兼容
services:  # 服务
	服务name1:
		#服务配置 docker 容器的配置
		images
		build
		network
		....
	服务2:
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:
实战部署个人博客

https://docs.docker.com/compose/wordpress/

Docker Swarm

集群方式部署。
环境:4台服务器,一主三从。安装好docker。

Swarm官方文档
https://docs.docker.com/engine/swarm/

工作模式

在这里插入图片描述

节点的概念:管理节点,工作节点。所有操作都在管理节点上。管理节点控制工作节点。管理节点间可以互相管理。
Raft:一致性算法

开始搭建集群

1.生成主节点。 init 方法

# 初始化节点
docker swarm init --advertise-addr ip地址 

在这里插入图片描述
执行完命令之后,该机器成为一个管理节点。终端输出,提示了如何继续添加工作节点和管理节点。
2.加入 manager worker节点

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker

# 加入一个节点
docker swarm join
docker swarm join --token SWMTKN-1-4t7qcil16dyrj8qy934u83uyadi01ge2tptkbk5l70vr2f0r67-01vr46ust2u5qmrfyzdwl5g7q 172.18.117.190:2377

# 查看节点列表。只能在管理节点上使用。工作节点不能使用。
docker node ls

# 节点移除
docker swarm leave  # 在要移除的节点机器上使用命令。
Raft:一致性算法

Raft协议:保证大多数节点存活才可以使用。集群 管理(主)节点至少大于3台,最少保证大于1台的主节点可以使用。

弹性,扩缩容。集群。

在swarm 中,一个个容器被当做了一个个服务。
我们在实际项目中,会需要根据情况,动态的对服务进行扩缩容,来实现高可用。(swarm 的 使用重点)
服务在集群中的任意节点都可以访问。

1.创建服务

docker service  # 服务启动命令。用法同 docker run。具有扩缩容,滚动更新,回滚等功能。
docker service create -p 8888:80 --name 服务名 镜像名

# 查看服务
docker service ls   # 服务列表。其中的 REPLICAS 字段为当前服务有多少副本。
docker service ps 服务名
docker service inspect 服务名 

2.动态扩展服务,动态更新服务。

# 方法1
docker service  update --relipcas 10 服务名  # 动态扩缩至10组服务。
# 方法2
docker service scale 服务名=5  # 动态扩缩到5组服务。

# 动态扩展的服务,根据算法分配到任意节点上。

3.移除服务

docker service rm 服务名
概念总结
  • swarm: 集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入(管理,工作。)
  • Node:就是docker的一个节点。多个节点组成集群。
  • service:服务(一个任务),可以在管理节点或工作节点来运行。
  • task:容器内的命令,细节任务。

docker stack

docker secret

docker config

CI/CD-Jenkins

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值