上篇
前言
本章节将记录讲述关于Docker的实战操作,最终目的是为了解决开发过程中使用Docker的常见问题。在这一章节的最后,我们将利用Docker实现一套优雅舒适的开发体验。
实战
如何安装Docker
有很多种方式和场景可以安装Docker,包括但不限于Linux、Windows、Mac、云服务器、个人PC等等,诸如此类的例子还有很多。当然还可以以各种姿势安装,包括手动安装、脚本安装和通过向导方式安装等等。总之,Docker可以无处不在,随心所欲,简单而强大。
桌面安装:
服务器安装:
重点:这一节必会的是Linux和Windows系统下安装Docker,因为这是最为普遍的开发环境和部署环境
如何获取镜像
首先,我们先了解一下Docker镜像都有哪些来源:
-
镜像仓库服务,如: Docker Hub 、阿里云容器镜像服务、公司/个人搭建的私有镜像仓库
镜像仓库是我们获取镜像最重要的方式,一般分为官方仓库和非官方仓库。Docker Hub是Docker CLI默认使用的镜像仓库,它是Docker官方搭建并维护的镜像仓库服务,但它也分为官方仓库和非官方仓库。
-
自己通过
docker build
命令生成镜像 -
离线镜像
以下讲一下最常用的从Docker Hub获取镜像的过程:
-
搜索镜像
docker search ${image name}
例如搜索centos镜像:
docker search centos
更多搜索方式请查看docker search --help
-
获取镜像
docker pull ${image name}:${image version}
例如获取centos 7镜像
docker pull centos:7
更多获取方式请查看
docker pull --help
-
查看镜像
docker images # 或者 docker image ls
-
删除镜像
docker rm ${image name}
例如删除centos
docker rm centos
更多删除方式请查看
docker rm --help
-
其他镜像操作 Image镜像
如何运行容器
在讲解Docker容器操作前,应当先了解一下容器的整个生命周期,对照生命周期来理解每个命令的作用将事半功倍!
-
启动容器
-
新建并启动
$ docker run --name mycentos centos echo 'Hello,world!' Hello,world!
PS:
–name
参数就是为运行的容器起一个名称,这里是为了方便我们后续的操作。Docker中可以用生成的ID和名称确定一个容器。思考:
这里如果你运行
docker ps -a
来查看所有容器,你将会发现刚刚运行的容器状态是Exited
也就是停止状态(Stopped)。那上面的命令执行后,容器的生命周期流程是怎么样的呢?
当利用
docker run
来创建容器时,Docker 在后台运行的标准操作包括:- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
-
启动已终止容器
docker start ${image name/image id}
例如我们重新运行一下刚才的centos容器:
docker start mycentos
此时可以通过
docker ps
来查看运行中的容器
-
-
守护态运行
docker run -d ${image name/image id}
这里我们仅仅加了一个参数
-d
就实现了以守护态运行,也就是我们常说的后台运行。但是这里必须注意的是,仅仅这样还不行。
这主要是因为Docker会自动停止没有进程运行的容器!
你可以尝试一下这个操作:
docker run --name mycentos -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
你或许已经猜到,这里仅仅是启动Docker容器,并在后台运行一个一直循环的程序。
你可以试试
docker ps
和docker logs mycentos
看看有什么事情发生? -
终止容器
docker stop ${image name/image id}
此外,
docker restart
可以将一个运行态的容器终止,然后再重新启动它。 -
进入容器
上面说到我们可以通过
-d
参数使容器后台运行,但是之后我们如何重新进入容器内部进行操作呢?下面有两种方式,留意它们的细微差别。-
attach命令进入
docker attach ${image name/image id}
接着上面正在执行循环程序的容器讲,执行
docker attach mycentos
,告诉我你看到了什么? -
exec命令进入
docker exec -it ${image name/image id} ${命令}
-it
是两个参数的合并写法,最终效果是让我们以交互模式进入容器此时,我们可以像在centos系统中一样,进行一些简单操作,快试试
ls
吧思考一下:一直循环打印
hello world
去哪了? -
有什么不同?
虽然attach和exec命令都可以让我们进入容器中一顿操作,但是attach是进入当前正在后台运行的命令终端窗口。而exec则是为我们重新打开了一个终端窗口,就是这么简单,神奇的事情似乎变得越来越简单了。
-
-
删除容器
docker rm ${image name/image id}
-
其他容器操作 Docker容器
小结
这一节的重点就是容器生命周期图,通过生命周期中各个状态之间的转换我们可以深刻理解每个命令的含义。
另外,我们可以发现Docker是如此的简单优美,这是因为它的命令跟Linux命令几乎相差无几。
未完待续。。。 同学们有什么想了解的都可以在下方留言,我会逐步完善这篇文章,帮助大家完全掌握强大的Docker!