简介

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。


用途

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。


三个核心

  • 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版本
docker version

2.启动本机的docker服务
service docker start

3.列出本机的所有 image 文件
docker images
或者
docker image ls

4.删除 image 文件
docker rmi [imageName]

5.将 image 文件从远程仓库抓取到本地
docker pull hello-world

6.列出本机正在运行的容器
docker ps
或者
docker container ls

7.列出本机所有容器,包括终止运行的容器
docker container ls --all

8.运行这个image文件
docker run hello-world

9.终止运行某个docker容器
docker kill [containID]

10.终止运行的容器文件,依然会占据硬盘空间,可以使用docker rm命令删除
docker rm [containerID]

11.运行这个image文件,并把容器的3000端口映射到本机8000端口,同时映射shell在本地可以输入命令行
docker run -p 8000:3000 -it koa-demo /bin/bash

-p参数:容器的 3000 端口映射到本机的 8000 端口。
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 > latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。

12.创建image文件
docker build -t koa-demo .

-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

13.登陆远程仓库
docker login

14.为本地的 image 标注用户名和版本
docker tag [imageName] [username]/[repository]:[tag]
docker tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

15.发布 image 文件
docker push [username]/[repository]:[tag]

16.新建容器,每运行一次,就会新建一个容器
docker start [containerID]

同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker start命令,它用来启动已经生成、已经停止运行的容器文件。

17.查看 docker 容器的输出,即容器里面 Shell 的标准输出
docker logs [containerID]

如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。

18.用于进入一个正在运行的 docker 容器
docker exec -it [containerID] /bin/bash
或者
docker exec -it [containerID] /bin/bash

如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。

19.从正在运行的 Docker 容器里面,将文件拷贝到本机
docker cp [containID]:[/path/to/file] .


制作自己的 Docker 容器

编写.dockerignore

.git
node_modules
npm-debug.log

上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。


编写 Dockerfile 文件

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/index.js

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app。
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
CMD node demos/index.js:表示容器启动后自动执行node demos/index.js

PSRUN命令与CMD命令的区别:简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;
CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。


创建image文件

docker build -t koa-demo:0.0.1 .

-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest
最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

创建成功后,运行 docker image ls 可以看到新生成的image文件koa-demo


生成容器

docker run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

-p参数:容器的 3000 端口映射到本机的 8000 端口。
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
koa-demo:0.0.1image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell

如果一切正常,运行上面的命令以后,就会返回一个命令行提示符,你可以在上面启动node服务。

root@66d80f4aaf1e:/app#


发布 image 文件

1.去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。

docker login

2.为本地的 image 标注用户名和版本

docker tag [imageName] [username]/[repository]:[tag]

3.发布 image 文件

docker push [username]/[repository]:[tag]

发布成功以后,登录 hub.docker.com 或 cloud.docker.com ,就可以看到已经发布的 image 文件。

参考链接

  • 从 0 开始了解 Docker
  • Docker 入门教程

Docker学习笔记相关推荐

  1. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  2. Docker学习笔记 之 Docker安装配置使用

    简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare met ...

  3. docker学习笔记(四)使用docker搭建环境

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(三)镜像 docker学习笔记 ...

  4. docker学习笔记(二)docker常用命令

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(三)镜像 docker学习笔记(四)使用docker搭建环境 docker学习 ...

  5. docker学习笔记(三)镜像

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(四)使用docker搭建环境 ...

  6. docker学习笔记(五)如何创建自己的阿里云镜像仓库(这是2021版的阿里云教程)

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(三)镜像 docker学习笔记 ...

  7. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)

    长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...

  8. 狂神 Docker学习笔记 从基础到进阶 一步到位

    Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...

  9. 开源的容器虚拟化平台Docker学习笔记,个人私藏分享,不谢!

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  10. Docker学习笔记 (4)

    Docker学习笔记 (4) Docker 网络 原理简述 ip addr查看网络地址: 问题:Docker 如何处理容器网络访问的? docker run -d -P --name tomcat01 ...

最新文章

  1. Code Review 是一场苦涩但有意思的修行
  2. 漫画 | 产品经理的八大罪状
  3. (022)java后台开发之HttpServletRequest
  4. 深入探究递归神经网络:大牛级的训练和优化如何修成?
  5. 【NLP】CS224N课程笔记|词向量I: 简介, SVD和Word2Vec
  6. ANTLR入门:构建一种简单的表达语言
  7. mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累
  8. C# 制作不规则窗体的两种解决方案
  9. Java面试题:IO流的标准处理异常的代码
  10. iOS开发-网络-合理封装请求接口
  11. c# 通过MailHelper发送QQ邮件
  12. html系统网页代码大全,html网页的代码大全
  13. matlab对数画图命令,MATLAB命令画图
  14. dell服务器pe系统安装win7系统,dell戴尔pe重装win7系统
  15. 【转】ARM GIC中断系列(八):gicv3架构-波形为例、系列总结
  16. 算法模型---关联规则挖掘学习
  17. 平台业务收款分账产品设计 - 退款退分账
  18. 美国芯片陆续转向,或许为当初的做法后悔不迭,芯片补贴也难改局面
  19. ajax请求怎么实现跨域
  20. navicat与mysql

热门文章

  1. C51蜂鸣器和数码管动静态显示
  2. session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!
  3. python 中的__getattr__和__setattr__
  4. 给div拼接html 拼接字符串
  5. Java网络爬虫实操(8)
  6. 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
  7. 在Windows Mobile模拟器(Emulator)建立网络连接
  8. 丢失api-ms-win-crt-runtime-l1-1-0.dll
  9. EqualLogic全攻略视频[(四)高级管理]
  10. 【转】SMIL基础教程(1)