【One by one系列】一步步学习docker

Docker

Build,Ship and Anywhere

1.基本概念

  • Docker Client:Docker提供给用户的客户端,功能就是提供给用户一个终端,用户输入docker提供的命令来管理本地或者远程的服务器。
  • Docker Server:Docker Daemon是主要组成部分,Docker服务的守护进程,功能接受Docker Client发过来的指令请求,并按照相应的路由规则实现路由分发。
  • Docker Images:Docker镜像,类比电脑装系统的CD盘,只读的CD
  • Docker Registry:Docker Images的仓库,类比git,有私人的,有公共的,如github,docker提供了官方的Registry,Dock Hub
  • Docker Container:Docker 容器,在容器里,跑项目程序、消耗机器资源、提供服务的地方;容器(Docker Container)通过镜像(Docker Images)启动,在镜像的基础上运行程序。可以理解为容器提供了硬件环境,然后使用了镜像这些制作好的系统盘,再加上项目程序,跑起来就可以提供服务。

理解上图:搭载Docker的主机,通过Docker Client使用docker build docker pull docker run 让Docker Daemon从Docker Registry拉取Ubuntu,redis,nginx等镜像,然后通过这些镜像创建不同的容器

2.安装Docker

以CentOs为例:可以参考https://docs.docker.com/install/linux/docker-ce/centos/

https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.2206199170TjX9

  • 安装辅助工具:

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

    yum-utils:管理repository及扩展包的工具 (主要是针对repository)

    device-mapper-persistent-data:Device Mapper支持Linux上的许多高级卷管理技术;

    lvm2:逻辑卷管理工具;

  • 添加软件源信息,这里使用Docker CE版本

    从2017年3月开始docker在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    更新yum缓存:yum makecache fast

  • 移除旧的版本

    yum remove docker

  • 安装

    yum -y install docker-ce

  • 启动

    systemctl start docker

    或者

    #服务方式启动
    service docker start
    #设置开机启动
    chkconfig docker on
  • 测试运行hello-world

    docker run hello-world

  • 卸载:yum remove docker-ce rm -rf /var/lib/docker
  • 问题:

解决方案

yum clean all

yum install docker-ce

3.docker基本操作

查看版本

docker version

查看镜像

docker images

docker image ls

查看容器

docker ps

拉取镜像

docker pull image-name

镜像放到容器中跑

docker run image-name

查看容器运行情况

docker ps -a

docker container ps

docker container ps -a

4.docker原理

4.1docker优势

  • docker image的体积小,ubuntu-100M+,小就意味着传输与分享方便
  • docker run 启动的耗时为0.
  • docker 占用资源少

    想象一下如下场景把一个项目build成一个image,然后方便分发出去,别人拿到后也不用关心你的项目需要什么环境或者依赖,只要docker run一下就能运行。。而且速度很快,甚至在一台开发机都可以管理成百上千的container,没有业务处理的时候也不会占用你的系统资源。。。

4.2原理

4.2.1虚拟机 vs Docker容器

4.2.2Docker核心组件
  • AUFS(chroot) – 用来建立不同的操作系统和隔离运行时的硬盘空间
  • Namespace – 用来隔离Container的执行空间
  • Cgroup – 分配不同的硬件资源
  • SELinux – 用来保护linux的网络安全
  • Netlink – 用来让不同的Container之间的进程保持通信,话说docker是golang开发的,还记得golang中goroutine如何通信?
  • Netfilter – 建立Container埠為基礎的網路防火牆封包過濾
  • AppArmor – 保護Container的網路及執行安全
  • Linux Bridge – 讓不同Container或不同主機上的Container能溝通
  • 等等·~等等~等等~
4.2.3术业有专攻

docker运用linux的技术走了捷径,不虚拟化任何硬件,而是对硬件资源在不同的容器中做了隔离,隔离使米格容器之间拥有了不同的环境(硬盘空间-网路-系统工具包),然后又可以共享需要的硬件资源(cpu-内存-系统内核),dokcer用的技术很多(如上),一项一项研究基本不可能,这也不是我们学习docker的目的,我们是让docker用于实际生产过程中,至于原理,了解即可,所以我们应该docker是怎么就能办到?

AUFS -> Another Union File System:AUFS的技术可以让多个文件目录union成一个新的目录,并且可以对这个新的目录进行读写操作。

? 如果你有一张只读的cd数据盘,但是你却想编辑里面的内容,你通常的做法是不是把内容拷贝到本地硬盘,然后再编辑。

? 但如果你可以利用AUFS技术,你就可以将硬盘中的一个空目录和你的cd数据盘进行union形成一个新的目录,接着你对这个目录读取,会得到的cd盘内的数据,当你对这个目录的内容进行编辑,编辑的内容AUFS会自动讲修改内容保存在你union的那个空目录内,当你再次读取的时候,AUFS也会将你硬盘中记录的改动内容优先于CD数据盘中的内容读取出来,这样对用户而言,这就完全是一个可编辑的目录内容了。——docker要的就是这个效果

  • 想象一下docker的Image,其实也就是一个事先制作好的只读的文件目录,当我们要使用这个系统功能的时候,docker为我们开辟了一个新的文件夹和这个image做了union,提供给docker container做为系统运行的存储
  • 这个image里面已经包含了系统程序、工具软件、以及程序,当系统启动后产生的运行时文件(如logs、临时目录等)或新安装的软件都在这个新的文件夹内。
  • 这样我们在启动一个container的时候,其实并没有加载镜像的过程,也不会像虚拟机一样需要安装一个系统这么负责,只是做了一次unoin,一切就和安装过系统的虚拟机同样使用了。
  • 另外docker还提供了一个 docker commit 命令,这个命令可以随时将你现在的运行中的cantainer构建成一个新的image。

4.3docker命令补充

查看当前的container列表

docker ps -a

通过一个image生成一个新的image,包含container中的改动

docker commit container-id

5.docker加速镜像为阿里云

由于众所周知的原因,使用docker pull,命令下载镜像太慢了,默认是从国外的。

https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN

#阿里云镜像服务
https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN

#密码
在阿里云容器镜像服务控制台-默认实例-访问凭证取 修改即可

#镜像加速器可以提升docker官方镜像的速度
在阿里云容器镜像服务控制台-镜像中心-镜像加速器

6.docker实战-万物皆镜像

以nginx官方镜像为例https://hub.docker.com/_/nginx

6.1获取官方镜像:docker pull

docker pull nginx

6.2查看已有镜像:docker image ls

docker image ls

6.3查看镜像详情:docker image inspect

docker image inspect nginx

6.4运行容器:docker run

一个镜像可以跑多个容器

docker run --name nginx-test -d -p 8082:80 nginx

nginx-test 容器名称,独一无二,不能重复

-d 后台运行

-p 指定端口,宿主端口:容器内部端口

-p 80 随机映射一个宿主机端口,通过docker port nginx-test

-p ip::containerport 容器端口映射主机指定ip动态端口

-p ip:hostport:containerport

-P 暴露所有(容器开发的所有)端口

nginx 镜像名称,nginx:tag ,其中nginx默认nginx:latest ,是简写,其他版本,就需要nginx:版本号

宿主机ip:192.168.1.105

http://192.168.1.105:8082/

6.5查看运行中的容器:docker container ps

docker container ps
docker  ps

6.6查看所有的容器:docker container ps -a

docker container ps -a
docker  ps -a

6.7查看容器详情:docker container inspect

docker container inspect nginx-test

6.8进入容器:docker container exec

容器中必须运行有运行的程序,否则docker会把容器进程杀死,nginx是运行,如果只是一个linux系统的容器,会执行失败

docker container exec -it nginx-test /bin/bash

来吧,你可以在容器,为所欲为之为所欲为。

6.9退出容器:exit

exit

6.10删除容器

#停止容器
docker stop nginx-test

#删除容器
docker rm nginx-test

#强制删除容器
docker rm -f nginx-test

6.11挂载容器文件

#Mounts节点
docker container inspect nginx-test
#容器中无Mounts节点,mysql有,nginx没有

#自主挂载
#1.创建一个文件
mkdir -p /docker-mount/nginx/conf

#2.查看容器文件的路径
cd /etc/nginx/conf.d/
more default.conf
#没错!,文件路径/etc/nginx/conf.d/default.conf
#2.把docker的文件挂载到宿主机上
docker cp nginx-test:/etc/nginx/conf.d/default.conf  /docker-mount/nginx/conf

#3.宿主机查看文件
 more docker-mount/nginx/conf/default.conf

 #4.编辑文件
vim docker-mount/nginx/conf/default.conf
#5.挂载至容器
docker run --name nginx-test -d -p 8080:80 -v docker-mount/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf

6.12容器日志

docker logs nginx-test

6.13容器生命周期图

Docker的四种网络模式

1.Bridge 桥接模式,docker默认
#配置容器的主机名
docker run --name t1 --network bridge -h [自定义主机名] -it --rm busybox

#自定义DNS
docker run --name t1 --network bridge --dns 114.114 -it --rm busybox

#给host文件添加一条
docker run --name t1 --network bridge --add-host [hostname]:[ip] -it --rm busybox
2.Host

与宿主机一模一样 不需要端口映射

3.None

不使用网络

4.Container

一个容器共享另外一个容器的network namespace,与host模式差不多,只是这里不是使用宿主机网络,而是使用的容器网络

配置docker0网络属性信息

vim /etc/docker/daemon.json

核心选项为bip,即bridge ip,用于指定docker0桥自身的ip地址;其他选项可以通过此地址计算出

7.生成镜像

方法一:更新

创建容器

docker run ..

修改容器

为所欲为

commit

docker commit -a="作者" 容器名称 新镜像名称

方法二:dockerfile构建

  • 构建docker镜像的源码
  • 文本文档
  • docker build 自动执行命令行,自动构建docker镜像
  • 注释

  • 指令(不区分大小写),约定大写,参数小写
  • 顺序执行
  • start
    #FROM 基础镜像
    FROM image-name:tag
    LABEL author=carfield
    
    #ADD 可以从网络上下载
    ADD source-file dest-file
    ADD URL 容器目录
    
    #COPY 可以不用 与 ADD类似
    COPY 宿主机文件 容器文件
    #EXPOSE 暴露端口
    EXPOSE 80/tcp
    #ENTRYPOINT 容器内部生效
    ENTRYPOINT ["<executable>","<param1>","<param2>"] 
    
    #ENV 环境变量 key=value
    ENV PATH 
    
    #ARG 同ENV
    
    #RUN 指定docker build过程中运行命令
    RUN <command>
    
    #WORKDIR 工作目录 执行目录
    WORKDIR $
    
    #ONBUILD 触发器:被作为基础镜像触发
    ONBUILD 
    
    #CMD 容器启动生效
    CMD [""]
    • 构建镜像docker build -t image-name:tags ..当前目录
    #test
    FROM centos
    
    #镜像作者 元数据标签
    LABEL author=carfield
    
    #复制文件到镜像
    ADD ... ...
    ADD ... ...
    
    #配置环境变量
    ENV DOTNET 路径
    
    #WORKDIR
    WORKDIR ...
    
    RUN yum -y install vim
    
    VOLUME ["/data1"]
    
    EXPOSE 8080
    
    CMD ls
    
    ENTRYPOINT ....

8.发布镜像

8.1登录阿里云容器镜像服务

8.2推送至阿里云

# 登录docker仓库
sudo docker login --username=[用户名] registry.cn-hangzhou.aliyuncs.com
# 创建指定镜像的tag,归入某个仓库
sudo docker tag [镜像id] registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[镜像版本号]
# 镜像推送至仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[镜像版本号]

8.3拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:v1

参考资料

原文地址:https://www.cnblogs.com/RandyField/p/12289668.html

时间: 2024-08-29 10:26:03

【One by one系列】一步步学习docker的相关文章

【One by one系列】一步步学习Golang web框架Gin

一步步学习Golang web框架Gin 建立项目 go mod 管理依赖 cd $gopath\src\github.com\carfield go mod init 就可以看到在src\github.com\carfield 生成了go.mod文件 module github.com/carfield go 1.13 下载gin包 go get -u github.com/gin-gonic/gin ps:由于众所周知的原因,大概率是下不动,所以请修改代理 修改代理 go env -w GO

基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)

http://blog.csdn.net/jiuqiyuliang/article/details/19967031 目录: 基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一) 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二) 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现添加.编辑.删除(三) 基于asp.net + easyui框架,一步步学习e

一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的&quot;my-boot&quot;

如果要做嵌入式Linux,我们首先要在板子上烧写的往往不是kernel,而是u-boot,这时需要烧写工具帮忙.当u-boot烧写成功后,我们就可以用u-boot附带的网络功能来烧写kernel了.每当板子上电时,u-boot一般会被加载到内存的前半段,如果我们的kernel之前就已经被烧写到开发板了,那么u-boot会加载kernel到内存的后半段并跳转到kernel的起始地址处执行(或者直接跳转到kernel的起始地址处执行,如果kernel可以直接在flash上执行的话.) 如上图所示,绿

一步步学习javascript基础篇(3):Object、Function等引用类型

我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂数据类型(即引用数据类型) Object类型 我们用的最多的引用类型就属object类型了,一般用来存储和传输数据是再好不过的.然,它的两种创建方式我们是否了解呢? 1.通过构造函数来创建 如: var obj = new Object(); 在js中的引用类型有个非常灵活的用法,可以动态的附加属性和赋值.

【Docker系列教程之三】Docker容器是如何工作的

在上一篇的文章中,我给大家主要介绍了一下 Docker 环境的搭建,简单的讲解了一下 Docker 架构,以及用 Docker 命令简单演示了一下如何拉去一个 images 镜像.本篇我们将剖析一下 Docker 容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了. Docker架构 在上一篇文章的学习中,我们简单地讲解了Docker的基本架构.了解到了 Docker 使用的是 C/S 结构,即客户端/服务器体系结构.明白了 Docker 客户端与 Docker

学渣乱搞系列之网络流学习

学渣乱搞系列之网络流学习 几篇优秀的文章,鉴于本学渣目前功力不够,还不能掌握网络流的精髓要义.故载几篇牛文. Dinic算法: Comzyh的博客 Lich_Amnesia

一步步学习javascript基础篇(8):细说事件

终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能阅读了.有了事件,我们可以通过键盘或是鼠标和页面交互了,通过我们不同的操作页面给出不同的响应.好了,开始我们今天的分析吧. DOM0级事件处理方式 什么是DOM0级? 其实世上本来没有DOM0级,叫的人多了就有了DOM0级. 在1998 年 10 月 DOM1级规范成为 W3C 的推荐标准,在此之前

一步步学习javascript基础篇(7):BOM和DOM

一.什么是BOM.什么是DOM BOM即浏览器对象模型,主要用了访问一些和网页无关的浏览器功能.如:window.location.navigator.screen.history等对象. DOM即文档对象模型,针对HTML(或XML)文档的API(应用程序编程接口).描绘的一个层次化的节点树,开发人员可以添加.修改和删除页面的某一部分. 二.细说BOM对象 1.window对象 window对象表示浏览器的一个实例,同时也是ECMAScript 规定的 Global 对象.(Global :所

一步步学习javascript基础篇(6):函数表达式之【闭包】

回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; }  //函数声明语法定义 2. var sum = function(num1, num2){ return num1 + num2; }; //函数表达式定义 3. var sum = new Function("num1", "num2", "return num1 + num2"); //Function