[转]Docker超详细基础教程,快速入门docker

一、docker概述

1.什么是docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。

简单来说,docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把深度学习放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。

2.docker思想

2.1 集装箱

如果没有集装箱,运输货物的时候,东西零散容易丢失,但是一旦有了集装箱,那么货物就会被装载在里面,运输的时候就不容易丢失了。目前我们需要将程序部署到一台新的机器上,可能会启动不起来,比如缺失库或者配置文件等。那我们如果将程序想象成货物,我们只需要用一个集装箱将这些程序打包好,就可以在部署后保证程序可以正常运行,而docker就是这个集装箱

2.2 标准化

运输方式:

如果我们把台式机的应用部署到服务器上,我们可能选择用移动硬盘拷过去,而有了docker,我们就可以将这个过程标准化。
docker运输东西通过一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地。
在刚才例子中,我们只需要在台式机执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在服务器上执行一个docker命令,然后由鲸鱼把程序从超级码头送到服务器上去。

存储方式:

当我们把程序存储到服务器上时,因为下次我们有可能还要修改存储目录,所以我们需要记住这个目录。而有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了。

API接口:

docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等。有了docker,通过docker命令就可以对其进行操作。

2.3 隔离

我们在使用虚拟机时有自己的cpu、硬盘、内存,完全感觉不到外面主机的存在。docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒。最底层的技术是linux一种内核的限制机制,叫做LXC。
LXC是一种轻量级的容器虚拟化技术,最大效率的隔离了进程和资源。通过cgroup、namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等。这个机制在7、8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?
英雄造时势,时势造英雄,如果没有云计算、敏捷开发、高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker。

3.为什么选择docker? 

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势

  1. 更高效的利用系统资源。
  2. 更快速的启动时间
  3. 一致的运行环境
  4. 持续交付和部署
  5. 更轻松的迁移
  6. 更轻松的维护和扩展

4.走进docker

镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方。docker运行程序的过程,就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。
build:构建,就是构建镜像.
ship:运输,运输镜像,从仓库和主机运输.
run:运行的镜像就是一个容器.
build,ship,run和镜像,仓库,容器是一一对应的。

4.1 镜像

镜像的英文名叫image。前面我们讲到了集装箱,鲸鱼拖着的所有集装箱就是一个镜像。

从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件。既然是文件,那么是以什么样的格式在本地保存的呢?

说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统。它是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下。

比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件。联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1,test2)中的内容。

通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层。每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储。

镜像的存储格式如下图所示。

这张图是分层的。最下面一层,上面也是一层层的好像集装箱罗列在一起。这就是镜像最直观的存储方式。下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件。如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码。每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的。注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统。docker的这种文件系统被称之为镜像。

4.2 容器

为了便于理解,大家可以把容器想象成虚拟机。每个虚拟机都有自己的文件系统,可以把上图整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的。为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统

因为镜像的每一层都是只读的,所以在程序的运行过程中要写镜像文件时,它会把文件的每一层拷到文件的最上层,然后再对它进行修改。修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层。

由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰。

4.3 仓库

我们的镜像是要在其它机器上运行,如何进行传输呢?

这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程。

谁提供了这样的仓库呢?docker自己提供了hub.docker.com。但是非常慢为了解决这个问题,国内很多公司也在做自己的仓库。

二、docker安装

因为在虚拟机中安装的是linux的redhat7.4,所以接下来将介绍如何在redhat中安装docker。以下方法通用于linux内核,只是安装包有可能不同。

安装需满足以下要求:

  • 64位操作系统
  • 3.1及以上的Linux内核
  • iptables版本在1.4及以上
  • git版本在1.7及以上
  • A ps executable, usually provided by procps or a similar package.
  • XZ Utils 4.9 or higher
  • A properly mounted cgroupfs hierarchy; a single, all-encompassing cgroup mount point is not sufficient.

通过 uname -r 命令查看你当前的内核版本。

1.在线安装

1.1 如果安装过请先卸载

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

1.2 安装依赖设置yum仓库

安装依赖:

yum install -y yum-utils \device-mapper-persistent-data \lvm2

 设置仓库:

yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo

1.3 安装docker

yum install docker-ce docker-ce-cli containerd.io

1.4 启动并加入开机启动

systemctl start dockersystemctl enable docker

1.5 验证是否安装成功 

docker versiondocker run hello-world

能够看到输出 Hello from Docker! 就OK了!

2.离线安装

在某些情况下,我们可能需要离线安装docker,那么接下来将详细介绍如何实现docker的离线安装。

2.1 下载docker压缩包

从download.docker.com下载对应的docker包,我这里下载的是docker-18.03.1-ce.tgz版本,如果有需要可以直接私信我。

2.2 解压文件

[root@devops-102 ~]# tar -xvzf docker-18.03.1-ce.tgz 

2.3 将文件移动到系统目录下 excutable path

ps:本步骤为可选步骤,也可以把解压路径放到PATH变量中。 

$ sudo cp docker/* /usr/bin/

执行后会看到 API listen on /var/run/docker.sock 的提示,表示docker已经在运行了。

2.4 启动Dockerd

$ sudo dockerd &

2.5 验证

$ sudo docker run hello-world

 能够看到输出 Hello from Docker! 就OK了!

2.6 设置开机自启动

systemctl start docker       systemctl enable docker

三、docker基础操作

当我们安装好docker后,由于我做深度学习方面的研究,所以我们需要安装相应的深度学习环境,以配置pytorch环境为例,接下来会一步步介绍如何构建一个属于自己的镜像。

1.镜像基本操作

1.1 抓取镜像

首先我们进入dockerhub网站选择一个我们需要的镜像。

 然后输入:

docker pull pytorch/pytorch

通过此命令可以docker远程仓库拉取镜像到本地。

docker pull [options] NAME[:TAG]

name是拉取镜像的名称;TAG表示是可选的,如果不选表明时latest,如果选择表明是指定版本的。
options是拉去的一些参数,当不加请求地址的时候回去docker的官网拉取镜像。

1.2 查看镜像

docker images 

 通过此命令可以查看当前存在哪些镜像。

docker images [options] [REPOSITORY[:TAG]]

options是选项,后面是指定镜像的名称。这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像。
IMAGE ID 其实是一个64位的字符串,它可以唯一标识我们的镜像,这里只显示了16位,后面的被截掉了

1.3 启动交互式容器

docker run -it -v /home/admin/workplace:/workspaces --name bert_pytorch pytorch/pytorch /bin/bash

docker run -t -i -v 本地目录:虚拟目录 --name 自定义名称 IMAGE_NAME /bin/bash

-i –interactive=true | false,默认是false
-t –tty=true | false,默认是false
–name 给启动的容器自定义名称,方便后续的容器选择操作
启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续

1.4 删除镜像

docker rmi d77dc4c8ebab

docker rmi 镜像的标识

标识可以是id或者name。

2.容器的操作

2.1 运行容器

# 简单操作
docker run 镜像的标识|镜像名称[tag]
# 常用的参数
docker run -d -p  宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[tag]
# -d: 代表后台运行容器
# -p: 宿主机端口:容器端口: 为了映射当前Linux的端口和容器的端口
# --name 容器名称: 指定容器的名称

2.2 查看正在运行的容器

docker ps [OPTIONS]
# OPTIONS说明:
# -a: 代表查看全部的容器,包括没有运行
# -q: 只查看容器的标识
# -f: 根据条件过滤显示的内容
# --format: 指定返回值的模板文件
# -l: 显示最近创建的容器
# -n: 列出最近创建的n个容器
# --no-trunc: 不截断输出
# -s: 显示总的文件大小

2.3 查看容器的日志 

docker logs -f 容器id

# -f: 可以滚动查看日志的最后几行

2.4 进入到容器内部

docker exec -it 容器id bash

2.5 删除容器(删除容器前,需要先停止容器)

docker stop 容器id
# 停止指定的容器
docker stop $(docker ps -qa)
# 停止全部容器
docker rm 镜像id
# 删除指定容器
docker rm $(docker ps -qa)
# 删除全部容器

2.6 启动容器

docker start 容器id

3.构建镜像

 构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:

  • 通过容器构建:docker commit
  • 通过Dockerfile:docker build

3.1 使用commit命令构建镜像

docker commit 7843e0556e67 bertpytorch

命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数:
-a,–author=“”,指定镜像的作者信息
-m,–message=“”,提交信息
-p,–pause=true,commit时是否暂停容器

3.2 使用Dockerfile文件构建镜像

Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:

# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER wgp "Kingdompin@163.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

命令:docker build [OPTIONS] DockerFile_PATH | URL | -

参数:
 –force-rm=false
​ –no-cache=false
​ –pull=false
​ -q,quite=false,构建时不输出信息
​ –rm=true
 -t,tag=“”,指定输出的镜像名称信息

4.镜像迁移

我们制作好的镜像,一般会迁移到其他机器上。Docker提供了几种镜像迁移分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。

4.1 上传Docker Hub

首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。

在终端中登录你的Docker Hub账户,输入docker login,输入用户名密码即可登录成功。

查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。

docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

其中existing-image代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]则是为上传更改的标签名,tag不指定则为latest。

接下来,我们利用push命令直接上传镜像。

docker push <hub-user>/<repo-name>:<tag>

我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。

4.2 导出文件互传

Docker 还提供了 docker load 和 docker save 命令,用以将镜像保存为一个tar文件。比如这次我们将bertpytorch:latest这个镜像保存为tar文件。

docker save -o bertpytorch.tar bertpytorch

docker save -o <仓库名称>-<tag>.img <仓库名称>:<tag>

查看本地磁盘,即可看见名为bertpytorch的tar包。我们可以将其拷贝给其他机器,再利用load命令重新导入。

docker load --input bertpytorch.tar

docker save --input <tar>

四、常用linux操作

1.文件和目录

cd /home 进入 '/ home' 目录' 
cd .. 返回上一级目录 
cd ../.. 返回上两级目录 
cd 进入个人的主目录 
cd ~user1 进入个人的主目录 
cd - 返回上次所在的目录 

pwd 显示工作路径 

mkdir dir1 创建一个叫做 'dir1' 的目录' 
mkdir dir1 dir2 同时创建两个目录 
mkdir -p /tmp/dir1/dir2 创建一个目录树 

rm -f file1 删除一个叫做 'file1' 的文件' 
rmdir dir1 删除一个叫做 'dir1' 的目录' 
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 
rm -rf dir1 dir2 同时删除两个目录及它们的内容 

cp file1 file2 复制一个文件 
cp dir/* . 复制一个目录下的所有文件到当前工作目录 
cp -a /tmp/dir1 . 复制一个目录到当前工作目录 
cp -a dir1 dir2 复制一个目录 
cp -r dir1 dir2 复制一个目录及子目录

linux涉及到docker的基础命令会不断更新,建议收藏,不时查阅!!!

如果该文章对您有所帮助,麻烦点赞,关注,收藏三连支持下!

各位的支持和认可,是我创作的最大动力!


参考:

Docker超详细基础教程

docker入门(利用docker部署web应用)

Docker 入门到实战教程(一)介绍Docker

Docker——入门实战


---------------------
作者:Yunlord
来源:CSDN
原文:https://blog.csdn.net/kobepaul123/article/details/120072009
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Zookeeper】源码分析之服务器(一)

一、前言 前面已经介绍了Zookeeper中Leader选举的具体流程&#xff0c;接着来学习Zookeeper中的各种服务器。 二、总体框架图 对于服务器&#xff0c;其框架图如下图所示 说明&#xff1a; ZooKeeperServer&#xff0c;为所有服务器的父类&#xff0c;其请求处理链为PrepReques…

linux下配置samba服务器(以CentOS6.7为例)

一、简介&#xff08;百度百科&#xff09;Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c…

【ArcGIS微课1000例】0037:上下标标注记案例教程

在利用ArcGIS进行制图时&#xff0c;进行标注(Label) 或注记(Annolation) 是必不可少的。但是除了常规的标注和注记以外&#xff0c;还时常需要一些特殊的标注或注记&#xff0c;比如上标、下标等。 文章目录一、上标标注方法二、下标标注方法一、上标标注方法 上下标代码模板…

Redis——缓存击穿、穿透、雪崩

1、缓存穿透&#xff1a; &#xff08;1&#xff09;问题描述&#xff1a;key对应的数据并不存在&#xff0c;每次请求访问key时&#xff0c;缓存中查找不到&#xff0c;请求都会直接访问到数据库中去&#xff0c;请求量超出数据库时&#xff0c;便会导致数据库崩溃。如一个用…

数据库性能系列之子查询

前言说起数据库&#xff0c;想必一些朋友会认为&#xff0c;数据库不就是天天CRUD吗&#xff1f;只要我掌握了这几招&#xff0c;根本不在话下。是的&#xff0c;其实我也很赞同这个观点&#xff0c;对于大多数应用程序来说&#xff0c;只掌握这些内容&#xff0c;是可以胜任日…

laravel 内部验证码

为什么80%的码农都做不了架构师&#xff1f;>>> 1.找到此文件composer.json 如下图添加 "gregwar/captcha": "1.*" 行代码 2.在命令行中执行 composer update 安装完成后 3.找到控制器添加如下代码 public function captcha($tmp) {//生成验证…

k8s docker集群搭建

一、Kubernetes系列之介绍篇 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建&#xff0c;到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是kubernetes 首先&#xff0c;他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8…

如何让最小 API 绑定查询字符串中的数组

前言在上次的文章中&#xff0c;我们实现了《让 ASP.NET Core 支持绑定查询字符串中的数组》&#xff1a;[HttpGet] public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values) {return string.Join(" ", values.Select(p…

Kubernetes api-server源码阅读2(Debug Kubernetes篇)

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes api-server源码阅读 系列第二篇&#xff0c;主要讲述如何实现 kubernetes api-server 的 debug 参考b站视频地址&#xff1a;Kubernetes源码开发之旅二 1.本篇章任务 Go-Delve&#xff1a;go语言的…

webrtc 视频 demo

webrtc 视频 demo webrtc网上封装的很多&#xff0c;demo很多都是一个页面里实现的&#xff0c;今天实现了个完整的 &#xff0c; A 发视频给 BA webrtc.html作为offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

[转]阿里开源低代码引擎LowCodeEngine

一、什么是低代码引擎 低代码引擎是具备强大扩展能力的低代码研发框架&#xff0c;使用者只需要基于低代码引擎便可以快速定制符合自己业务需求的低代码平台。同时&#xff0c;低代码引擎还在标准低代码设计器的基础上提供了简单易用的定制扩展能力&#xff0c;能够满足业务独特…

Beyond Istio OSS——Istio服务网格的现状与未来

作者&#xff1a;宋净超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根据笔者在 GIAC 深圳 2022 年大会上的的演讲《Beyond Istio OSS —— Istio 的现状及未来》[1] 整理而成&#xff0c;演讲幻灯片见…

js多维数组扁平化

数组扁平化&#xff0c;就是将多维数组碾平为一维数组&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一个二维数组 var arr [a, [b, 2], [c, 3, x]]&#xff0c;将其扁平化&#xff1a; 1. 通过 apply 借用数组的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16讲 用户程序的结构与执行

转载于:https://www.cnblogs.com/atuo/p/5609843.html

两种方法清除Excel保护密码

一、利用VBA脚本直接清除 打Excel&#xff0c;打开脚本编辑器&#xff08;AltF11&#xff09;或者如图&#xff0c;右键sheet名称 输入代码并运行&#xff0c;即可清除密码保护&#xff1a; Sub DeletePW()ActiveSheet.Protect DrawingObjects:True, Contents:True, AllowFil…

jsonp-反向代理-CORS解决JS跨域问题的个人总结

jsonp-反向代理-CORS解决JS跨域问题的个人总结 网上说了很多很多&#xff0c;但是看完之后还是很混乱&#xff0c;所以我自己重新总结一下。解决 js 跨域问题一共有8种方法&#xff0c; jsonp&#xff08;只支持 get&#xff09;反向代理CORSdocument.domain iframe 跨域windo…

EasyNetQ-用于使用 RabbitMQ 的 .NET API开源的工具库

Part1介绍EasyNetQ 的目标是提供一个库&#xff0c;用于在 .NET 中使用 RabbitMQ 尽可能简单。为了做到这一点&#xff0c;它通过强制执行一些简单的约定来以灵活性换取简单性。这些包括&#xff1a;消息应该由 .NET 类型表示。消息应按其 .NET 类型进行路由。这意味着消息是由…

C# 实例解释面向对象编程中的依赖反转原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

Linux学习笔记之一————什么是Linux及其应用领域

1.1认识Linux 1&#xff09;什么是操作系统 2&#xff09;现实生活中的操作系统 win7 Mac Android iOS 3&#xff09; 操作系统的发展史 &#xff08;1&#xff09;Unix 1965年之前的时候&#xff0c;电脑并不像现在一样普遍&#xff0c;它可不是一般人能碰的起的&#xff0c;…

Lucene详解

一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包&#xff0c;是一个全文检索引擎的架构&#xff0c;提供了完整的查询引擎和索引引擎&#xff0c;部分文本分析引擎。它不是一个完整的搜索应用程序&#xff0c;而是为你的应用程序提供索引和搜索功能…