Docker简介
Docker概述
Docker:一次镜像,处处运行 -- 保证运行环境相同
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟
Docker的三要素:镜像(image), 容器(container), 仓库(repository)
镜像:静态的,不可修改
容器:有镜像创建
仓库:存放镜像的地方,docker hub等
Docker运行原理
Docker run helloworld
实现流程:
阿里云镜像仓库:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
卸载Docker,出现无法删除/var/lib/docker的问题:
参考:
Docker常用命令
帮助启动类命令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
设置开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令 -help
镜像命令
docker images
- 列出本地所有的镜像
- OPTIONS说明:-a 列出本地主机上的镜像 ;-q:只显示镜像ID
docker search 某个xx镜像名字
- 网站:https://hub.docker.com
- docker search [options] image_name
- OPTIONS说明:
- --limit:只列出N个镜像
- docker search --limit 5 redis
docker pull 某个xx镜像名字
- docker pull image_name [:TAG]
- 未标注TAG,则下载默认的最新版(:latest)
- docker pull redis
- docker pull redis:6.0.8
docker system df
:查看镜像/容器/数据卷所占的空间
docker rmi 某个xxx镜像名字/镜像ID
- remove images
- 删除多个镜像:docker rmi image1 image2 ……
- 删除全部镜像:docker rmi -f $(docker images -qa)
面试题:谈谈docker虚悬镜像是什么?
- 仓库名和标签均为
<none>
容器命令
- 新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- OPTIONS说明:启动交互式容器(前台命令行)
- -it 选项
- 列出当前正在运行的容器:docker ps [optins]
- 退出容器
- exit:run进去容器,exit退出,容器停止
- ctrl+p+q:run进去容器,ctrl+p+q退出,容器不停止
- 启动已停止运行的容器 -- docker start 容器ID或者容器名
- 重启容器 -- docker restart 容器ID或者容器名
- 停止容器 -- docker stop 容器D或者容器名
- 强制停止容器 -- docker kill 容器ID或容器名
- 删除已停止的容器 -- docker rm 容器ID或容器名
补充重要概念:
- 命令式启动与后台守护运行:
后台模式启动:docker run -d centos
前台模式启动:docker run -it centos
-
查看容器日志:
docker logs [OPTIONS] CONTAINER
-
查看容器内运行的进程:
docker top CONTAINER [ps OPTIONS]
-
查看容器内部运行细节:
docker inspect [OPTIONS] NAME | ID [NAME|ID...]
-
重新进入doker容器:
docker exec -it 容器ID bashShell
不小心关闭ubuntu,未退出;下面重新进入Ubuntu
重新进入docker attach容器D
案例演示,用centos或者unbuntu都可以
上述两个区别:
- attach直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。(过河拆桥)
- exec是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。(推荐使用)
- 从容器拷贝文件到主机:
docker cp 容器:容器内路径 目的主机路径
- 导入和导出容器
- export 导出容器的内容流,作为一个tar归档文件,[对应import命令]
docker export 容器ID > tar包路径
- import 从tar包中的内容创建一个新的文件系统,再导入为镜像 [对应export]
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
Docker镜像
是什么?
定义
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时周要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)
分层的镜像
镜像是分层的
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂我到同一个虚拟文件系统下(unite several directories into a single virtual fileSystem)。Union文件系统是Docker镜像的墨础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系绕,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起米,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
为什么Docker镜像要采用这种分层结构呢
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像:同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
Docker镜像commit操作案例
docker commit -m="提交的描述信息" a="作者" 容器ID 目标镜像名:[标签名]
总结
本地镜像发布到阿里云
与 Git 相似
https://cr.console.aliyun.com/repository/cn-guangzhou/yiransz/ubuntu/details
发布到私有库
https://hub.docker.com/
Docker Registry
Docker容器数据卷
docker挂载目录增加权限
--privileged=true
容器目录 -- 映射 -- 主机目录
卷:数据的持久化
docker run-it-privileged:=true-v/宿主机绝对路径目录:/容器内目录 镜像名
容器卷案例
-
宿主 vs 容器之间映射添加容器卷
- 直接命令添加
- docker run -it --priviledged=true -v /tmp/host_data:/tmp/docker_data --name=u1_ubuntu
- host_data:hostin.txt <--> docker_data:hostin.txt
-
读写规则映射添加说明
- 默认规则:可读可写
- ro: Read-Only
- 读写规则限制的是容器
-
卷的继承和共享
- 容器1和容器2共享:docker run -it --privileged=true--volumes-from--name u2 ubuntu
- 任何一个容器挂掉,重启后都能够共享数据
Docker常用安装简介
总体步骤
搜索镜像 -- 拉取镜像 -- 查看镜像 -- 启动镜像 -- 停止容器 -- 移除容器
search pull docker images run stop rm
安装Tomcat
运行Tomcat容器【最新版10.1.18】:
报错404:关闭防火墙,将webapps.dist替换webapps
tomcat增加jdk的版本:8.0.53
报错:
解决方案:(中途关闭了防火墙)重启docker
安装mysql
docker pull mysql:5.7
ps -ef | grep 3306【保证3306端口未被占用】
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it 容器ID /bin/bash
mysql实际应用:
解决中文乱码,以及docker容器删除后数据保存问题
使用容器卷(日志log, 数据data, 配置configure)
中文乱码
mysql5 中由于编码规则,会出现中文乱码,mysql8 则不会出现。
解决中文乱码问题【修改配置文件】:
容器卷:-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-
在配置文件/yiran/mysql/conf中写入my.cnf文件,如下
-
重启mysql,即可解决
-
查看字符集编码
docker容器删除后数据保存
删除容器后,里面的数据怎么办?
挂载容器卷到宿主机,重启后会自动同步
安装redis
拉取redis:6.0.8,并执行
如何按照特定的配置文件启动redis?
修改宿主机/app/redis/redis.conf
配置文件,由于挂载容器卷,启动redis后,docker中的redis配置也会更新。
【redis-server启动读取/etc/redis/redis.conf
配置文件】