docker(第二部分)

来自尚硅谷杨哥

少一点胡思乱想,心中无女人,编码自然神,忘掉心上人,抬手灭红尘。人间清醒,赚钱第一。好好学习,天天向上。听懂六六六。

7.Dokcer容器数据卷

1,)坑:容器卷记得加入

--privileged=true

why:

Docker挂载主机目录访问如果出现cannot open directory:Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

2)回顾下上一讲的知识点,参数V

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调。

3)是什么

一句话:优点类似我们Redis里面的rdb和aof文件

将docker容器内的数据保存进宿主机的磁盘中

运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

4)能干嘛

将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的。

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能够保存数据在docker中我们使用卷。

特点:

1:数据卷可在容器之间共享或重用数据。

2:卷中的更改可以直接实时生效,爽

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止。

5)数据卷案例

1,宿主vs容器之间映射添加容器卷

直接命令添加

1)命令:

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

比如:docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash

2)查看数据卷是否挂载成功
3)容器和宿主机之间数据共享

1,docker 修改,主机同步获得

2,主机修改,docker同步获得

3,docker容器stop,主机修改,docker容器重启看数据是否同步。

2,读写规则映射添加说明
读写(默认)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

默认同上案例,默认就是rw

只读

容器实例内部被限制,只能读取不能写

/容器目录:ro镜像名 就能完成功能,此时容器自己只能读取不能写

ro = read only

此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

例:docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name u2 ubuntu

(只在容器例生效,root不生效)

3,卷的继承和共享
1)容器1完成和宿主机的映射。

docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu

2)容器2继承容器1的卷规则。

docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

例:docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

如果关闭父容器会发生什么?

照样在,继承的是挂载的路径,和u1没有关系了。

u1启动后又都有了,相当于两从

8.Docker常规安装简介

总体步骤

搜索镜像,拉取镜像,查看镜像,启动镜像--服务端口映射,停止镜像,移除镜像

安装tomcat

docker hub上面查找tomcat镜像

docker pull tomcat

docker search tomcat

从docker hub上拉取tomcat镜像到本地
docker images查看是否有拉取到的tomcat

docker images tomcat

使用tomcat镜像创建容器实例(也叫运行镜像)

docker run -it -p 8080:8080 tomcat

-p小写,主机端口:docker容器端口

-P大写,随机分配端口。

i:交互

t:终端

d:后台

访问猫首页
问题

tomcat最新版本对首页的访问发生了变化

解决

可能没有映射端口或者没有关闭防火墙

把webapps.dist目录换成webapps

因为实际上文件在webapps.dist里面,还要把webapps删除,把webapps。dist改名

rm -r webapps

mv webapps.dist webapps

先成功启动tomcat

查看webapps文件夹查看为空

docker exec -it 容器编号 /bin/bash

本质就是精简版的Linux

免修改版说明

docker pull billygoo/tomcat8-jdk8

docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

上面的是10版本的,直接下载8.0.53

安装mysql

docker hub 上面查找mysql镜像

docker search mysql

从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7

docker pull mysql:5.7

使用mysql5.7镜像创建容器(也叫运行镜像)
命令出处,哪里来的

hub.docker.com/_/mysql

$docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

简单版
使用mysql镜像

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker ps

docker exec -it 容器 ID /bin/bash

mysql -uroot -p

(ps -ef | grep mysql 查看之前有没有mysql实例启动着)

mysql -uroot -p

建库建表插入数据
外部Win10也来连接运行在docker上的mysql容器实例服务
问题

为什么报错?docker上默认字符集编码隐患

查看字符集:

SHOW VARIABLES LIKE 'character%'

服务器默认拉丁,需要修正

容器实例一删除,你还有什么?删除容器到跑路。。?敏感数据的迁移。

实战版
新建mysql容器实例

docker run -d -p 3306:3306 --privileged=true

-v /zzyyuse/mysql/log:/var/log/mysql

-v /zzyyuse/mysql/data:/var/lib/mysql

-v /zzyyuse/mysql/conf:/etc/mysql/conf.d

-e MYSQL_ROOT_PASSWOrD=123456

--name mysql mysql:5.7

新建my.cnf 通过容器卷同步给mysql容器实例

通过容器卷同步给mysql容器实例

重新启动mysql容器实例再重新进入并查看字符编码

cd /zzyyuse/mysql/conf/

ls

vim my.cnf

cat my.cnf

client

default_character_set=utf8

mysqld

collation_server = utf8_general_ci

character_set_server = utf8

docker exec -it mysql bash

mysql -uroot -p

SHOWVArIABLES LIKE 'character%';

再新建库新建表在插入中文测试

成功

结论

之前的DB无效

修改字符集操作+重启mysql容器实例

之后的DB有效,需要新建

结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后在新建mysql库-表-插数据

假如将当前容器实例删除,再重新来一次,之前键的卷里的数据能否重新写回mysql

是可以的!日常中容器卷是一定要挂的,数据安全性才能保证!

安装redis

实际工作当中复复杂杂才是真

docker images redis:6.0.8

docker run -d -p 6379:6379 redis:6.0.8

docker ps

docker exec -it 容器编号 /bin/bash

redis-cli

set k1 v1

get k1

你以为的操作!

从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
入门命令
命令提醒:容器卷记得加入--privileged=true
在CentOS宿主机下新建目录/app/redis

mkdir -p /app/redis

将一个redis.conf文件模板拷贝进/app/redis目录下
/app/redis目录下修改redis.conf文件

默认出厂的原始redis.conf

使用redis6.0.8镜像创建容器(也叫运行镜像)

docker run -p 6379:6379 --name myr3 --privileged=true

-v /app/redis/redis.conf:/etc/redis/redis.conf

-v /app/redis/data:data

-d redis:6.0.8 redis-server /etc/redis/redis.conf

测试redis-cli连接上来

docker exec -it myr3 /bin/bash

进去后

redis-cli

set k1 v1

get k1

ping

请证明docker启动使用了我们自己指定的配置文件

记得重启服务

测试redis-cli连接上来的第二次

安装Nginx

见高级篇Portainer

高级篇简介

相关推荐
汪碧康1 分钟前
一文掌握k8s的升级更新策略
云原生·容器·kubernetes·k8s·亲和性·xkube
有毒的教程34 分钟前
SaltStack 开源自动化运维工具详细介绍
运维·开源·saltstack
大房身镇、王师傅1 小时前
【VirtualBox】VirtualBox 7.1.6 RockyLinux10 配置增强功能 设置共享目录
运维·服务器·virtualbox·rockylinux10
betazhou1 小时前
rsync使用案例分析
linux·运维·服务器·rsync·同步数据
杨浦老苏1 小时前
离线优先的自托管笔记应用Anchor
笔记·docker·群晖
zcz16071278212 小时前
docker部署 WVP-Pro
容器
minglie12 小时前
谷歌浏览器搜索技巧
运维
脑子进水养啥鱼?3 小时前
Linux find 命令
linux·运维
曹天骄3 小时前
Cloudflare Worker 关联域名访问后出现301 / 308
运维·云计算