从 0 开始了解 Docker

原文地址:github.com/rccoder/blo…前端

或许 XX 震惊部应该这样起名:《了解 Docker,看完这篇就行!》node

Docker 自开源以来受到了各大公司的普遍关注,或许如今互联网公司的运维体系不承载在 Docker(或 Pouch 等)之上都很差意思说本身的互联网公司。git

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

原理

对 Docker 最简单而且带有必定错误的认知就是 “Docker 是一种性能很是好的虚拟机”。docker

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

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

  • Image: 有领“好人卡”倾向的广大程序猿必定对 镜像 的概念不会陌生。但和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,而非简单的一堆文件迭在一块儿(相似于一个压缩包的源码和一个 git 仓库的区别)。ubuntu

  • Container: 容器的存在离不开镜像的支持,他是镜像运行时的一个载体(相似于实例和类的关系)。依托 Docker 的虚拟化技术,给容器建立了独立的端口、进程、文件等“空间”,Container 就是一个与宿机隔离 “容器”。容器可宿主机之间能够进行 port、volumes、network 等的通讯。windows

  • 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 能够在云端新建容器,远程 无污染、低成本 构建代码,实现 不一样人用的必定是同一个版本

题外:为何我不使用 shrinkwrap(lock)

3. 复杂环境一键配置

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

4. 持续集成单元测试

相似于 travis-ci 这种

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

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

4. 省钱

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

参考连接

原文地址:github.com/rccoder/blo…

相关文章
相关标签/搜索