芯が強い人になるESTJ-A

# docker精髓,容器数据卷,DockerFile,Docker网络

IT開発 Tags: 无标签 阅读: 256

容器数据卷

什么是容器数据卷??

应用+环境=打包成一个镜像
需求,数据mysql可以持久化
容器之间,可以有一个数据共享的技术!!!
docker容器中产生的数据,同步到本地,或者云,这样数据不会丢失。
将容器内的目录,挂载到linux上。
截屏2021-08-12 16.15.36.jpg
目的:为了容器的持久化+数据同步操作!!!容器与容器之间,数据共享!

方式一:使用数据卷,命令-v(参考-p,主机服务器端口:容器内端口)

docker run -it -v 主机目录:容器内目录

Mount挂载
查看命令:docker inspect 容器id
截屏2021-08-12 16.24.43.jpg
截屏2021-08-12 16.25.38.jpg

数据同步

容器内部和服务器内部数据同步,双向绑定
截屏2021-08-12 16.49.21.jpg
截屏2021-08-12 16.49.26.jpg
截屏2021-08-12 16.49.31.jpg

实战安装mysql,数据持久化问题data目录

运行容器,需要数据挂载。

mysql--docker hub官方
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-d后台运行
-p 端口号,2个
-v 数据卷挂载同步
-e 环境配置
--name 起一个别名容器名
启动哪个镜像+版本号

[root@iZuf6f34ah9elznexcxb5kZ /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

本机navicat访问docker里面的mysql数据库,端口自定义3310
截屏2021-08-12 18.07.31.jpg

具名挂载,匿名挂载

没有起的名字的,叫匿名挂载
-P随机端口,没有取名字,=匿名挂载
docker run -d -P --name nginx01 -v /ect/nginx nginx

docker volume ls

这里发现,匿名挂载,我们-v只写了容器内的路径,没有写容器外的路径!

local 9ejifjaijaeirjeakdja0093

具名挂载

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
通过-v 卷名:容器内路径

查看一下:docker volume inspect

截屏2021-08-12 18.36.42.jpg

DockerFile

docker file

mkdir创建一个文件,写入脚本,通过脚本创建镜像。
镜像是一层一层的,脚本就是一个一个命令;
每个命令都是一层;

FROM centos

VOLUME ["volume01","volume02"]

CMB echo "====end====="

CMB /bin/bash

查看文件,cat+文件名

[root@iZuf6f34ah9elznexcxb5kZ docker-test-volume]# vim dockerfile1
[root@iZuf6f34ah9elznexcxb5kZ docker-test-volume]# cat dockerfile1
#创建一个dockfile,
#文件中的指令全部大写,参数
#这里的每一个命令,都是一层
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---end---"

CMD /bin/bash

截屏2021-08-12 20.02.31.jpg

docker images;查看所有镜像

截屏2021-08-12 20.03.23.jpg

容器内部多个mysql数据同步

截屏2021-08-12 20.13.29.jpg
--volumes-from继承关系,
截屏2021-08-12 20.16.21.jpg
截屏2021-08-12 20.18.15.jpg
截屏2021-08-12 20.31.03.jpg

docker file构建过程

基础知识:
每个保留关键字,都必须是大写的
截屏2021-08-12 20.43.42.jpg

dockerfile是面向开发的,我们以后发布项目,直接编写dockerfile文件,简单。
截屏2021-08-12 20.56.59.jpg
截屏2021-08-12 20.58.22.jpg

FROM 基础镜像,一切从这里开始构建

MAINTAINER 镜像是谁写的,作者+邮箱

RUN 镜像构建的时候,运行的命令

ADD 步骤,tomcat镜像,添加内容

WORKDIR 镜像的工作目录

VOLUME 挂载的目录

EXPOSE 指定对外暴露的端口号

RUN 奔跑吧。

CMD 指定这个容器启动的时候,只有最有一个会生效。需要运行的命令cmd echo

ENTRYPOINT 指定这个容器启动的时候,可以追加命令

ONBUILD

COPY 将文件copy到镜像中

ENV 设置环境变量

截屏2021-08-12 21.13.41.jpg

Docker网络

容器编排,集群部署

理解,docker0
截屏2021-08-12 21.28.33.jpg
截屏2021-08-12 21.28.39.jpg
截屏2021-08-12 21.31.52.jpg
截屏2021-08-12 21.35.12.jpg

docker 容器到网络

container to a network

docker network connect

截屏2021-08-15 13.42.27.jpg
截屏2021-08-15 13.43.53.jpg

一个容器,2个ip,直接打通

截屏2021-08-15 13.59.48.jpg

企业实战

Redis负载均衡和高可用
截屏2021-08-15 14.04.45.jpg

shell脚本配置6个redis

for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF>/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enable yes
cluster-config-file nodes.conf
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

截屏2021-08-15 14.13.40.jpg

检查无误,开始启动

docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf\
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \

先启动一个,一个一个启动
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

创建集群

redis-cli --cluster create 172.38.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-replicas 1

springboot--docker

截屏2021-08-15 15.25.40.jpg

Docker Compose
Docker Swarm
CI/CD jenkins流水线