目录
(2)运行私有库Registry,相当于本地有个私有Docker hub
(3)案例演示创建一个新镜像,ubuntu安装ifconfig命令
(5)将新镜像clayubuntu:1.3修改符合私服规范的Tag
从Docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
Docker hub上面拉取redis镜像到本地标签为6.0.8
将一个redis.conf文件模板拷贝进/app/redis目录下
五、本地镜像发布到阿里云
5.1、本地镜像发布到阿里云流程
5.2、镜像的生成方法
基于当前容器创建一个新的镜像(第一种方法)
docker commit [options] 容器ID [repository[:tag]]
OPTIONS说明:
-a:提交的镜像作者;
-m:提交时的说明文字;
本次案例centos+ubuntu两个,当堂讲解一个,家庭作业一个,请大家务必动手,亲自实操。
DockerFile(第二种方法)
5.3、将本地镜像推送到阿里云
本地镜像素材原型
创建仓库镜像
选择控制台,进入容器镜像服务
命名空间
仓库名称
进入管理命令获得脚本
将镜像推送到阿里云
将镜像推送到阿里云Registry
管理界面脚本
脚本实例
5.4、将阿里云上的镜像下载到本地
下载到本地
六、本地镜像发布到私有库
6.1、本地镜像发布到私有库流程
6.2、是什么?
1、官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
2、Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
6.3、将本地镜像推送到私有库
(1)下载镜像Docker Registry
docker pull registry
(2)运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调。
(3)案例演示创建一个新镜像,ubuntu安装ifconfig命令
① 从Hub上下载ubuntu镜像到本地并成功运行
注意:因为以前下载过,所以这里不过多赘述。
② 原始的ubuntu镜像是不带ifconfig命令的
③ 外网连通的情况下,安装ifconfig命令并测试通过
docker容器内执行上述两条命令:
apt-get update
apt-get install net-tools
之后再输入ifconfig就可以使用了。
④ 安装完成后,commit我们自己的新镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
注意:一定要在容器外执行。
这里还有个点,你退出的时候一定要用ctrl+p+q,不要用exit。
docker commit -m="ifconfig cmd add" -a="clay" 6a15b30bb5b9 clayubuntu:1.3
⑤ 启动我们的新镜像并和原来的对比
先把原来的ubuntu关闭掉,docker stop xxxx。
发现我们的新镜像是可以使用ifconfig命令的。
(4)curl验证私服库上有什么镜像
curl -XGET http://你的ip:5000/v2/_catalog
注意:这里的IP地址是你虚拟机的IP,而5000是你刚刚运行的私服库,我们的查询结果是私有库中没人任何镜像。
(5)将新镜像clayubuntu:1.3修改符合私服规范的Tag
按照以下公式来做:
docker tag 镜像:Tag Host:Port/Repository:Tag
使用命令 docker tag 将clayubuntu:1.3 这个镜像修改为你的ip:5000/clayubuntu:1.3
docker tag clayubuntu:1.3 你的ip:5000/clayubuntu:1.3
(6)修改配置文件使之支持http
vim /etc/docker/daemon.json
在我们之前配置的阿里云镜像后面加上这句:
"insecure-registries": [你的ip:5000"]
上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker。
(7)push推送到私服库
docker push 你的ip:5000/clayubuntu:1.3
(8)pull到本地并运行
docker pull 你的ip:5000/clayubuntu:1.3
七、Docker容器数据卷
7.1、坑:容器卷记得加入
--privileged=true
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可!
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
7.2、回顾上一讲的知识点,参数v
还记得蓝色框框中的内容吗?
7.3、是什么?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
一句话:有点类似我们Redis里面的rdb和aof文件。
将Docker容器内的数据保存进宿主机的磁盘中。
运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名
7.4、能干嘛?
将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据。
2:卷中的更改可以直接实时生效,爽。
3:数据卷中的更改不会包含在镜像的更新中。
4:数据卷的生命周期一直持续到没有容器使用它为止。
7.5、数据卷案例
宿主vs容器之间映射添加容器卷
命令
docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名
我们ctrl + p + q退出时,再看
果然同步到宿主机了。
当然我们在宿主机上创建文件也可以同步到容器中。
查看数据卷是否挂载成功
docker inspect 容器ID
容器和宿主机之间数据共享
1:docker修改,主机同步获得。
2:主机修改,docker同步获得。
3:docker容器stop,主机修改,docker容器重启看数据是否同步。
哪怕你docker容器挂了,挂的这段时间宿主机的操作也一样会同步到docker容器中。
读写规则映射添加说明
读写
默认就是可读可写的。
只读
容器实例内部被限制,只能读取不能写。
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
卷的继承和共享
容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
总结:我们之前创建了u1 ubuntu,相当于用来备份的硬盘A,现在我们又创建了u2 ubuntu硬盘B,继承自硬盘A,哪怕A挂了,B照样能同步数据,等硬盘A复活,A照样有挂掉这期间的数据,相当于一主二从。
八、Docker常规安装简介
8.1、总体步骤
搜索镜像
拉取镜像
查看镜像
启动镜像
停止镜像
移除容器
8.2、安装Tomcat
Docker hub上面查找Tomcat镜像
docker search tomcat
从Docker hub上拉取Tomcat镜像到本地
docker pull tomcat
查看是否拉取到Tomcat
docker images
创建Tomcat容器实例
docker run -it -p 8080:8080 tomcat
-p小写,主机端口:docker容器端口。
-P大写,随机分配端口。
i:交互。
t:终端。
d:后台。
访问Tomcat首页
问题
解决
(1)可能没有映射端口或者没有关闭防火墙
(2)把webapps.dist目录换成webapps
先成功启动tomcat
直接访问localhost:8080
免修改版说明
刚才的Tomcat太过麻烦,因为是新版,导致把webapps里面的东西给清空了,我们还得多几步操作,将webapps.dist改为webapps才行,所以我们还是用老一点的版本。
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
8.3、安装Mysql
Docker hub上面查找mysql镜像
docker search mysql
从Docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
docker pull mysql:5.7
使用mysql5.7镜像创建容器(也叫运行镜像)
命令出处,哪里来的?
简单版
使用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
实战版
新建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容器实例
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重新启动mysql容器实例再重新进入并查看字符编码
再新建库新建表再插入中文测试
结论
之前的DB 无效。
修改字符集操作+重启mysql容器实例。
之后的DB 有效,需要新建。
结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据。
8.4、安装Redis
Docker hub上面拉取redis镜像到本地标签为6.0.8
入门命令
命令提醒:容器卷记得加入--privileged=true。
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可。
在Centos宿主机下新建目录/app/redis
mkdir -p /app/redis
将一个redis.conf文件模板拷贝进/app/redis目录下
/app/redis目录下修改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启动使用了我们自己指定的配置文件
修改前
修改后
记得重启服务。