目录

  • 镜像理解
  • 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

docker 镜像安装unzip docker镜像里面安装软件_vim


可以看到现在私有库是空的

将镜像Tag改成ip:私服端口/镜像名:镜像标签的形式

docker tag ifconfig_ubuntu:1.2 192.168.56.21:5000/ifconfig_ubuntu:1.2

docker 镜像安装unzip docker镜像里面安装软件_vim_02


接着取消http方式推送的限制

打开daemon.json文件

vim /etc/docker/daemon.json

添加以下内容,注意不要忘了逗号,若修改后不生效,建议重启docker

{
        "registry-mirrors": ["https://registry.docker-cn.com"],
        "insecure-registries":["192.168.56.21:5000"]
}

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_03


接着将符合规则的镜像推送到私服

docker push 192.168.56.21:5000/ifconfig_ubuntu:1.2

docker 镜像安装unzip docker镜像里面安装软件_redis_04


可以看到成功推送上去了,接着把本地的删掉,拉下来运行下

docker rmi -f 192.168.56.21:5000/ifconfig_ubuntu:1.2 
docker pull 192.168.56.21:5000/ifconfig_ubuntu:1.2

docker 镜像安装unzip docker镜像里面安装软件_vim_05

容器数据卷

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

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

之前启动私有库的时候有以下这段参数

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_06


这里-v表示添加自定义容器卷,:左边是宿主机路径,:右边是容器内路径,后面的是放开限制,可以让宿主机内的路径文件与容器内的路径文件互通互联,信息共享

docker 镜像安装unzip docker镜像里面安装软件_vim_07


卷就是目录或文件,存在于一个或多个容器中,由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 镜像安装unzip docker镜像里面安装软件_redis_08


这个命令,即使不存在该目录,也会创建目录,执行后,docker内的该目录与宿主机内的该目录将会始终保持一致,不论是修改宿主机的还是容器的,都会在另一方实时更新,即使容器挂了,宿主机的改动仍会在容器更新

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_09


查看是否挂载成功:

docker inspect 容器id

docker 镜像安装unzip docker镜像里面安装软件_redis_10

容器内只能读不能写

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_Data:ro --name=u2 ubuntu

docker 镜像安装unzip docker镜像里面安装软件_linux_11

容器卷之间继承

新运行一个容器并继承容器卷

docker run -it --privileged=true --volumes-from u2 --name u1 192.168.56.21:5000/ifconfig_ubuntu:1.2 bash
Docker 安装常用软件说明

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

安装tomcat

1.搜索镜像

前去dockerhub官网查询

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_12


或者命令

docker search tomcat

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_13


2.拉取

docker pull tomcat

docker 镜像安装unzip docker镜像里面安装软件_vim_14


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

docker 镜像安装unzip docker镜像里面安装软件_redis_15

rm -rf webapps
mv webapps.dist/ webapps

docker 镜像安装unzip docker镜像里面安装软件_vim_16


访问试试:

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_17

安装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

之前安装过(简单安装),不在赘述

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_18


实际工作中启动redis:

mkdir -p /backup/redis

使用以下目录作为宿主机挂载目录

docker 镜像安装unzip docker镜像里面安装软件_docker_19

创建一个redis.conf文件,从其他服务器获取或从网上下载,或者复制进来,修改配置(注意!一定要确定好redis版本,如果是最新的7.0要用7.0的redis.conf,否则无法启动):

docker 镜像安装unzip docker镜像里面安装软件_redis_20

docker 镜像安装unzip docker镜像里面安装软件_linux_21


docker 镜像安装unzip docker镜像里面安装软件_redis_22

启动

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即为生效

docker 镜像安装unzip docker镜像里面安装软件_docker 镜像安装unzip_23


重启redis容器

docker restart redis

查看是否能访问(默认可以访问到15):

docker 镜像安装unzip docker镜像里面安装软件_linux_24