目录
- 镜像理解
- UnionFS(联合文件系统)
- Docker 镜像加载原理
- 案例(docker commit)
- 本地镜像发布云上
- 本地镜像发布到私有库
- 容器数据卷
- 特点
- 案例
- 容器内只能读不能写
- 容器卷之间继承
- Docker 安装常用软件说明
- 安装mysql
- 安装redis
镜像理解
UnionFS(联合文件系统)
UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。是Docker镜像的基础。
镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
Docker 镜像加载原理
Docker的镜像是由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
容器层是可写的,容器层下面都是只读的
案例(docker commit)
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例为下载ubuntu镜像,添加vim命令
# 先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vim
- 注:这里出现连接不上的问题,在进入容器是出现ipv4无法连接的报错,参考以下博文解决:
本地镜像发布云上
去各大云厂商的网站查看发布的流程
本地镜像发布到私有库1.下载镜像registry
2.运行私有库registry
3.创建一个新镜像,安装ifconfig命令
4.curl验证私服库上有什么镜像
5.将新镜像修改符合私服规范的Tag
6.修改配饰文件支持http
7.push推送到私服库
8.curl验证私服库上的镜像
9.pull到本地并运行
docker pull registry
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
可以发现仓库已经后台运行
接着使用原生ubuntu镜像安装ifconfig
apt-get update
apt-get install net-tools
安装完后将镜像后commit
docker commit -m="add ifcomfig" -a="zhoujmi" ifconfig_ubuntu:1.2
启动这个commit的镜像,ctrl+p+q后台运行,接着访问一下私有库,看里面有没有东西
,注意ip是主机的ip,在启动私有库的时候指定了主机的5000端口对应registry私有库的5000端口,相当于访问私有库
curl -XGET http://192.168.56.21:5000/v2/_catalog
可以看到现在私有库是空的
将镜像Tag改成ip:私服端口/镜像名:镜像标签的形式
docker tag ifconfig_ubuntu:1.2 192.168.56.21:5000/ifconfig_ubuntu:1.2
接着取消http方式推送的限制
打开daemon.json文件
vim /etc/docker/daemon.json
添加以下内容,注意不要忘了逗号,若修改后不生效,建议重启docker
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries":["192.168.56.21:5000"]
}
接着将符合规则的镜像推送到私服
docker push 192.168.56.21:5000/ifconfig_ubuntu:1.2
可以看到成功推送上去了,接着把本地的删掉,拉下来运行下
docker rmi -f 192.168.56.21:5000/ifconfig_ubuntu:1.2
docker pull 192.168.56.21:5000/ifconfig_ubuntu:1.2
前言: Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
之前启动私有库的时候有以下这段参数
这里-v表示添加自定义容器卷,:左边是宿主机路径,:右边是容器内路径,后面的是放开限制,可以让宿主机内的路径文件与容器内的路径文件互通互联,信息共享
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
案例
命令
docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_Data --name=u2 ubuntu
这个命令,即使不存在该目录,也会创建目录,执行后,docker内的该目录与宿主机内的该目录将会始终保持一致,不论是修改宿主机的还是容器的,都会在另一方实时更新,即使容器挂了,宿主机的改动仍会在容器更新
查看是否挂载成功:
docker inspect 容器id
容器内只能读不能写
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_Data:ro --name=u2 ubuntu
容器卷之间继承
新运行一个容器并继承容器卷
docker run -it --privileged=true --volumes-from u2 --name u1 192.168.56.21:5000/ifconfig_ubuntu:1.2 bash
搜索镜像
拉取~
查看~
启动~ - 服务端口映射
停止容器
移除容器
安装tomcat
1.搜索镜像
前去dockerhub官网查询
或者命令
docker search tomcat
2.拉取
docker pull tomcat
3.运行(带端口映射)
-p 小写,主机端口:docker容器端口
-P 大写,随机分配端口
i:交互
t:终端
d:后台
docker run -d -p 8080:8080 --name="t1" tomcat
此时访问Tomcat首页会发现404,,因为Tomcat最新版对首页进行了改动,需要把tomcat文件夹下的webapps文件夹删除,并将webapps.dist该名称webapps,即可访问
docker exec -it t1 bash
rm -rf webapps
mv webapps.dist/ webapps
访问试试:
安装mysql
坑:
1.
注意,在Linux下安装mysql,若插入中文数据,则会报错,在linux中的字符集和外面的utf-8不一样导致,show variables like 'character%'这条命令,在外面和虚拟机所看到的的是不一样的
2.
注意启动时候最好挂上容器卷,防止容器被删除导致数据库内所有数据丢失
实际工作中使用的启动命令:
docker run -d -p 3306:3306 --privileged=true -v /zhoujmi/mysql/log:/var/log/mysql -v /zhoujmi/mysql/data:/var/lib/mysql -v /zhoujmi/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
新建my.cnf,解决乱码问题
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重新启动mysql容器实例再重新进入看字符集是否修改成功
再插入一条中文数据看是否报错
这样即使删除了该容器,重新执行启动命令,依旧不会丢失数据
安装redis
之前安装过(简单安装),不在赘述
实际工作中启动redis:
mkdir -p /backup/redis
使用以下目录作为宿主机挂载目录
创建一个redis.conf文件,从其他服务器获取或从网上下载,或者复制进来,修改配置(注意!一定要确定好redis版本,如果是最新的7.0要用7.0的redis.conf,否则无法启动):
启动
docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf
这里一定要注意路径问题!一进入的时候是root文件夹下,此时若目录指定/backup/redis会在./目录下创建backup/redis文件夹,导致在root文件夹下的改动对容器没用!!!!
验证是否挂载成功:
在宿主机上修改redis.conf中database这一项,改成10,则容器那边访问不到10即为生效
重启redis容器
docker restart redis
查看是否能访问(默认可以访问到15):