从0开始了解Docker入门(小结)

Docker 自开源以来受到了各大公司的广泛关注,或许现在互联网公司的运维体系不承载在 Docker(或 Pouch 等)之上都不好意思说自己的互联网公司。

本文会简单介绍下 Docker 的基础概念,入门级使用方式和一些使用 Docker 能大大提升效率的场景。

原理

对 Docker 最简单并且带有一定错误的认知就是 “Docker 是一种性能非常好的虚拟机”。

正如上面所说,这是有一定错误的说法。Docker 相比于传统虚拟机的技术来说先进了不少,具体表现在 Docker 不是在宿主机上虚拟出一套硬件后再虚拟出一个操作系统,而是让 Docker 容器里面的进程直接运行在宿主机上(Docker 会做文件、网络等的隔离),这样一来 Docker 会 “体积更轻、跑的更快、同宿主机下可创建的个数更多”。

Docker 中有三个核心概念:Image、Container、Repository。

  1. Image: 有领“好人卡”倾向的广大程序猿一定对 镜像 的概念不会陌生。但和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个 git 仓库的区别)。
  2. Container: 容器的存在离不开镜像的支持,他是镜像运行时的一个载体(类似于实例和类的关系)。依托 Docker 的虚拟化技术,给容器创建了独立的端口、进程、文件等“空间”,Container 就是一个与宿机隔离 “容器”。容器可宿主机之间可以进行 port、volumes、network 等的通信。
  3. Repository: Docker 的仓库和 git 的仓库比较相似,拥有仓库名、tag。在本地构建完镜像之后,即可通过仓库进行镜像的分发。常用的 Docker hub 有 https://hub.docker.com/https://cr.console.aliyun.com/ 等。

相关命令

1. 安装

Docker 的安装是非常便捷的,在 macOS、ubuntu 等下面都有一键式安装工具或者脚本。更多可以参考 Docker 官方教程。
安装后 Terminal 中敲下 docker,有使用说明出来的话大多情况下说明已经安装成功了。

2. 寻找基础镜像

DockerHub 等网站都提供了众多镜像,一般情况下我们都会从它那找个镜像作为基础镜像,然后再进行我们的后续操作。

这里我们以 ubuntu基础镜像为例,配置一个 node 环境。

因为 “链路太长” 的原因,国内访问 Docker Hub 可能会比较慢,可以使用国内众多厂商提供的镜像加速器

3. 拉取基础镜像

利用 docker pull命令即可从相关 hub 网站上拉取镜像到本地。同时在拉的过程中就能看到是按照多个 “层” 去拉镜像的。
> docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu
c448d9b1e62f: Pull complete
0277fe36251d: Pull complete
6591defe1cd9: Pull complete
2c321da2a3ae: Pull complete
08d8a7c0ac3c: Pull complete
Digest: sha256:2152a8e6c0d13634c14aef08b6cc74cbc0ad10e4293e53d2118550a52f3064d1
Status: Downloaded newer image for ubuntu:18.04

执行 docker images即可看到本地所有的镜像

> docker images
REPOSITORY        TAG         IMAGE ID      CREATED       SIZE
ubuntu          18.04        58c12a55082a    44 hours ago    79MB

4. 创建一个 Docker 容器

docker create 命令通过镜像去创建一个容器,同时吐出容器 id。

> docker create --name ubuntuContainer ubuntu:18.04
0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778

docker start即可运行改容器。

> docker start ubuntuContainer

docker ps即可查看运行中的 container

> docker ps
CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS       PORTS        NAMES
9298a27262da    ubuntu:18.04    "/bin/bash"     4 minutes ago    Up About a minute            ubuntuContainer

docker exec即可进入该 container。

> docker exec -it 9298
root@9298a27262da:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@9298a27262da:/# exit

docker run可以一步到位创建并运行一个容器,然后进入该容器。

> docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash
root@57cdd61d4383:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@57cdd61d4383:/#

# docker ps 可以查到已经成功运行了 runUbuntuContainer
> docker ps
CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS       PORTS        NAMES
57cdd61d4383    ubuntu:18.04    "/bin/bash"     9 seconds ago    Up 8 seconds              runUbuntuContainer
9298a27262da    ubuntu:18.04    "/bin/bash"     9 minutes ago    Up 6 minutes              ubuntuContainer

5. 在容器里安装 Node 环境

进入容器之后一切操作和普通环境一致,我们安装个简单的 node 环境

> apt-get update
> apt-get install wget
> wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

# 安装完之后可能当前 session 读不到 nvm 命令,可以 exit 之后再进入中终端环境
> nvm install 8.0.0
> node -v

6. commit 容器,创建新镜像

和 Ghost 装 windows 一样,很多时候,我们期望能定制自己的镜像,在里面安装一些基础环境(比如上文中的 node),然后制作出自己要的基础镜像。这个时候 docker commit 就派上用场了。

> docker commit --author "rccoder" --message "curl+node" 9298 rccoder/myworkspace:v1
sha256:68e83119eefa0bfdc8e523ab4d16c8cf76770dbb08bad1e32af1c872735e6f71

# 通过 docker images 就能看到新制作的 rccoder/myworkspace 就躺在这里了
>docker images
REPOSITORY        TAG         IMAGE ID      CREATED       SIZE
rccoder/myworkspace   v1       e0d73563fae8    20 seconds ago   196MB

接着,试一下我们新创建的镜像?

> docker run -it --name newWorkSpace rccoder/myworkspace:v1 /bin/bash
root@9109f6985735:/# node -v
8.0.0

看起来没问题。

7. push 镜像到 docker hub

镜像制作好了,怎么共享出去让别人使用呢?这里以 push 到docker hub为例。

第一步是先去 docker hub 注册一个账号,然后在终端上登录账号,进行 push。

> docker login
> docker push rccoder/myworkspace:v1
The push refers to repository [docker.io/rccoder/myworkspace]
c0913fec0e19: Pushing [=>                         ] 2.783MB/116.7MB
bb1eed35aacf: Mounted from library/ubuntu
5fc1dce434ba: Mounted from library/ubuntu
c4f90a44515b: Mounted from library/ubuntu
a792400561d8: Mounted from library/ubuntu
6a4e481d02df: Waiting

8. 是时候使用 Dockerfile 了

用 Docker 进行持续集成?相比在了解 Docker 之前肯定听过这个事情,那就意外着需要从某个地方拷贝代码,然后执行(对,听上去有点travis-ci的那种感觉)。

是时候该 Dockerfile 出场了!

Dockerfile 是一个由一堆命令+参数构成的脚本,使用 docker build 即可执行脚本构建镜像,自动的去做一些事(同类似于travis-ci 中的 .travis.yml)。

Dockerfile 的格式统统为:

# Comment
INSTRUCTION arguments

必须以 FROM BASE_IMAGE 开头指定基础镜像。

更详细的规范与说明请参考 Dockerfile reference。这里我们以基于上面的 rccoder/myworkspace:v1 作为基础镜像,然后在根目录创建 a 目录为例

Dockerfile 如下:

FROM rccoder/myworkspace:v1
RUN mkdir a

然后执行:

> docker build -t newfiledocker:v1 .
Sending build context to Docker daemon 3.584kB
Step 1/2 : FROM rccoder/myworkspace:v1
 ---> 68e83119eefa
Step 2/2 : RUN mkdir a
 ---> Running in 1127aff5fbd3
Removing intermediate container 1127aff5fbd3
 ---> 25a8a5418af0
Successfully built 25a8a5418af0
Successfully tagged newfiledocker:v1

# 新建基于 newfiledocker 的容器并在终端中打开,发现里面已经有 a 文件夹了。
> docker docker run -it newfiledocker:v1 /bin/bash
root@e3bd8ca19ffc:/# ls
a bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

借助 Dockerfile 的能力,Docker 留下了无限的可能。

能做什么

说了这么一堆,那实际生产环境中 Docker 能做什么呢?常用的可能有下面这些(欢迎在评论中补充)

1. 多环境的部署切换

业务开发中往往需要区分开发环境与线上环境,利用 Docker 能原封不动的将开发环境中的 代码与环境原封不动无污染的 迁移到线上环境,配合一定的自动化流程即可实现自动的发布。

2. 前端云构建

因为 node_modules 的蛋疼问题,同一个仓库下不同人开发往往会遇到不同的人使用不同的 包版本 且自己根本不知道与别人不一样,最终导致发布之后产生线上问题。利用 Docker 可以在云端新建容器,远程 无污染、低成本 构建代码,实现 不同人用的一定是同一个版本。

3. 复杂环境一键配置

某些场景下可能会配一些超级复杂的环境(比如:大一同学配 Java 环境),这个时候可以利用 Docker 对环境配置做封装,直接生成镜像,让大家低成本使用。

4. 持续集成单元测试

类似于 travis-ci 这种

5. 同应用多版本隔离、文件隔离

比如这个项目依赖 node6,那个项目依赖 node 8(只是举例子,硬盘够大的话还是建议通过 nodeinstall解决);同一台服务器上跑了 100 个 wordpress 程序(可以用 Docker 建立隔离开,防止互相污染)。

4. 省钱

嗯,低成本安全超售(大雾)

参考链接

Use the Docker command line
Dockerfile reference
Best practices for writing Dockerfiles

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 从零开始构建docker基础镜像的方法
  • 浅谈Docker基础之数据管理
  • Docker基础 :网络配置详解
  • Dockerfile基础分享
  • 关于Docker的基础概念分享
  • Docker 教程之获取镜像基础知识详解
  • Docker基础命令详解
  • Docker基础学习之数据管理
(0)

相关推荐

  • Docker基础 :网络配置详解

    大量的互联网应用服务包含多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合.Docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务.接下来我们将讲述 Docker 的网络功能,包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信. 端口映射实现访问容器 从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的.当容器中运行了一些网络应用,要让外部访问

  • 浅谈Docker基础之数据管理

    用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据卷(Data Volumes),数据卷容器(Data Volume Containers). 数据卷 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: 1.数据卷可以在容器之间共享和重用. 2.对数据卷的更改会立即生效. 3.对数据卷的更新不会影响镜像. 4.数据卷会一直

  • Docker 教程之获取镜像基础知识详解

    获取镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一. Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库). 本章将介绍更多关于镜像的内容,包括: 从仓库获取镜像: 管理本地主机上的镜像: 介绍镜像实现的基本原理. 可以使用 docker pull 命令来从仓库获取所需要的镜像. 下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像.

  • 关于Docker的基础概念分享

    简介 如官方文档所说,docker是一个自动将应用打包成轻量可移植自包涵的容器的引擎.开发者构建的应用可以一次构建全平台运行,包括本地开发机,生产环境,虚拟机和云等.目前处于开发阶段,不可用于生产环境.在你启动一条命令时docker会调用lcx等其他一个组建为这条命令构建一个container,包含了进程运行的所有资源.但是官方文档以说明,docker处于开发阶段目前还不能用于生产环境. 特性 Go语言编写 基于lxc的进程级隔离,而lxc基于cgroup,轻量级 通过cgroup做到文件系统,

  • Docker基础学习之数据管理

    前言 docker容器中管理数据主要有两种方式,数据卷(Data Volumes)和数据卷容器(Data Volume Containers),下面我们详细介绍Docker中的数据管理,有需要的一起来学习学习吧. 数据卷 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用: 对数据卷的修改会立马有效: 对数据卷的更新,不会影响镜像: 卷会一直存在,直到没有容器使用. 数据卷的使用,类似于Linux下对目录或文件进行mount操作. 挂载本

  • Dockerfile基础分享

    关键字 Dockerfile中以#开头的行全为注释行 FROM <image>:<tag> 指定基础镜像 MAINTAINER <name> 指定维护者信息 RUN <command> 或 RUN ["executable file", "parameter1", ...] 在当前镜像中执行指定命令,执行的结果会被镜像保存 CMD 用法类似于RUN,用于指定Docker容器启动时执行的命令.Dockerfile中只能有

  • Docker基础命令详解

    docker基本概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上. Docker是一个重新定义了程序开发测试.交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的"Build once,Run anywhere" 创建镜像 创建镜像的方法有三种: 基于已有的容器创建 基于本地模板导入 基于dockerfile 基于已有的容器创建 主要使用docker

  • 从零开始构建docker基础镜像的方法

    段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我碰见一朋友,问今年挣了吗?他望着天空喃喃自语:挣个鸟!看吧,只要肯努力,什么都能挣到. 年末将至,忽然发现,从创建开始到现在,整整一年时间,没有写过多少东西.为了留下一点痕迹,也是为了整理一下自己的收获,为17年画上一笔浓郁的色彩. 最近在看一本入门级机器学习的书,里面的案例基本上是python实现

  • 从0开始了解Docker入门(小结)

    序 Docker 自开源以来受到了各大公司的广泛关注,或许现在互联网公司的运维体系不承载在 Docker(或 Pouch 等)之上都不好意思说自己的互联网公司. 本文会简单介绍下 Docker 的基础概念,入门级使用方式和一些使用 Docker 能大大提升效率的场景. 原理 对 Docker 最简单并且带有一定错误的认知就是 "Docker 是一种性能非常好的虚拟机". 正如上面所说,这是有一定错误的说法.Docker 相比于传统虚拟机的技术来说先进了不少,具体表现在 Docker 不

  • 什么是docker Docker入门教程第一篇

    Docker是个新生的事物,概念类似虚拟化.网上关于Docker入门的东西已经很多了.不过本文探讨了Docker的特点.特性.原理,还介绍了具有中国特色的安装测试过程,另外还谈到了Docker的社区生态和Dockerfile,并使用Dockerfile构建一个nginx环境. 缘起 在几个月前听说Docker,但是一直没有时间去研究,前一段时间趁着azure免费试用,赶紧实验一下,但是卡在了ubuntu基础镜像的下载上(由于国内网络的特殊原因),所以也就搁浅了,这里把经验和体会分享一下. Doc

  • 一篇教会你写90%的shell脚本(入门小结)

    shell脚本? 在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls.cd.pwd等等.总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动.暂停.停止程序的运行或对计算机进行控制. shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效.安全.低成本地使用 Linux 内核,这就是 Shell 的本质.

  • vmware vSAN入门小结

    一.背景简介 1.简单介绍vsphere的共享存储背景 vSphere里面有个重要的功能就是进行虚拟机封装,一个虚拟机以文件的形式存在,可以任意拷贝,比如.vmx虚拟机配置文件,vmdk数据文件等 vSphere下还有个集群的概念,一个集群视为一个资源池,搭配很多vSphere的高级特性,业务可以在集群中任意主机上,不必担心单主机故障 如下图所示,vSphere的故障恢复机制 HA,可以将故障主机上的虚拟机迁移到其他主机运行. 但是这个特性有个前提是共享存储,一个存储可以被多个服务器同时连接,同

  • 开发者必备Docker命令小结

    目录 Docker 简介 Docker 环境安装 Docker 镜像常用命令 搜索镜像 下载镜像 如何查找镜像支持的版本 列出镜像 删除镜像 Docker 容器常用命令 新建并启动容器 列出容器 停止容器 强制停止容器 启动已停止的容器 进入容器 删除容器 查看容器的日志 查看容器的IP地址 同步宿主机时间到容器 在宿主机查看docker使用cpu.内存.网络.io情况 进入Docker容器内部的bash 修改Docker镜像的存放位置 本文主要讲解Docker环境的安装以及Docker常用命令

  • C# XML基础入门小结(XML文件内容增删改查清)

    目录 前言: 什么是XML? XML的优缺点 XML的优点 XML的缺点 XML简单示例 XML中5个预定义的实体引用 C#把特殊符号转换为转义字符 C#创建简单的XML文件 创建生成的Xml文件 C#在XML文件添加节点 添加节点成功后的XML文件内容 C#修改XML文件节点的数据 修改后的XML文件内容 C#删除XML文件中的指定节点 C#清空指定XML节点数据 学习参考资料 前言: 最近对接了一个第三方的项目,该项目的数据传输格式是XML.由于工作多年只有之前在医疗行业的时候有接触过少量数

  • webpack4.0打包优化策略整理小结

    本文介绍了webpack4.0打包优化策略整理小结,分享给大家,具体如下: webapck4 新特性介绍-参考资料 当前依赖包的版本 1.优化loader配置 1.1 缩小文件匹配范围(include/exclude) 通过排除node_modules下的文件 从而缩小了loader加载搜索范围 高概率命中文件 module: { rules: [ { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/, // 排除不处理的目录

  • 一篇文章学会Docker命令小结

    简介 Docker的命令分为使用命令和管理命令,而本文对Docker的使用命令和管理命令进行了汇总和样例提示,以便于他人学习和本人回顾使用. Docker不仅提供了在各个环节下使用的命令,还提供了DockerAPI供我们使用Http来和Docker进行交互,从而开发我们自己的Docker. 由于命令太多,下面给出一个大致的清单供大家对所有命令有一个初步了解,然后就是哪里不会点哪里. 管理命令: container 管理容器 image 管理镜像 network 管理网络 node 管理Swarm

  • mysql迁移至8.0时的注意事项(小结)

    密码模式 PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] mysql8 之后,默认的密码模式改为 caching_sha2_password,新的模式需要新的驱动,至少现在 pdo / navicat 还没给出,所以我们还是得切换成老的 mysql_native_password 模式. `mysql_native_passwo

  • 详解如何用SpringBoot 2.3.0.M1创建Docker映像

    1.发布 SpringBoot2.3.0.M1刚刚发布,它带来了一些有趣的新特性,可以帮助您将SpringBoot应用程序打包到Docker映像中.在这篇博客文章中,我们将查看创建Docker映像的典型方式,并展示如何通过使用这些新特性来改进这些镜像 2.说明 SpringBoot 2.3.0.M1 暂时不支持Windows, 很鸡肋 暂时在Mac 和Linux 上运行良好 3.常见的Docker 运行方式 一般情况下,通过docker 运行springboot 是这样的 FROM openjd

随机推荐