容器数据卷
容器数据卷
将应用环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删除了,删库跑路!需求:MySQL的数据可以存储在本地
容器之间可以有一个数据共享的技术!docker容器中产生的数据,同步到本地
这就是卷技术,目录的挂载,将容器内的目录挂载在Linux上面

总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的
使用数据卷,直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
#测试
# /home/ceshi:主机home目录下的ceshi文件夹 映射:centos容器中的/home /bin/bash:进入容器内
[root@yuan home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#查看目录是否挂载
[root@yuan ~]# docker ps
#新开一个窗口,通过 docker inspect 容器id 查看
[root@yuan ~]# docker inspect c638b856d427

测试文件同步

1、停止容器
2、宿主机修改文件
3、启动容器
4、容器内的数据依旧是同步的
#通过该命令查看关闭的centos选择第一个
[root@yuan home]# docker ps -a


Mysql数据同步
# 获取mysql镜像,如果存在则不需要下载
[root@yuan home]# docker pull mysql:8.0.28
# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的
# 参考官网hub :docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#测试
#注:在远程需要开启3310端口,阿里云
-d 后台运行
-p 端口映射
-v 卷挂载,可以挂载多个
-e 环境配置
-- name 容器名字
[root@yuan home]# 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 mysql03 mysql:8.0.28
3a7d840bfa16a5c4881896d8030d9c2354be9bc7f08056913be72780ee702a6a
# 启动成功之后,我们在本地使用Navicat 来测试一下
# Navicat-连接到服务器的3310--和容器内的3306映射

在本地用Navicat新建名称为test的数据库时候,容器容器也会创建

假设我们将包含mysql的容器删除时,本机也会存在

我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
具名和匿名挂载
#匿名挂载
-v 容器内路径
-P 大P随机端口
#如果发现nginx01创建不了,可以删除以前创建的即可
[root@yuan ~]# docker rm -f nginx01
[root@yuan ~]# docker run -d -P --name nginx01 -v /ect/nginx nginx
#查看所有的volume的情况
[root@yuan ~]# docker volume ls
DRIVER VOLUME NAME
local 86ab6a63b1617157876c89c732aec16a1a94cfb4777b1aec1990d913acc061fb
#这种就是匿名挂载,-v写的是容器内的路径,没有写容器外的路径
#具名挂载
[root@yuan ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
49194ece7439bc26e8f845c1efeee8f36c3229a404b5b5973276f0971364fa60
[root@yuan ~]# docker volume ls
DRIVER VOLUME NAME
local b159b2a9a87b452b4d35c715e83233b8210dc7ddc1d7ea9441ab87bffb9cdb5a
local juming-nginx

所有docker容器内的卷,没有指定目录的情况下在/var/bib/docker/volumes/XXXX/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v容器内路径 #匿名挂载
-v卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载!
拓展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了这个容器权限,容器对我们挂载出来的内容就有了限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法进行操作的
数据卷之DockerFile初始
在home新建以目录为docker-test-volume,在该目录下使用vim编辑器 vim dockerfile1输入一些内容
#创建一个dockerfile文件,建议为dockerfile
#文件中的内 指令(大小) 参数
FROM centos
VOLUME ["volume01"."volume02"] #匿名挂载
CMD echo "----end----"
cmd /bin/bash
#这里每个命令就是镜像的一层
执行该命令
#注:
#/home/docker-test-volume/dockerfile1:文件目录
#yuan/centos:1.0:自定义镜像名
#后面必须加点 .
[root@yuan docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t yuan/centos:1.0 .


启动自己写的容器

查看一下卷挂载的路径
[root@yuan ~]# docker inspect 1ac68659a54a

发现新建的文件已同步


这种方式未来的使用非常多,因为我们自己通常会构建自己的镜像
假设构建镜像的时候没有挂载,需要自己手动挂载镜像 -v 卷名:容器内路径
多个数据进行同步DockerFile初始

启动3个容器,通过我们刚在自己写的镜像启动*


在一个数据卷中新建一个文件,发现docker01的数据同步到了docker02


# 测试 :可以删除容器dcoker01,查看docker02和docker03时候还可以访问这个文件
# 测试结果是依然可以访问到

多个MySQL实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:8.0.27
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:8.0.27
# 这个时候可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止
但是一旦持久化到了本地,这个时候,本地的数据不会被删除
Dockerfile
DockerFile介绍
构建步骤:
1、编写一个dockerfile文件
2、docker build构建为一个镜像
3、docker run 运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库)

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

很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像
官方可以制作镜像,那我们也可以
DockerFile镜像的构建
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为了企业交付的标准,必须要掌握
步骤:开发,部署,运维…缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
Docker指令
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME #挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定容器运行时的shell命令,只有最后一个生效,可被替代
ENTRYPOINT # 指定容器运行时的shell命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个还是会就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量

实战,构建自己的centos
# 1、在home目录下新建dockerfile编写Dockerfile文件
[root@yuan dockerfile]# vim mydockerfile-centos
[root@yuan dockerfile]# cat mydockerfile-centos
FROM centos:7 #指定centos的版本为7,指定8要修改配置文件
MAINTAINER yuan<2121007706@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#第一次要安装这两个,可能会报错
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
#安装vim
RUN yum -y install vim
#安装net-tools
RUN yun -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
构建centos
2、通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]Successfully built dc4556607d09Successfully tagged mycentos:0.1#
[root@yuan dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.0 .
3、测试运行
对比:之前原生的centos

我们增加之后的镜像

我们可以列出本地镜像的变更历史:docker history 镜像id

CMD和ENTRYPOINT的区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可背代替
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
#编辑vim编辑器的内容
[root@yuan dockerfile]# vim dockerfile-cmd-test
FROM centos
#启动时执行
CMD ["ls","-a"]
#构建镜像
[root@yuan dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
#启动镜像ls -a生效
[root@yuan dockerfile]# docker run cd92755616fe
.
..
.dockerenv
bin
dev
etc
home
#想追加-l失败报错
[root@yuan dockerfile]# docker run cd92755616fe -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
cmd的清理下-1替换了CMD ["ls ", "-a"]命令,-1 不是命令所以报错!
测试ENTRYPOINT
#编辑vim编辑器的内容
[root@yuan dockerfile]# vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
[root@yuan dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
#启动镜像
[root@yuan dockerfile]# docker run 180ecef10db7
.
..
.dockerenv
bin
dev
etc
home
lib
#发现追加命令成功
[root@yuan dockerfile]# docker run 180ecef10db7 -l
total 56
drwxr-xr-x 1 root root 4096 Mar 1 14:53 .
drwxr-xr-x 1 root root 4096 Mar 1 14:53 ..
-rwxr-xr-x 1 root root 0 Mar 1 14:53 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 1 14:53 dev
drwxr-xr-x 1 root root 4096 Mar 1 14:53 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 153 root root 0 Mar 1 14:53 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
drwxr-xr-x 11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Jan 31 07:54 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
DockerFile制作Tomcat镜像
1,环境准备:在home下新建yuan目录并拷贝文件


2、编写dockerfile文件,文件命名为Dockerfile,就不需要-f去指定了,build会自动寻找这个文件
FROM centos:7 #指定centos的版本为7
MAINTAINER yuan<2121007706@qq.com> #作者
COPY readme.txt /usr/local/readme.txt #将该目录下的文件拷贝到指定centos/usr/local目录下
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ #将准备的jdk环境添加
ADD apache-tomcat-9.0.27.tar.gz /usr/local/ #添加tomcat环境
RUN yum -y install vim #安装vim
ENV MYPATH /usr/local #构建的时候设置环境变量为/usr/local
WORKDIR $MYPATH 镜像的工作目录为/usr/local
#配置jdk的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#配置tomcat的环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin
#指定端口
EXPOSE 8080
指定容器运行时的shell命令:镜像安装的路径/usr/local/apache-tomcat-9.0.27/bin/startup.sh启动tomcat和日志
CMD /usr/local/apache-tomcat-9.0.27/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.27/bin/logs/catalina.out
3、构建镜像
[root@yuan yuan]# docker build -t ytomcat .
4、启动镜像
[root@yuan yuan]# docker run -d -p 9090:8080 --name yuantomcat
-v /home/yuan/build/tomcat/test:/usr/local/apache-tomcat-9.0.27/webapps/test
-v /home/yuan/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.27/logs ytomcat
# 解释,第一个挂载是将webapps下的test映射到本地tomcat下的test
-v /home/eric/build/tomcat/test:/usr/local/apache-tomcat-9.0.27/webapps/test
# 解释,第二个挂载是将apache-tomcat-9.0.27下的日志映射到本地tomcat下的tomcatlogs
-v /home/eric/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.27/logs

浏览器访问:http://服务器ip地址:9090:远程服务开启端口号9090

6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
在本地tomcat/test文件夹下创建WEB-INF文件夹,在WEB-INF下编写web.xml文件,
在/test 下编写index.jsp文件,再访问http://ip地址:9090/test/

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<html>
<head>
<title>hello,eric</title>
</head>
<body>
<h1>Hello Word</h1>
</body>
</html>

发布自己的镜像
2、注册账号,确定这个账号可以登录
3、登录服务器
登录命令
[root@yuan /]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
测试登录
[root@yuan /]# docker login -u yuanyicheng
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
提交自己的镜像
#push的镜像有问题
[root@yuan /]# docker push yuanyicheng/ytomcat:1.0
The push refers to repository [docker.io/yuanyicheng/ytomcat]
An image does not exist locally with the tag: yuanyicheng/ytomcat
#解决增加一个tag yuanyicheng用户名作者tomcat:1.0指定版本号
[root@yuan /]# docker tag d89900068c83 yuanyicheng/tomcat:1.0
# docker psuh上去即可!自己发布的镜像尽量带上版本号
[root@yuan /]# docker push yuanyicheng/tomcat:1.0

都是由层级的关系push上去的
Docker网络