Docker基础学习和使用方法
一、Docker介绍
1、三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等,可以把容器看成是一个简易版的linux环境
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
2、架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjLuWSw1-1605699186060)(E:\软件学习\学习笔记\images\docker架构.png)]
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
二、安装(CentOS7)
0、查看系统内核(3.10以上)
$ uname -r
1.卸载旧版本
$ yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
2、yum安装gcc相关
$ yum -y install gcc
$ yum -y install gcc-c++
查看gcc 版本
$ gcc -v
3、安装软件包
$ yum install -y yum-utils device-mapper-persistent-data lvm2
4、设置stable镜像仓库
$ yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、更新yum软件包索引
$ yum makecache fast
6、安装docker CE
$ yum -y install docker-ce
7、启动docker
$ systemctl start docker
8、测试
- 查看版本号
$ docker version
- 运行 hello-world
$ docker run hello-world
- 查看镜像
$ docker images
9、配置阿里云加速器
$ mkdir -p /etc/docker
$ vim /etc/docker/daemon.json
在文件中添加如下配置
#网易云镜像加速器
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
#阿里云镜像加速器
{"registry-mirrors": ["http://自己的编码.mirror.aliyuncs.com"] }
{"registry-mirrors": ["https://5d17jo71.mirror.aliyuncs.com"]}
$ systemctl daemon-reload
$ systemctl restart docker
10、卸载
$ systemctl stop docker
$ yum -y remove docker-ce
$ rm -rf /var/lib/docker
三、命令
1、帮助命令
- docker version ----查看版本号
- docker info -----查看信息
- docker --help ----查看帮助
2、镜像命令
docker images -----列出本地主机上的镜像
- Option说明
- -a:列出本地所有的镜像
- -q:只显示镜像ID
- –digests:显示镜像的再要信息
- –no-trunc:显示完整的镜像信息
- Option说明
docker search 某个镜像的名字 ----------从hub.docker.com上查找镜像
- Option说明:
- -s:列出点赞数不小于指定值的镜像
- –no-trunc:显示完整的镜像信息
- –automated:只列出automated build 类型的镜像
- Option说明:
docker pull 某个镜像的名字 -----下载镜像
- docker pull 某个镜像的名字:TAG
docker rmi 某个镜像的名字 /ID
- docker rmi -f 镜像ID:TAG ---------删除单个
- docker rmi -f 镜像ID1:TAG 镜像ID2:TAG 镜像ID3:TAG---------删除多个
- docker rmi -f $(docker images -qa)---------删除全部
3、容器命令
(1)新建并启动容器
- docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
- OPTIONS
- –name=“容器名字”:为容器指定一个名称
- -d:后台运行容器,并返回容器ID(启动守护式容器)
- 注意:docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(top,tail),就会自动退出
- -i:以交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
- -P:随机端口映射
- -p:指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- OPTIONS
(2)列出正在运行的容器
- docker ps [OPTIONS]
- OPTIONS
- -a:列出当前所有正在运行的容器+历史上运行过的容器
- -l:显示最近创建的容器
- -n:显示最近n个创建的容器
- -q:静默模式,只显示容器编号
- –no-trunc:不截断输出
- OPTIONS
(3)退出容器
exit-----容器停止退出
ctrl+P+Q-----容器不停止退出
docker attach 容器ID ------进入容器
docker exec [OPTIONS] CONTAINER COMMAND [ARG…] ------进入容器
推荐使用 docker exec 命令,因为此命令会打开新的进程,退出容器终端时不会导致容器的停止
docker exec -t 容器ID /bin/bash
(4)容器的启动、停止与删除
- docker start 容器ID或者容器名------启动一个容器
- docker restart 容器ID或者容器名-----重启一个容器
- docker stop 容器ID或者容器名-----停止一个容器
- docker kill 容器ID或者容器名-----强制停止一个容器
- docker rm 容器ID或者容器名-----删除一个容器
- docker rm -f $(docker ps -a -q)—一次性删除所有容器
(5)其他重要的命令
- docker logs -f -t --tail n 容器ID -----------查看容器日志
- -t:加入时间戳
- -f:跟随最新的日志打印
- –tail n:数字显示最后n条
- docker top 容器ID -------------查看容器内运行的进程
- docker inspect 容器ID ----------查看容器内部细节
- docker cp 容器ID:容器内路径 目的主机的路径 ---------从容器拷贝文件到主机
四、镜像
1、定义
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有的内容,包括代码、运行时、库、环境变量和配置文件
(1)UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次一次提交来一层一层的叠加,同时将不同目录挂载到同一个虚拟文件系统下(union serveral directories into a single virture filesystem).Union文件系统是docker镜像的基础。镜像可以通过分层进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件会包含所有的底层的文件和目录。
(2) Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。
这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5E1LIWJ-1605699186063)(E:\软件学习\学习笔记\images\bootf-rootfs.png)]
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??
原因:对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
(3)分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。
拉取ubuntu镜像:
hadoop@Docker:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
Digest: sha256:29934af957c53004d7fb6340139880d23fb1952505a15d69a03af0d1418878cb
Status: Downloaded newer image for ubuntu:latest
hadoop@Docker:~$
以tomcat为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ScWJrbhF-1605699186066)(E:\软件学习\学习笔记\images\tomcat-docker.png)]
(4)为什么 Docker 镜像要采用这种分层结构呢?
最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以 为所有容器服务了。而且镜像的每一层都可以被共享。
2、特点
- Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
3、Docker镜像commit操作补充
- docker commit提交容器副本使之成为一个新的镜像
docker commit 5133726067ed nju/mytomcat:1.1
- docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
docker commit -a="zzyy" -m="tomcat without docs" 5133726067ed nju/mytomcat:1.2
详情见:https://blog.csdn.net/kaizuidebanli/article/details/83750972
五、Docker容器数据卷
https://blog.csdn.net/kaizuidebanli/article/details/83754627
1、定义
- Docker的理念:
- 将运行的代码和运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
- Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。
2、作用
- 容器的持久化
- 容器间继承+共享数据
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
3、特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
4、数据卷–容器内添加
(1)直接命令添加
- 添加
- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 -------可读写
docker run -it -v /myDataVolume:/dataVolumeContainer centos
查看数据卷是否挂载成功
docker inspect 容器ID
容器和宿主机之间数据共享
- 在docker主机目录/myDataVolume上创建一个文件,并添加一些内容:
vi hello.txt// 文件内容如下 hadoop@Docker:/myDataVolume$ cat hello.txt hao lasfhadoop@Docker:/myDataVolume$
- 查看容器上的/dataVolumeContainer目录下是否有hello.txt文件
[root@45b281cc22d4 dataVolumeContainer]# ls hello.txt [root@45b281cc22d4 dataVolumeContainer]# cat hello.txt hao lasf[root@45b281cc22d4 dataVolumeContainer]#
容器停止退出后,主机修改后数据是否同步
- 我们把容器关闭之后。测试修改docker主机下/myDataVolume的内容,容器/dataVolumeContainer目录下的内容是否会同步更新
- centos主机已经关闭了,我们修改docker主机的内容。
- 重新启动centos容器,查看。
- 文件内容是同步修改了的。
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 ---------容器只能读不能写
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
(2)DockerFile添加
根目录下新建mydocker文件夹并进入
mkdir mydocker cd mydocker
可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
File构建
vim Dockerfile# volume test FROM centos VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finish,--------------------success " CMD /bin/bashhadoop@Docker:/mydocker$
build后生成镜像
docker build -f /mydocker/Dockerfile -t zzyy/centos .# 参数说明 -f : 指明Dockerfile所在的位置 -t : 命名空间 . : 表示当前路径
查看Docker主机的image
run容器
查看对应的主机容器
docker inspect 容器ID
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
5、数据卷容器
https://blog.csdn.net/kaizuidebanli/article/details/83756663
(1)定义
- 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。也就是,活动硬盘上面挂活动硬盘,实现数据的传递依赖。
(2)容器间传递共享(–volumes-from)
先启动一个父容器dc01
docker run -it --name dc01 镜像ID docker start dc01
dc02/dc03继承自dc01
ocker run -it --name dc02 --volumes-from dc01 镜像ID docker run -it --name dc03 --volumes-from dc01 镜像ID
回到dc01可以看到02/03各自添加的都能共享了
删除dc01,dc02修改后dc03可以访问
删除dc02后dc03可否访问:依然可以访问
新建dc04继承dc03后再删除dc03
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
六、Dockerfile
1、定义
- Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2、构建步骤
- 编写Dockerfile文件
- docker build
- docker run
3、文件样子
FROM scratch ## 所有镜像文件的祖先类
ADD centos-7-docker.tar.xz /LABEL org.label-schema.schema-version="1.0" \org.label-schema.name="CentOS Base Image" \org.label-schema.vendor="CentOS" \org.label-schema.license="GPLv2" \org.label-schema.build-date="20181006"CMD ["/bin/bash"]
七、实例
1、安装tomcat
docker run -p 8080:8080 --name mytomcat \
-v /lixp/tomcat/webapps:/usr/local/tomcat/webapps \
-d tomcat:9.0.31-jdk8
2、安装mysql
下载mysql
docker pull mysql:5.6
安装mysql
docker run -p 3306:3306 --name mysql \ -v /lixp/mysql/conf:/etc/mysql/conf.d \ -v /lixp/mysql/logs:/logs \ -v /lixp/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root@123456 \ -d mysql:5.6
2、安装redis
下载redis
docker pull redis:3.2
安装
docker run -p 6379:6379 \ -v /lixp/redis/data:/data \ -v /lixp/redis/conf/redis/conf:/usr/local/etc/redis/redis.conf \ -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf \ -- appendonly yes
八、本地镜像发布到阿里云
0、创建镜像仓库
1. 登录阿里云Docker Registry
$ sudo docker login --username=lixp1011 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/lixp/mydocker:[镜像版本号]
3. 将镜像推送到Registry
$ sudo docker login --username=lixp1011 registry.cn-hangzhou.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lixp/mydocker:[镜像版本号] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/lixp/mydocker:[镜像版本号]
Docker基础学习和使用方法相关推荐
- docker基础学习中遇到的一些问题
docker基础学习中遇到的有关tomcat的一些问题 最近在学docekr,对docker的基础操作有了一些认识,并试着做了一些实操,但是在实操过程中遇到了一些问题.有些已经解决,有些还未解决.现在 ...
- 零基础学习Java的方法有哪些?
零基础学Java只要方法得当,依然有机会学习好Java编程.初学Java就像交朋友从陌生到熟悉再到铁杆搭档一生相伴,随着学习的深入,你会发现学Java并不是想象的那样枯燥和困难,甚至还有一些美妙之感, ...
- Docker基础学习笔记( 搭建web漏洞检测环境和容器中运行Django项目)
目录 一.Docker技术的学习 1.1.docker安装(ubuntu16.04) 1.1.1.apt-get换国内清华源 1.1.2.安装最新版本的Docker 1.2.docker容器与镜像使用 ...
- Docker基础学习
入门docker在网上查了很多的资料,也看了不少视频,最后都是云里雾里的,最终也是看到这位大佬写的关于docker的技术文档,觉得很受用,推荐和宣传一下 Docker -- 从入门到实践 如果觉得基础
- Docker基础学习笔记
Docker 理念 Docker是基于Go语言实现的云开源项目. 基本概念 容器:实例对象,是一个集装箱,可以把容器看作简易版的Linux环境: 镜像:只读的模板,用来创建容器.可以创建多个容器,例如 ...
- python基础学习——函数和方法的区别与联系
以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...
- python函数和方法概念_python基础学习——函数和方法的区别与联系
以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...
- Docker基础学习笔记02:Docker基本操作
文章目录 一.Docker镜像操作 (一)拉取镜像到本地 1.命令格式 2.操作演示 (二)查看本地镜像 (三)删除本地镜像 任务1:删除本地指定镜像 任务2:删除全部本地镜像 任务3.拉取镜像到本地 ...
- Docker基础学习笔记01:Docker安装
文章目录 一.Docker概述 (一)Docker为何物 (二)Docker思想 1.集装箱 2.标准化 3.隔离性 二.在私有云上创建虚拟机 (一)登录OpenStack私有云 1.查看[概览] 2 ...
最新文章
- 聊聊前后端分离的接口规范
- C#读取文本文件和C# 写文本文件
- Linux Mint Root
- android右上角设置按钮,Android:如何在右上角的按钮角添加三角形
- Laravel入门:MVC框架
- 【BZOJ1452】【JSOI2009】count
- 深度学习推荐模型-DeepFM
- 遍历python字典几种方法
- 学子商城实训项目总结
- oracle建表的方法,oracle建表语句
- 同样磁盘数,不同raid级别的随机IO性能差异对比
- win7指定网络名不再可用
- 哈夫曼实现文件压缩解压缩(c语言)
- 【juns项目】信用卡数据项目2-1:需求和效果展示
- C++11新特性——std::bind参数绑定
- 拿走不谢,最全匹配中国大陆手机号码的正则表达式
- 中国哲学史(先秦部分)-------简答
- pyTest官方手册(Release 4.2)之蹩脚翻译(9)
- 流量、技术、超级APP,百度吹响国潮IP进攻号
- bootstrap框架之面包屑导航(Breadcrumbs)