文章目录
Docker简介
Docker是一个开源的应用容器引擎,基于GO语言并遵从Apache2.0协议开源
Docker基本概念:
- 主机:主要是安装了Docker的就是主机,可以使用Docker
- Docker客户端:客户端通过命令行或图形界面的方式操作Docker
- 仓库:Docker支持将软件编译成一个镜像,然后将这个镜像发布出去,发布的地方就是仓库,分远程仓库与本地仓库,与maven类似。我们可以将我们自己的软件通过Docker打包成一个镜像发布到远程仓库或本地仓库。
- 镜像:用户将软件配置等编译成一个镜像后发布出去,其他人就可以直接将这个镜像拉到本地运行
- 容器:运行中的镜像称为容器,容器的启动速度非常快,性能开销也非常小
安装
简介
docker是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面只介绍CentOs的安装,Windows提供安装连接,但是不提供安装步骤,可以在官网中自己看。以下都是社区版。
CentOS
Linux包管理工具简介
CentOS是Linux的发行版之一,关于Linux发行版可以看Linux发行版特色
首先来了解一下什么是Linux的包管理工具,可以查看Linux的包管理工具:
简单来说,Linux软件包管理工具是一组命令的集合,其作用是提供在操作系统中安装,升级,卸载需要的软件的方法,并提供对系统中所有软件状态信息的查询。在GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和DPT为最常见的两类软件包管理工具,他们分别应用于基于 rpm 软件包的
版本 | 前端 | 后端 | 包格式 |
---|---|---|---|
Debian, Ubuntu(优班图)等 | dpkg-deb/apt-get | DPT管理器 | deb |
RedHat,SUSE等 | yum | RPM管理器 | rpm |
Linux 发行版本和基于deb软件包的 Linux 发行版本
各个发行版之间最大的不同通常就在于包管理器,所以想玩的话可以集中玩几个代表性的就行:
- apt系,当然选最纯正的Debian
- yum系,选最具代表性的CentOS
- YaST,最主要的就是openSUSE
- Pacman,当然是Manjaro、ArchLinux
本人仅接触过CentOS,其他的包管理工具不知道。下面介绍的系统为CentOS6和7版本,因此安装使用的下载安装命令也是yum
docker的默认安装路径在/var/lib/docker/
下图是docker在Linux中的文件路径及文件夹
其中image是镜像,containers是容器,overlay2是docker官方推荐使用的存储驱动,其他的暂时不知道
CentOS6.8安装
安装步骤如下:
- yum install -y epel-release(-y表示不需要询问,使用默认同意的方式进行安装。epel【一跑】是安装docker前优先安装的一个类似仓库的依赖包)
- yum install -y docker-io
- 安装后的配置文件:/etc/sysconfig/docker
- 启动docker后台服务:service docker start
- docker version 验证是否安装成功
CentOS7.X安装
- yum install -y yum-utils(在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。)
- yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo(设置存储库,安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。)
- yum install docker-ce docker-ce-cli containerd.io (安装Docker,如果需要安装其他版本的Docker,请参考官网)
- systemctl start docker (启动Docker)
- docker run hello-world (运行hello world验证是否成功)
安装完成后配置Docker为开机自启动 systemctl enable docker
Docker镜像加速
参考阿里云镜像加速
注意这里因为Docker版本的不同,配置文件也不同,有/etc/sysconfig/docker和/etc/docker/daemon.json两个,具体参考上方阿里云镜像加速。
-
ContOS6版本的Docker镜像加速配置,在/etc/sysconfig/docker文件中添加
"DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=<从阿里云获取的专属加速连接>\""
-
ContOS7版本的Docker镜像配置在/etc/docker/daemon.json(没有时新建该文件)中添加
{ "registry-mirrors": ["<your accelerate address>"] }
。 -
重启Docker:service docker restart
-
验证是否生效:ps -ef|grep docker,如果打印出来的Docker进程中显示了配置的镜像地址,则表示成功(另ps命令解释)
Docker运行原理
Docker运行原理
为什么Docker比虚拟机快
相比于虚拟机,Docker去掉了虚拟机的操作系统部分,虚拟机是在主机上新开一个虚拟机的时候会加载一个完整的操作系统内核,而Docker不需要,docker上云行的容器都是只与docker引擎交互,因此在加载和内存大小 方面都要 优于虚拟机。
Docker命令
帮助命令
- docker info
- docker version
- docker --help(重点,学会使用help命令来查看docker操作命令)
镜像、容器命令
- docker pull 拉取镜像
- docker images 列出本地镜像列表
- docker ps 本地容器列表
- docker start 启动一个或多个停止的容器
- docker stop 停止一个或多个容器
- docker kill 强制停止一个容器,相当于结束该容器的运行进程?
- docker run 运行一个新的容器
docker run 命令option说明:
--name
表示在运行这个容器的时候给起一个名字,如果不指定,则docker默认给生成一个随机名字,建议自己制定
-d
表示后台运行容器,并返回容器id,也就是启动守护式容器,与下面两个命令-i -t
对比来看,使用了-i -t
则表示进入这个启动的容器内进行操作,例如启动Tomcat命令docker run -it --rm -p 8888:8080 tomcat:9.0
中-it
,使用此命令后将进入Tomcat的黑窗口
-i
以交互模式运行容器,交互模式的意思就是要去操作这个容器,,容器启动成功后会返回一个命令窗口来供我们与该容器进行交互。如果这个容器是CentOs这样的操作系统,则会进入这个系统,这个系统就是这个容器,与登录虚拟机一样,默认root目录?
-t
为容器分配一个伪输入终端,通常与-i
一起使用
-p
-P
这两个命令都是指定端口,大写P表示随机端口,小写p表示以指定的方式映射端口 - docker rm 移除一个或多个容器
- docker rimi 移除一个或多个镜像
- docker search 从远程仓库搜索镜像
- 退出命令,下面两个退出指令的区别例如Tomcat,当我们用
-it
指令运行Tomcat后,会返回一个与Tomcat交互的命令行窗口,而exit就表示Tomcat 停止,并且退出当前交互窗口;ctrl+P+Q表示仅退出交互窗口,不停止Tomcat容器服务。- exit 表示容器停止退出
- ctrl+P+Q 表示容器不停止退出
- 退出之后重新连接命令窗口怎么连???????
- docker logs -t -f 容器id
docker logs 命令参数说明 -t 表示time
- docker top 查看容器内运行的进程
- docker inspect 容器id
- 进入正在运行的容器,并以命令行交互
- docker exec -it 容器id bashShell
- docker attach 容器id
上面两个命令都可以实现,区别是attach命令只能进入容器并返回该容器id标识的命令行窗口,而exec命令后面可以追加一些操作,当有操作的时候是不需要进入容器,而是直接返回操作后的结果。总结一下就是exec比attach命令功能强大一些。
- docker cp 容器id:/tmp/yum.log /root 从容器中拷贝文件到主机上。这里的命令意思就是从容器id指向的容器中,将其内tmp文件夹下的yum.log文件拷贝到主机的root目录下
- 详情查看docker --help 命令
Docker镜像
是什么?
docker镜像就是联合文件系统(UnionFS)
自定义镜像
提交容器副本使之成为一个新的镜像 docker commit -m=‘提交的描述信息’ -a=‘作者’ 容器id 要创建的目标镜像名:[标签名]
,这个命令是将本地容器进行自定义后重新commit到本地仓库中,使之成为一个新的镜像。
Docker容器数据卷
是什么
docker容器数据卷可以让容器之间共享数据,也可以让容器与主机之间共享数据,当容器关闭或者退出后,保留容器内的数据。
命令添加容器卷
docker run -it -v /宿主机聚堆路径目录:/容器内目录 镜像名
- 举例:
docker run -it -v /myDataVolume:/dataVolumeContainer centos
,该命令表示,在启动centos容器的时候,在容器内增加根目录下的DatavolumeContainer文件夹,在主机增加根目录下的myDataVolume文件夹,这两个互相对应的文件夹就是给该容器添加的容器卷
输入命令docker inspect
后查看json串中Volumes项即可发现该容器卷文件夹对应,HostConfig项中的binds也标明了两个文件夹对应,VolumesRM表示读写。 - 数据共享
当我们在主机内进入MyDataVolume文件夹后,输入命令touch host.txt在该文件夹内新建一个文件后,切换至容器内(docker exec -it centos /bin/bash
)进入DataVolumeContainer文件夹后发现该文件夹内也存在host.txt文件,然后我们使用命令vi或vim更改host.txt文件后再touch container.txt新建一个文件,退出容器后进入myDataVolume文件夹后发现host.txt文件内容已经被容器修改,并且增加了一个名叫container.txt文件。由此可以说明,这俩文件夹相当于同一个文件夹。 - 容器停止退出后,主机修改也同步
当我们使用命令exit退出容器后(exit表示退出并关闭容器),在主机端使用命令cat host.txt修改文件内容,并touch host02.txt新建,当我们再次使用命令docker start centos
启动容器,使用命令docker attach 容器id
打开centos的命令窗口,进入datavolumecontainer文件夹后发现,host.txt文件的内容已经被主机修改过,并且也有新建的host02.txt. - 增加读写权限的容器卷
docker run -it -v /宿主机聚堆路径目录:/容器内目录:ro 镜像名
ro表示readonly,只读。当添加该命令时表示,数据卷文件夹中的内容只能在主机端增加或修改,而容器内虽然可以同步主机添加的数据,但是只有读权限,不能修改也不能新建。
输入命令docker inspect 容器id
查看VolumesRM项发现值为false,表示不能写。
DockerFile添加
是什么?
DockerFIle相当于是对Doker image 的描述。如下图,使用Tomcat举例,在docker.hub上搜索Tomcat镜像,下拉到下图
翻译过来就是支持标签和相应的dockerfile连接,当我们点击某个版本的Tomcat后,跳转到git.hub上的dockerfile,如下图(展示部分图片)
使用DockerFIle的方式添加数据卷
出于可移植和分享的考虑,使用***-v 主机目录:容器目录*** 这种方式不能够直接在Dockerfile中实现,由于宿主机目录是依赖特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
添加步骤:
- 构建dockerfile
vim 命令新建dockerfile文件,输入内容如下(例子):
# volume test
FROM centos
VOLUME [“/dataVolumeContainer1”,“/dataVolumeContainer2”]
CMD echo “finished,--------success1”
CMD /bin/bash
这个dockerfile文件的意思就是,使用centos这个镜像,设置容器卷目录为“/dataVolumeContainer1”,“/dataVolumeContainer2”这两个容器内部的文件夹,打印Finnish这句话,表示程序运行成功,最后这句表示打开交互窗口
- build
docker build -f dockerfile所在目录 -t 标签/新镜像的名字 .
(最后这个点表示在当前目录下,这一段不是很清楚)
执行该命令根据dockerfile文件描述构建一个新的镜像, docker images
查看当前镜像是否有新生成的镜像- 如果有,则运行run命令启动容器
- 最后运行
docker inspect 容器id
命令查看VOLUME 映射,在这个步骤当中我们没有指定主机的容器卷文件夹路径,因此,docker会默认给我们生成一个路径,具体映射在inspect命令打印出来的Volumes项中
容器间共享容器卷
当我们需要启动多个例如Tomcat容器时,这些容器都是用某一个
docker run -it --name dc02 --volumes-from dc01 镜像id或名字
这个命令的意思就是使用镜像id指向的镜像启动第二个容器,名字叫dc02,并且该容器的容器卷来此dc01。如果我们在不指定读写权限的情况下在dc02容器中给容器卷添加或修改,那么不论是dc01还是在主机,都能看见dc02的修改。以此达到共享的目的。
总结:容器之间配置信息的传递,在整个数据卷的生命周期一直持续,也就是说我们不论是dc01还是02、03、04…任何一个容器在修改了容器卷后都是所有容器生效,并且无论其中任何一个容器删除或者停止都不会影响其他容器访问容器卷,直到没有容器使用容器卷为止。
=================================================
Docker如何将软件打包成一个镜像并发布出去?