Docker入门

文章目录
  1. 1. 前言
  2. 2. 正文
    1. 2.0.1. 什么是Docker
      1. 2.0.1.1. 虚拟机
      2. 2.0.1.2. Linux容器
      3. 2.0.1.3. Docker
    2. 2.0.2. 安装
    3. 2.0.3. 容器和镜像
      1. 2.0.3.0.1. 镜像
      2. 2.0.3.0.2. 容器
      3. 2.0.3.0.3. Hello-world
  3. 2.0.4. Dockerfile
    1. 2.0.4.1. 实例

前言

本文2384字,阅读大约需要8 分钟。

总括: Docker的大名闻名已久,但一直没实践过,出于工作需要,最近作为小白用户对Docker进行了一个学习,站在小白用户的角度去总结下Docker的一些概念和命令。PS:Docker小白的文章,有错误还望大佬指出,不胜感激~

  • 参考文章:Docker
  • 公众号:「前端进阶学习」,回复「666」,获取一揽子前端技术书籍

吾生也有涯,而知也无涯。

正文

什么是Docker

虚拟机

为了使用一些特定操作系统才能运行的软件我们很早之前就有了虚拟机的解决方案,在window系统中安装黑苹果、在window系统安装linux系统、或是在苹果系统中安装window系统都是很常见的一些操作,但虚拟机缺点很多,比如:

  • 安装麻烦,折腾过window系统中安装黑苹果的同学肯定深有感触;
  • 启动慢,启动时间等同于启动一个操作系统的时间;
  • 占用空间大,往往一个虚拟机要占用本地资源十几个G甚至几百G;
Linux容器

Linux容器,是一种在操作系统层虚拟化技术,它的实现原理是将应用软件系统打包成一个软件容器,在这个软件容器里面包含了软件本身的代码以及软件运行所需要的操作系统核心和库,通过统一的名称空间和共享的Api来分配不同软件容器所需要的硬件资源,从而为软件打造出一个独立的沙箱运行环境。

这样一来,整个软件容器需要的空间就会很小,启动速度就会很快,而且安装很方便(运行软件容器就好了)。这种方案在保持了虚拟机优点的同时也解决了虚拟机所具有的缺点。

Docker

而我们的主角Docker就是目前Linux容器的最流行的一个解决方案。Docker是将操作系统层虚拟化,而虚拟机是将硬件资源进行一个虚拟化。也就是说,相比虚拟机Docker可以更好地利用硬件资源。基于此,Dockcer容器其实是软件的一个标准化单元,容器的标准化也就让这个软件可以无视本地的基础设施,也就是说这个软件此时可以部署到任何一个地方。

安装

这一步很简单去Docker官网下载对应的安装包安装Docker,安装好了点击软件图标启动即可。

顺利的话安装完成后运行下面命令会有输出:

1
$ docker version

附:在Linux下启动Docker的命令:

  • systemctl:

    1
    $ sudo systemctl start docker
  • service:

    1
    $ sudo service docker start

容器和镜像

容器和镜像这是Docker中的两个概念,注意这里的容器和前文中的“软件容器”不是同一个概念。镜像和容器的关系可以类比类和实例对象的关系,同一个镜像(类)可以生成很多个同事运行的容器(实例对象)。其实前面说的软件容器就是这里的镜像。

镜像

Docker我们可以创建很多个镜像,然后开源出去,如果我想用别人的镜像,从哪里找镜像呢?Docker官方有个专门的地方是来存放镜像的: Dockerhub。这其实和gayhub类似,就是个放东西的地方。当然这个镜像仓库我们也可以搭建私有的,比如一些大公司就有自己的私有镜像仓库。

镜像还有另外一个名字:叫做image文件。你可以通过:

1
2
# 列出本机的所有的image 文件
$ docker image ls

来查看你本地的image文件。

image文件的本质是一个二进制文件。因此image文件是通用的,这个前面也提过,一台机器上的image文件拷贝到另一台机器上,照样可以运行,不会因为操作系统的不同而无法使用。在实际使用中我们往往通过继承另一个image文件再自行实现一些定制化的需求来使用,不建议重复造轮子。

image文件同样可以通过docker命令去删除:

1
2
# 删除image文件
$ docker image rm [image]

其它有用的镜像命令:

1
2
3
4
# 根据dockerfile创建image文件
$ docker image build [OPTIONS] PATH | URL | -
# 从镜像仓库拉取镜像
$ docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

更多image命令和OPTIONS含义

容器

那么如何去运行一个image文件呢?执行下面的命令即可:

1
2
# 生成容器
$ docker container run [container]

其它有用的容器命令:

1
2
3
4
5
6
# 关闭某个容器
$ docker container kill [container]
# 停止正在运行的某个容器
$ docker container stop [container]
# 开始运行一个被停止的容器
$ docker container start [container]

更多容器相关命令

除此之外还有很多的简写形式,比如docker run [container]等同于docker container run [container]吗,docker pull [OPTIONS] NAME[:TAG|@DIGEST]等同于docker image pull [OPTIONS] NAME[:TAG|@DIGEST]等。

Hello-world

首先运行下面命令来拉去镜像:

1
$ docker image pull library/hello-world

其中library是可以省略的,官方提供的镜像都放在library里面

上面的命令可以简写为:

1
$ docker image pull hello-world

此时运行:

1
$ docker image ls

这个时候应该就可以看到image列表有内容了。

然后运行这个image文件:

1
$ docker run hello-world

此时看到一段以Hello from Docker!为开头的文案输出说明这个容器就运行成功了。像这种容器运行完就会自动终止了,此时运行

1
$ docker container ls

此时不会看到有在运行的容器。但有的容器是不会自动终止的,比如一个Linux系统,运行后就不会自动终止:

1
$ docker container run -it centos /bin/bash

注意,此时我本地没有centos的镜像,但docker会自动从官方仓库里面拉取centos的镜像然后运行。解释下命令参数:

  • -i: 交互式操作

  • -t: 终端。

此时就会在本地的终端进行交互:

1
$ [root@750aa16cdc74 /]#

输入exit退出即可。

再比如运行nginx:

1
$ docker run --name nginx-test -p 8080:80 -d nginx

参数说明:

  • –name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行。

此时访问localhost:8080就会看到nginx的欢迎页面。(附:通过docker port命令可以查看容器连接本地的端口)

像这种状态下启动的容器就会一直在后台运行,需要手动调用docker container kill [container]来终止。

1
$ docker container kill [container]

上面是一个将docker的端口映射到本地端口的例子,不止如此,docker的容器和容器之间也可以互联,docker内部也可以做到访问本地的资源,在运行docker run的时候加-v命令即可。比如:

1
$ docker run -it -v ${本地项目路径}:${容器内挂载路径} nginx /bin/bash

更多docker命令可以参考官网

Dockerfile

容器和镜像命令众多,多用用相信慢慢就熟悉了,通过上面的命令已经知道了如何去使用image文件创建容器实例。那么该怎么创建image文件呢?总不能101010的去输入吧。这就用到了Dockerfile文件,他是个文本文件,docker会根据这个文件运行一些命令来创建image文件。

实例

创建一个Dockerfile文件,写入以下内容:

1
2
FROM node:latest
RUN node -v

里面的指令解释:

  • FROM: 要创建的image文件的基础镜像,这里就是基于node的镜像来进行创建image文件;
  • RUN:用于执行后面跟着的命令行。

然后运行:

1
$ docker build -t node  .

此时就会根据当前目录的Dockerfile文件创建一个image文件。当然这个例子是没有实际意义的。

其它有用的指令:

  • COPY: 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
  • CMD: 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
    • CMD 在docker run 时运行。
    • RUN 是在 docker build。
  • ENV: 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量;
  • EXPOSE: 声明端口。
  • USER: 指定后续的用户和用户组
  • WORKDIR:指定当前工作目录

更多指令可以参考官网

以上。


能力有限,水平一般,欢迎勘误,不胜感激。

转载请获本人授权,并注明作者和出处。

订阅更多文章可关注公众号「前端进阶学习」,回复「666」,获取一揽子前端技术书籍

前端进阶学习

如果您觉得我的文章对您有用,请随意打赏。

您的支持将鼓励我继续创作!

人过留名,雁过留声
听听你的声音

回复 Username 留言: content x