说明:
(1)声明:本篇博客,仅仅是docker的最基础介绍,仅仅可以作为一个入门性的介绍;docker的内容还有很多内容,后面需要自己比较系统的学习;所以,针对本篇博客中,遇到不明白或者需要扩展的地方,自己就没有太深究;
(2)本篇博客的内容:
● 从仓库中拉取镜像,启动为容器;
● 以后台运行的方式,启动docker容器;
● 在外部访问docker容器中的程序;主要就是端口映射;
● 利用Dockerfile,制作自己的镜像;
目录
一:以创建【包含ubuntu服务的,容器】为例,拉取镜像、启动镜像为容器,退出容器;
1.【docker -help】:查看docker有哪些常用的命令;
2.【docker -search redis】:查看docker有没有提供redis相关的镜像;
3.以【从中央仓库拉取ubuntu镜像,并启动】为例,演示拉取镜像、启动镜像为容器,退出容器等命令;
(1)使用【docker pull ubuntu】命令,从中央仓库拉取ubuntu镜像;
(2)然后使用【docker run -i -t ubuntu /bin/bash】,把刚下载的ubuntu镜像给运行起来;
二:以【包含redis服务的,docker容器】为例,演示后台运行docker容器;
(1)使用【docker run -i -t redis /bin/bash】,启动【包含了redis服务的镜像】,从而得到一个【包含了redis的服务的,docker容器】;
(2)然后,我们可以再开一个终端,去操作redis;
(3)使用【docker run -d redis】的方式,启动【包含redis服务的,docker容器】让容器在后台运行;并且,容器会自动把其中的redis服务给开启;
三:在外部访问【CentOS系统中的、包含redis的docker容器中的:redis服务】;
四:dockerfile简介:制作自己的镜像;
一:以创建【包含ubuntu服务的,容器】为例,拉取镜像、启动镜像为容器,退出容器;
1.【docker -help】:查看docker有哪些常用的命令;
说明:
(1)docker的命令有很多,对于这些命令,可以记忆但没必要强行记忆,在使用docker的时候慢慢就能掌握了;
docker -search redis】:查看docker有没有提供redis相关的镜像;
使用【docker -search redis】去看下,在docker仓库中,有没有redis相关的镜像;
再比如,使用【docker search eureka】去看下,有没有eureka相关的镜像;
说明:
(1)一般来说,对于一些常用软件,docker都会有对应的镜像;
3.以【从中央仓库拉取ubuntu镜像,并启动】为例,演示拉取镜像、启动镜像为容器,退出容器等命令;
说明:这儿可以参考【Docker 容器使用】;
……………………………………………………
(1)使用【docker pull ubuntu】命令,从中央仓库拉取ubuntu镜像;
PS:如果因为网络问题拉取困难,可以换源:
首先,使用【vim /etc/docker/daemon.json】去创建daemon.json文件,然后,在里面写入以下内容;自然,因为自己拉取还算顺利,所以我们并没有还源;
……………………………………………………
(2)然后使用【docker run -i -t ubuntu /bin/bash】,把刚下载的ubuntu镜像给运行起来;
说明:
(0)我们在运行【docker run -i -t ubuntu /bin/bash】的时候,其会检查我们是否拉取了ubuntu镜像,如果没有拉取,在这一步其会自动帮我们拉取;所以上面【docker pull ubuntu】拉取镜像的操作是可以省略的;
(1)命令内容解释;
● docker run:启动一个容器;
● -i -t:把本机的终端映射到后面的ubuntu终端上;
● ubuntu:镜像的名字;
● /bin/bash:终端的命令;
● /bin/bash是Linux中常用的shell解释器;如有需要可以参考【Linux进阶七:bash shell入门;】;
● 个人理解(不一定对哈):启动ubuntu镜像为容器,得到ubuntu系统;然后,我们希望进入到这容器中,而不是继续停留在CentOS系统上;即,在命令行终端上,想要显示ubuntu系统的终端;然后,具体访问ubuntu系统的方式就是以/bin//bash的方式,即以/bin/bash解释器为媒介和ubuntu系统交互;(这儿真心不是特别理解,留着吧,以后有精力了在回头补充吧;)
(2)执行完这个命令后,我们就进入了【启动ubuntu镜像,启动后的容器中了】,即我们就进入了ubuntu系统中了;
(3)可以使用【exit】退出终端;
我们exit退出ubuntu容器后,这个容器会被停止,但不会被删除;
二:以【包含redis服务的,docker容器】为例,演示后台运行docker容器;
(1)使用【docker run -i -t redis /bin/bash】,启动【包含了redis服务的镜像】,从而得到一个【包含了redis的服务的,docker容器】;
这个容器中,是包含redis的;我们进入这个容器后,就可以使用【redis-server】,去启动其中的redis服务;
说明:
(1)一个疑问,这儿不需要加载redis.conf配置文件吗?:待解决,暂留……
(2)然后,我们可以再开一个终端,去操作redis;
然后,我们可以再开一个终端窗口,去连接这个正在运行的容器(中的redis);使用【docker container ls】查看,在当前CentOS系统上,所有容器的信息;
使用【docker exec -it a6244b27415a bash】,进入到正在运行的那个【包含redis的,docker容器】中;
然后,使用【redis-cli】取调用redis的客户端,进而,我们可以在redis-cli命令行中输入命令来操作redis;
说明:
(1)一个疑问,在docker容器中,启动客户端的时候,不需要指定redis服务的端口号吗?:待解决,暂留……
但是,上面的使用体验并不好,我们在一个终端,启动docker容器中的redis应用后,这个终端就被redis占用了。我们要想继续其他操作,就不得不新开一个终端;
所以,为了能够有更好的体验,我们更希望redis作为一个服务,在系统的后台运行;
(3)使用【docker run -d redis】的方式,启动【包含redis服务的,docker容器】让容器在后台运行;并且,容器会自动把其中的redis服务给开启;
……………………………………………………
-d:该参数的意思是,在后台启动;
三:在外部访问【CentOS系统中的、包含redis的docker容器中的:redis服务】;
说明:这儿仅仅是出于方便观察是否能访问的到【CentOS系统中的、包含redis的docker容器中的:redis服务】;我们在【包含redis的docker容器,所在的,CentOS系统】中,也安装了一个redis;;;;;;这样一来,我们把【CentOS系统中的、包含redis的docker容器,给启动后】,我们就能够在CentOS系统中(相对于docker容器中的redis服务,其所在的CentOS系统,就是外部了),通过在【CentOS系统安装的redis,提供的redis-cli客户端】去操作【CentOS系统中的、包含redis的docker容器中的:redis服务】了;;;;;;按理说,为了更完美的展现在外部访问【CentOS系统中的、包含redis的docker容器中的:redis服务】;我们应该在另一个CentOS系统中,访问我们我们在【test-docker这个CentOS系统中的,包含redis的docker容器中的:redis服务】;但这儿,我们偷懒了一下;其实,也可以想象,只要我们在test-docker这个CentOS系统中,能够访问到【自己系统上的、包含redis的docker容器中的:redis服务】;那么,我们在其他的CentOS系统中,自然也可以访问的到;
准备工作:在外部的CentOS系统上,安装个redis;
● 在test-docker这个CentOS系统中,安装redis;可以参考【Redis入门二:Linux系统下安装Redis;】 ;
● 然后,也可以顺手把redis设为后台运行(PS:虽然redis是否设为后台运行,与本篇博客没半毛钱关系);可以参考【Redis入门四:Redis基本配置一:redis常用配置简介;后台运行(daemonize);】;
开始演示:
(1)首先,打开我们演示用的CentOS系统;
(2)然后,打开【CentOS系统上的docker】,但不启动【包含redis的docker容器】;
(3)然后,在没有启动【包含redis的docker容器】的时候,使用【CentOS系统上的redis】提供的redis-cli客户端,去尝试连接【包含redis的docker容器】中的redis;
有关redis的客户端redis-cli的内容,如有需要可以参考【Redis入门六:Redis常用命令;(select、set、get、keys、dbsize、exists、del、expire、ttl)】;(PS:其实,在CentOS上,我们要想使用CentOS上安装的redis的redis-cli,应该先要把redis给启动才对~~)
(4)既然连接不成功,就exit退出;
(5)使用【docker run -d -p 8888:6379 redis】命令,去设置端口,并访问【包含redis的docker容器】中的redis服务;
docker run:启动容器;;;;;-d:在后台启动;;;;;-p 8888:6379 redis:已知【包含redis的docker容器】中的redis服务的端口是6379;这句话的意思就是,把外部的CentOS的8888端口映射到容器里的6379端口;也就是,其他服务器,访问我们CentOS的8888端口的时候,其就会请求到docker容器的6379端口,而6379端口是redis的端口,自然也就会访问到docker容器中的redis服务了;这人-p的作用是,建立一个桥梁,让docker容器的外部和内部,建立一个连接;
(6)此时,再使用【CentOS系统上的redis】提供的redis-cli客户端,去尝试连接【包含redis的docker容器】中的redis;
(7)验证;
(8)总结;
这样一来,情况就变成了这样:【我们在CentOS服务器上,部署了一个“包含redis的docker容器”】→【然后,我们启动CentOS上安装的docker】→【然后,我们使用“docker run -d -p 8888:6379 redis”,去启动那个“包含redis的docker容器”,同时也建立了docker容器内外的一个连接】→【那么,比如在我们部署项目的服务器上,访问上面那个CentOS的8888端口时,就会访问到docker容器中的redis服务】;比较完美了哈;所以(再重复说一下,防止自己迷糊),上面【在test-docker这个CentOS系统中,安装redis;】在这儿的作用,仅仅是为了方便自己观察和学习;
(9)目前,按照自己对docker浅薄的认识,能想到的后续疑问:在实际中,docker容器的部署策略、集群策略等内容;
四:dockerfile简介:制作自己的镜像;
几点说明:
(1)dockerfile的主要作用是,帮助开发者制作一个自己的镜像;
(2)如果我们把【我们的软件,包括其所依赖的环境】打包成镜像的话,我们把这个镜像发布出去后,别人在使用我们软件的时候,就不用考虑环境的问题了;;;;;这不仅减少了使用者的工作量,自然有利于推广我们的软件;
(3)这儿仅仅是最简单的一个入门性质的介绍;后续,还需要较为系统的学习下Docker的内容;如有需要,也可以参考下【Docker Dockerfile】中的内容;
开始演示:
(1)为了排出任何可能的干扰,我重启了test-docker这台部署了CentOS的虚拟机;
(2)首先,可以在root目录下,创建一个文件夹,这个文件夹的名字可以起做Dockerfile;这个文件专门使用来制作镜像的;
(3)然后,使用vim工具,在/root/Dockerfile文件夹下,创建一个名字为Dockerfile文件(目测,这个文件的名字必须要起为Dockerfile);并在其中写一些内容(这儿的内容,仅为演示用,比较简单);
有关Vim的内容,如有需要可以参考【Linux入门七:vim文本编辑器;】;
(4)然后,使用【docker build -t myimage .】,利用Dockerfile文件,去制作镜像;(PS:记得要先启动docker)
docker build:docker的build命令,其意思是制作一个镜像;-t:这个是打tag的意思,即给我们将要制作的镜像起个名字;myimage:我们给将要制作的镜像起个名字;.:这个点的意思是,在当前路径,即指明Dockerfile这个文件就在当前目录下;
(5)然后,可以使用【docker run myimage】去启动这个myimage镜像;