Docker基础
Docker概念
Docker是基于GO语言实现的云开源项目,docker的主要目标是“build,ship and run APP,anywhere“也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及用户环境能够做到”一次封装,到处运行“。Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。
集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
安装Docker
Linux安装Docker:
-
curl -fsSL get.docker.com -o get-docker.sh
-
sudo sh get-docker.sh --mirror Aliyun
-
配置docker镜像加速器,在
/etc/docker/
下新建daemon.json
,并且输入镜像地址。如果下载镜像还很缓慢,则用阿里云的镜像(自行百度)。{ "registry-mirrors":[ "https://registry.docker-cn.com" ] }
-
加载docker配置:
systemctl daemon-reload
-
重启docker:
systemctl restart docker
-
查看docker版本:
docker --version
Docker中的三大关键词
- 镜像:好比一个模板,通过该模板可以创建多个容器,比如通过redis镜像可以创建redis的实例。镜像是一个轻量级、可执行的软件包。包含了代码、库和环境变量以及配置文件。docker的镜像实际是由一层一层的文件系统组成。这种层级的文件系统叫unionFS。
- 容器:是一个具体的应用实例,通过镜像来创建,有启动、停止、重启等命令。启动一个容器时,先看本地是否有该镜像,有的话则启动,没有的话会从远程仓库下载后启动,若远程仓库也没有,那么启动会报错。
- 仓库:用来存放各种软件的镜像,本地可以将仓库中的镜像拉去下来进行使用
Docker的常用命令
- 镜像的基本命令
命令 | 说明 |
---|---|
docker images | 显示本地所有的镜像 |
docker search 镜像名 | 查看仓库中有关该镜像的信息 |
docker pull 镜像[:版本号] | 将仓库中的镜像拉取到本地 |
docker rmi 镜像id | 删除镜像 |
docker image rm 镜像id | 删除镜像 |
docker image prune | 删除虚悬镜像 |
- 容器的基本命令
1.用镜像启动docker容器:docker run【参数】 镜像名
参数 | 说明 |
---|---|
- -name 容器名 | 指定容器的名称 |
- -rm | 容器退出后删除容器 |
-d | 后台运行 |
-it | 运行容器后进入容器 |
-p 8080:8080 | 将主机的端口映射到容器 |
- 删除容器:
docker rm 容器id
- 启动已停止的容器:
docker start 容器id
- 重启容器:
docker restart 容器id
- 停止容器:
docker stop 容器id
- 显示正在运行的容器:
docker ps
- 显示所有容器:
docker ps -a
- 删除所有未运行的容器:
docker container prune
- 交互进入容器:
docker exec -it 容器id bash
- 将容器变为镜像:
docker commit 容器id 镜像名
- 将容器的文件拷贝到宿主机:
docker cp 容器名:路径 宿主机路径
- 查看日志:
docker logs 【参数】 容器
参数 | 说明 |
---|---|
-t | 显示时间戳 |
-f | 跟随日志的增加输出 |
–tail number | 显示指定的条数 |
- 查看容器元数据:
docker inspect 容器id
数据卷
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。数据卷由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
挂载分为匿名挂载和具名挂载
- 匿名挂载
语法:-v 容器内目录[:ro或:rw]
默认docker将匿名数据卷存在/var/lib/docker/volumes
中。ro:表示容器内只读,只能操作外部的数据卷;rw是默认的方式,容器内可读可写。 - 具名挂载
语法:-v 卷名:容器目录[:ro或:rw]
或-v 虚拟机目录:容器目录[:ro或:rw]
例:docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql3306 mysql:5.7
数据卷容器:指的是创建一个容器时,挂载的数据为另一个容器所挂载的数据。语法位:--volumes-from 容器名
DockerFile
是一段命令脚本,用来构建docker镜像。
DockerFile文件使用到的指令
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 说明镜像是谁写的 |
RUN | 需要运行的命令 |
ADD | 添加的内容 |
WORKDIR | 指定工作目录,即进入容器后所在目录 |
VOLUME | 指定挂载的数据卷 |
EXPOSE | 指定对外暴露的端口 |
CMD | 容器启动的时候要运行的命令 |
ENTRYPOINT | 启动时要追加的命令 |
COPY | 拷贝文件到镜像 |
ENV | 构建时设置环境变量 |
将DockerFile构建为镜像:docker build -f DockerFile文件名 -t 镜像名:tag .
发布镜像
- 发布到docker-hub
- 注册docker-hub账号
- 在linux中登录:
docker login -u 用户名
,然后输入密码 - 发布镜像:
docker push 账号名/镜像名:tag
- 发布到阿里云
- 登录阿里云,找到容器镜像服务
- 在阿里云创建命名空间
- 创建镜像仓库
- 点击创建的仓库,查看上传的流程
Docker网络
在虚拟机输入ip addr
可以看到docker0
网卡,该网卡就是docker实现网络通信的。启动一个容器,用命令docker exec -it 容器名 ip addr
可以查看当前容器的网卡信息,我的容器信息为4: eth0@if5
。此时再用命令ip addr
查看虚拟机的网络信息,发现多了一个5: veth479ee8d@if4
。这是通过veth-pair来实现的,能够将docker0和容器网络连通。删除容器之后,那么5: veth479ee8d@if4
就会消失。
容器和容器通信原理
启动了tomcat1和tomcat2两个容器。docker exec -it 容器1 ping 容器2的IP
可以实现,但若使用docker exec -it 容器1 ping 容器2的名称
不能ping通。若要实现能用容器名ping通的功能,只需要在启动容器1的时候添加参数--link 容器2
,相当于在容器1的etc/host文件中添加了映射。但是容器2不能ping通容器1的名称。
自定义网络
查看所有的docker网络:docker network ls
网络模式:bridge(网桥模式,默认)、host(与主机共享网络)、none(不配置网络)
创建网络mynet:docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
创建容器的时候,使用--net 网络名
就可以将容器放在该网络下,在同一网络的各个容器可以直接用容器名ping通彼此。
将容器连接到自定义网络上:docker network connect 网络名 容器名
将SpringBoot项目打包成docker镜像
参考部署Eureka:跳转到部署流程
Docker Compose简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker compose的安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
测试安装成功与否:docker-compose -v
,如果显示版本号则说明安装成功
使用docker compose的关键就是编写docker-compose.yml文件。然后使用docker-compose up
启动,用docker-compose down
关闭容器并删除容器。
以下是使用docker-compose启动一些常用容器的流程:
- 安装Nginx:跳转到安装流程
- 安装Zookeeper集群:跳转到安装流程
- 安装redis:跳转到安装流程
- 安装Rabbitmq:跳转到安装流程
- 安装gitlab:跳转到安装流程
- 安装wordpress博客系统:跳转到安装流程
Swarm简介
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。
搭建Swarm集群:
- 准备四台虚拟机,都安装docker
- 第一台初始化
docker swarm init --advertise-addr 虚拟机IP地址
,其变为管理节点 - 查看如何让其他机子变为manager节点或worker节点
3.1 变为manager节点加入集群:docker swarm join-token manager
3.2 变为work节点加入集群:docker swarm join-token worker
- 在其他机子上分别用生成的令牌加入集群即可
- 离开集群:
docker swarm leave
swarm集群的本质用到了raft算法,raft算法可以参考:raft算法详解
用swarm启动服务
- 集群启动一个服务:
docker service create -p 8888:80 --name mynginx nginx
- 查看启动的服务:
docker service ls
,可以看到只有一个副本 - 在每台机器上用命令
docker ps
查看启动的那个副本是否在当前的机器。发现只有其中的一台机器有docker容器,但是此时用集群中任何一个机器的IP+端口号都可以访问nginx - 修改副本个数:
docker service update --replicas 3 mynginx
或者docker service scale mynginx=3
此时用docker ps命令查看其他机器,可以看到一共3台机器启动了nginx,如果再将副本改为1,那么有两台机器的nginx容器会被删除。 - 移除一个服务:
docker service rm mynginx