序
Docker 自开源以来受到了各大公司的广泛关注,或许现在互联网公司的运维体系不承载在 Docker(或 Pouch 等)之上都不好意思说自己的互联网公司。
本文会简单介绍下 Docker 的基础概念,入门级使用方式和一些使用 Docker 能大大提升效率的场景。
原理
对 Docker 最简单并且带有一定错误的认知就是 “Docker 是一种性能非常好的虚拟机”。
正如上面所说,这是有一定错误的说法。Docker 相比于传统虚拟机的技术来说先进了不少,具体表现在 Docker 不是在宿主机上虚拟出一套硬件后再虚拟出一个操作系统,而是让 Docker 容器里面的进程直接运行在宿主机上(Docker 会做文件、网络等的隔离),这样一来 Docker 会 “体积更轻、跑的更快、同宿主机下可创建的个数更多”。
Docker 中有三个核心概念:Image、Container、Repository。
- Image: 有领“好人卡”倾向的广大程序猿一定对 镜像 的概念不会陌生。但和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个 git 仓库的区别)。
- Container: 容器的存在离不开镜像的支持,他是镜像运行时的一个载体(类似于实例和类的关系)。依托 Docker 的虚拟化技术,给容器创建了独立的端口、进程、文件等“空间”,Container 就是一个与宿机隔离 “容器”。容器可宿主机之间可以进行 port、volumes、network 等的通信。
- 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
镜像制作好了,怎么共享出去让别人使用呢"_blank" href="https://hub.docker.com/" rel="external nofollow" rel="external nofollow" >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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]