Jocx's blog

来了就先看看吧,没准有用呢?

0%

【基础】Docker的理解与入门使用

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镜像源以提高速度:

  1. 进入阿里云镜像仓库获取镜像加速器;创建个人/企业实例后进入左边工具栏:镜像工具-镜像加速器,复制加速器地址。

  2. 进入/etc/docker/daemon.json添加地址(如果没有则在该目录下新建一个配置文件)。

    1
    2
    3
    4
    5
    6
    7
    8
    vi /etc/docker/daemon.json

    # 文件内容
    {
    "registry-mirrors": ["https://xxxxxxx.aliyuncs.com"]
    }

    # 保存并关闭

    其中,https://xxxxxxx.aliyuncs.com就是你加速器的url。

    重启docker并使其生效

    1
    2
    3
    systemctl 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
2
3
4
5
# 查看只在运行的容器
docker ps

# 查看所有容器
docker ps -a

进入容器

1
docker exec -it 容器名称|容器ID 命令
  • 这个命令是指打开容器终端的工具,Linux下一般都可以用/bin/bash

停止容器

1
docker stop 容器名称|容器ID

重启/启动容器

1
2
3
4
5
# 启动关闭的容器
docker start 容器名称|容器ID

# 重启正在运行的容器
docker restart 容器名称|容器ID

虚拟网桥

docker容器默认使用docker桥接网络。ip地址会自动分配,每个容器都是连接到网桥上,如果想让容器与宿主机同一网段的其他宿主机之间能访问,需在启动的时候将docker容器的某个端口映射到该宿主机的端口,其他宿主机连接宿主机的Ip和端口即可访问容器。

我们在将容器连接到网桥时,需要先创建一个虚拟网桥。

1
docker network create NET_NAME
  • 创建一个名为NET_NAME的虚拟网桥。

然后就可以在docker run命令的参数里将容器连接至网桥了。

其他

查看底层信息

docker提供了查看底层所有信息的命令:

1
2
3
4
5
6
7
8
# 查看容器的底层信息
docker container inspect 容器名称|容器ID

# 查看虚拟网桥的底层信息
docker network inspect 虚拟网桥名称

# 查看镜像的底层信息
docker image inspect 镜像名称|镜像ID

进阶阅读

给出了其他网友对docker的理解:

-------------本文结束 感谢您的阅读-------------