Docker入门探索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catshitone/article/details/83141051

1.Docker简介

A. 题外话–运输业货运方式

集装箱▼
在这里插入图片描述
集装箱被发明之前▼
在这里插入图片描述

两种货运方式的对比:

散货运输 集装箱运输
货物装载时间 几天到一个星期,分拣、合并、装卸过程繁琐 几个小时
货物装卸时间占整个运输过程的比例 > 50% < 10%
所需劳动力 大量码头工人 少数码头工人和起重机操作员
自动化程度
安全性
总体运输时间 货物装卸时间+实际运输时间 在总距离和运输工具的运输速度不变的前提下,可以节约一半以上的时间

B. 什么是Docker

在这里插入图片描述

Docker['dɑkɚ]: 码头工人

Docker 是一种容器(Container)技术,它可以将应用和环境等进行打包,形成一个独立的,类似于 iOS/Android 的 APP 形式的「应用」,这个应用可以直接被分发到任意一个支持 Docker 的环境中,通过简单的命令即可启动运行。Docker 是一种最流行的容器化实现方案。和虚拟化技术类似,它极大的方便了应用服务的部署;又与虚拟化技术不同,它以一种更轻量的方式实现了应用服务的打包。使用 Docker 可以让每个应用彼此相互隔离,在同一台机器上同时运行多个应用,不过他们彼此之间共享同一个操作系统。Docker 的优势在于,它可以在更细的粒度上进行资源的管理,也比虚拟化技术更加节约资源。
Docker和虚拟化技术的对比
Docker和虚拟化技术的对比▲

结合前面的集装箱技术可以更好的理解docker:

  • 资源独立、隔离
    Docker Engine限制了硬件资源与软件运行环境,与宿主机上的其他应用实现了隔离,做到了互不影响。不同应用或服务以「集装箱」(container)为单位装「船」或卸「船」,「集装箱船」(运行 container 的宿主机或集群)上,数千数万个「集装箱」排列整齐,不同公司、不同种类的「货物」(运行应用所需的程序、组件、运行环境、依赖)保持独立。

  • 环境的一致性
    开发工程师完成应用开发后 build 一个 Docker image,基于这个 image 创建的 container 像是一个集装箱,里面打包了各种「散件货物」(运行应用所需的程序、组件、运行环境、依赖)。无论这个集装箱在哪里——开发环境、测试环境、生产环境,都可以确保集装箱里面的「货物」种类与个数完全相同,软件包不会在测试环境缺失,环境变量不会在生产环境忘记配置,开发环境与生产环境不会因为安装了不同版本的依赖导致应用运行异常。这样的一致性得益于「发货」(build Docker image)时已经密封到「集装箱」中,而每一个环节都是在运输这个完整的、不需要拆分合并的「集装箱」。

  • 轻量化
    相比传统的虚拟化技术(VM),使用 Docker 在 CPU、Memory、Disk I/O、Network I/O 上的性能损耗都有同样水平甚至更优的表现。Container 的快速创建、启动、销毁受到很多赞誉

  • Build Once, Run Everywhere
    「货物」(应用)在「汽车」、「火车」、「轮船」(私有云、公有云等服务)之间迁移交换时,只需要迁移符合标准规格和装卸方式的「集装箱」(Docker container),削减了耗时费力的人工「装卸」(上线、下线应用),带来的是巨大的时间人力成本节约。这使未来仅有少数几个运维人员运维超大规模装载线上应用的容器集群成本可能

2. 开始

A. 基本概念

  • 镜像(Image):可以理解为一个预配置的系统光盘,这个光盘插入电脑后就可以启动一个操作系统。当然由于是光盘,所以你无法修改它或者保存数据,每次重启都是一个原样全新的系统.
  • 容器(Container):同样一个镜像,我们可以同时启动运行多个,运行期间的产生的这个实例就是容器。把容器内的操作和启动它的镜像进行合并,就可以产生一个新的镜像。

B. 安装Docker

以Ubuntu系统为例:

  • 使用官方命令安装:
wget -qO- https://get.docker.com/ | sh
  • 使用国内镜像安装
curl -sSL https://get.daocloud.io/docker | sh 

安装镜像加速器:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

C. 镜像(Image)操作

  • 搜索镜像
docker search <image_name>

如:docker search ubuntu

  • 拉取(下载)镜像
docker pull <user_name:image_name>:<tag>

如docker pull name/ubuntu;docker pull name/ubuntu:18.04

  • 查看已拉取的镜像
docker images
  • 删除镜像(需先删除对应的Container)
docker rmi <image_id>

D.容器(Container)操作

  • 启动(创建)一个容器
docker run -it <image_id> /bin/bash

-i表示: 表示这是一个交互容器,会把当前标准输入重定向到容器的标准输入中
-t表示:为这个容器分配一个终端

  • 查看所有容器
docker ps -a (docker ps查看正在运行的容器)
  • 查看容器详细信息
docker inspect <container_id>
  • 进入容器
docker run -it <container_id> bash
  • 停止\启动\重启容器
docker start/stop/restart <container_id>
  • 删除容器
docker rm <container_id>
  • 创建镜像
docker commit <container_id> <user_name/image_name>

如: docker commit 51f guyiming/firstimage

  • 发布镜像到仓库
docker push <user_name/image_name>

在发布之前, 需要先登录: docker login -u <user_name>

3.创建/发布镜像

要创建一个新的 Docker 镜像,通常基于一个已有的 Docker 镜像来创建。Docker 提供了两种方式来创建镜像:把容器创建为一个新的镜像、使用 Dockerfile 创建镜像。下面以创建一个包含.netcore sdk的镜像为例, 来演示两种不同的创建方式:

A. 基于容器创建

docker run -it ubuntu /bin/bash
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-2.1

然后将此容器, 按照之前的命令进行commit和push即可

B.使用Dockfile创建

使用命令行的方式创建 Docker 镜像通常难以自动化操作。更多的是使用Dockerfile 来创建 Docker 镜像。Dockerfile 是一个纯文本文件,它记载了从一个镜像创建另一个新镜像的步骤。撰写好 Dockerfile 文件之后,我们就可以轻而易举的使用 docker build 命令来创建镜像了。

Dockerfile常见命令:

命令 参数 说明
# - 注释
FROM < image>[:< tag>] 从一个已有镜像创建,例如ubuntu:latest
MAINTAINER Author [email protected] 镜像作者名字,如Max Liu [email protected]
RUN < cmd>或者[‘cmd1’, ‘cmd2’…] 在镜像创建用的临时容器里执行单行命令
ADD < src> < dest> 将本地的< src>添加到镜像容器中的< dest>位置
RUN < cmd>或者[‘cmd1’, ‘cmd2’…] 在镜像创建用的临时容器里执行单行命令
VOLUME < path>或者[’/var’, ‘home’] 将指定的路径挂载为数据卷
EXPOSE < port> [< port>…] 将指定的端口暴露给主机
ENV < key> < value> 或者 < key> = < value> 指定环境变量值
CMD [“executable”,“param1”,“param2”] 容器启动时默认执行的命令。注意一个Dockerfile中只有最后一个CMD生效
ENTRYPOINT [“executable”, “param1”, “param2”] 容器的入口点

CMD 和 ENTRYPOINT 需要特殊说明一下:

  • CMD 用来指定 Docker 容器启动时默认的命令,例如我们上面例子提到的 docker run -it ubuntu /bin/bash 。其中 /bin/bash 就是通过手工指定传入的 CMD。如果我们不加这个参数,那么容器将会默认使用 CMD 指定的命令启动。
  • ENTRYPOINT 从字面看是入口点。ENTRYPOINT 用来指定特定的可执行文件、Shell 脚本,并把启动参数或 CMD 指定的默认值,当作附加参数传递给 ENTRYPOINT。以后的其他操作只能在这个范围内.

论docker中 CMD 与 ENTRYPOINT 的区别

安装.netcore sdk的Dockfile:

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install wget -y
RUN wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN apt-get install apt-transport-https -y
RUN apt-get update
RUN apt-get install dotnet-sdk-2.1 -y

然后输入一下命令进行创建

docker build -t <user_name/image_name> .

创建完成之后使用push命令进行发布.

4. Docker与CI/CD

daocloud为例
tbd

猜你喜欢

转载自blog.csdn.net/catshitone/article/details/83141051