Docker的基础使用
内容摘要
本文用通俗易懂的语言描述了初学者应该如何理解Docker镜像和Docker容器。并且给出了一些Docker的基本操作方法。
初学者可以通过该文章快速入门Docker。
如何理解Docker
docker有点像一个虚拟机,但是又没有虚拟机那么庞大。它像一个沙箱一样,把内部环境和外部环境隔开,无论外部环境怎么变,使用者都只需关注内部的环境。这就相当于一个小世界,你在小世界里面创造发明,无论外部环境是开发环境、测试环境还是生产环境,你都无需关心,它们对于你的项目来说都是透明的。
- docker是一种跨环境的手段,而且十分轻便:当我们在开发环境下用docker创建了一个“小世界”,并且在这个“小世界”里面开发项目。当部署时,可以把一模一样的“小世界”带到部署项目的服务器上,让项目继续在这个“小世界”里面运行。完全不用担心跨环境的种种问题。
Docker里面的部分术语
- 镜像:可以理解成docker“小世界”的元数据。
- 容器:容器是docker镜像的实例,是“小世界”本身。容器在被创建后有
停止态、运行态和重启态
,它们的生命周期维持到你删除它们为止。 - 宿主机:这是一个相对的概念,当docker容器运行在某台计算机上时,该计算机相对于docker容器就叫宿主机。
镜像和容器,就像类和实例;源码和进程一样。
注:其他术语在下文出现处做解释。
使用者对docker的理解
光把docker解释为“小世界”,是不足以让人理解docker是如何运行内部项目的。我们得把“小世界”(容器)解释为一部微型计算机。
根据冯祖师爷的架构,一部计算机有:I/O、运算单元、控制单元、存储(易失性存储),这个架构是没有外存(磁盘)和网络的,无法使数据持久化和互联通信,容器也是这样。
在默认状态下,容器被分配到的资源只有cpu和内存。这说明,如果我们将项目部署到一个默认情况下启动的docker容器内容,该项目只能单文件运行一次,且无法与容器外界交流。为了让容器内的项目能够读取文件或者让文件持久化,我们需要给容器添加外存;为了让容器内的项目能够与容器外界交流,我们需要给容器配置网络。
添加外存 docker提供了一种添加外存的手段,挂载数据卷:通过docker提供的命令和参数,将宿主机的某个目录挂载到容器上,成为容器的外存,让容器拥有读写文件的能力。
注意:以上只是挂载数据卷所能达到的效果,挂载数据卷其实是绕过了联合文件系统,但是初学者在使用时可以这么理解,等未来时机成熟后去自行了解。
配置网络 在配置网络之前,我们应该先了解这点:docker容器的通信分为4种:同宿主机下,不同容器的通信;容器和宿主机的通信;容器和宿主机外部主机的通信;不同宿主机下,不同容器的通信。 我们可以通过链接(docker的link参数)或搭建虚拟网桥+端口映射来完成以上4种通信需求。前两个方法是网络层ip级别的内容,后一个方法是传输层端口级别的内容。
配置完全的docker容器,就像一台寄宿在主机上的微型服务器,有着运行项目的所有功能。
Docker基本操作
首先你得有docker,可以通过我的上一篇博客来查看docker安装步骤。
镜像
获得镜像
我们可以从Docker Hub上获取别人制作好的镜像直接使用,也可以用Dockerfile文件自行编译(这部分不在此展开)获得镜像。
1 | docker pull 镜像仓库名称 |
例如,拉取仓库名为robertlgtucker/pyspark-java8
的最新版镜像:
1 | docker pull robertlgtucker/pyspark-java8 |
可以上Docker Hub提前看好镜像的名称直接拉取。
如果拉取速度速度太慢了,可以更换阿里的docker镜像源以提高速度:
进入阿里云镜像仓库获取镜像加速器;创建个人/企业实例后进入左边工具栏:
镜像工具
-镜像加速器
,复制加速器地址。进入
/etc/docker/daemon.json
添加地址(如果没有则在该目录下新建一个配置文件)。1
2
3
4
5
6
7
8vi /etc/docker/daemon.json
文件内容
{
"registry-mirrors": ["https://xxxxxxx.aliyuncs.com"]
}
保存并关闭其中,
https://xxxxxxx.aliyuncs.com
就是你加速器的url。重启docker并使其生效
1
2
3systemctl daemon-reload
systemctl restart docker
配置完成,可以快速下载docker镜像了。
查看镜像
1 | docker images |
可以查看已经下载下来的所有docker镜像,一般包括镜像的如下信息:
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
REPOSITORY
:你从Docker Hub的哪个仓库拉下来的。可以同名。TAG
:描述某个镜像的版本信息。相同仓库的镜像通过此字段来区分。REPOSITORY:TAG
:两个字段组成了镜像名称
。
IMAGE ID
:镜像ID,全场唯一标志。CREATED
:构建的日期。SIZE
:镜像的大小。
删除镜像
1 | docker rmi 镜像名称|镜像ID |
可以删除对应镜像名称|镜像ID
的docker镜像
镜像名称和镜像ID可以通过
docker images
来查看。
容器
运行容器
基础的运行命令为:
1 | docker run 镜像名称|镜像ID |
- 这就是就是一个只要CPU和内存资源的容器了。
其完整命令为:
1 | docker run [OPTIONS] [COMMAND] [ARG...] |
其部分参数如下。这里只给出我使用过的参数,有了这些参数设置,初学者应该能比较好地跑通并将项目部署到docker容器里面了:
- 注:大写的是为某一类,而不是某个实际参数。
参数 | 含义 |
---|---|
--name NAME | 给容器命名为NAME |
--restart=STRATEGY | 设定docker预设的重启的策略STRATEGY |
-v, -volume HOST_PATH:CONTA_PATH | 挂载数据卷,将宿主机的HOST_PATH挂载到容器的CONTA_PATH |
--network VNET_NAME | 嫁接网桥,将该容器嫁接到虚拟网桥VNET_NAME里 |
--network-alias NAME | 设置容器在虚拟网桥下的别称 |
-p HOST_PORT:CONTA_PORT | 端口映射,将宿主机的HOST_PORT映射到容器的CONTA_PORT |
-d | 使容器在后台运行 |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
-dti
命令是可以三个一起使用的,一般来说测试时用it
,需要部署或在后台运行网页后端用d
;--network-alias
是很好用的,在同一个局域网下,容器的虚拟ip地址可以由这个设置过的名字代替,使用者无需关心虚拟ip的变化;- 在用
--network
参数连接虚拟网桥时,需要先创建网桥。
查看容器
1 | 查看只在运行的容器 |
进入容器
1 | docker exec -it 容器名称|容器ID 命令 |
- 这个
命令
是指打开容器终端的工具,Linux下一般都可以用/bin/bash
。
停止容器
1 | docker stop 容器名称|容器ID |
重启/启动容器
1 | 启动关闭的容器 |
虚拟网桥
docker容器默认使用docker桥接网络。ip地址会自动分配,每个容器都是连接到网桥上,如果想让容器与宿主机同一网段的其他宿主机之间能访问,需在启动的时候将docker容器的某个端口映射到该宿主机的端口,其他宿主机连接宿主机的Ip和端口即可访问容器。
我们在将容器连接到网桥时,需要先创建一个虚拟网桥。
1 | docker network create NET_NAME |
- 创建一个名为
NET_NAME
的虚拟网桥。
然后就可以在docker run
命令的参数里将容器连接至网桥了。
其他
查看底层信息
docker提供了查看底层所有信息的命令:
1 | 查看容器的底层信息 |
进阶阅读
给出了其他网友对docker的理解: