第一节:docker简介、下载和配置镜像加速器、以及镜像和容器的使用

一. docker简介

1. docker背景

 我们在实际开发中,会接触到多个环境,比如:开发环境、测试环境、生产环境。经常会出现程序员在本机上运行好用的代码,迁移到测试环境中不好用了; 测试环境校验没问题的程序发布到生产环境中又出错了,然后开发、测试、运维各方人员开始扯皮,干架,出现这种情况,很大的一个原因是不同环境下所安装的Runtime时版本不同,比如开发环境中安装的是 .Net Core 3.1 ,而测试环境中安装的是.Net Core 2.2 ; 再比如测试环境中安装的是JDK8,生产环境中安装的是JDK7,就会产生“水土不服”的问题,从而报错。

 

   docker的诞生就是为了解决这种软件跨环境迁移而出现的水土不服的问题。将发布包和运行环境一起打包在一个容器中进行迁移,就解决上述问题。

 

2. docker相关概念

 Docker 是一个开源的应用容器引擎诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)

 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。

 容器是完全使用沙箱机制,相互隔离,容器性能开销极低

 Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

 

3. 镜像、容器、仓库

(1). 镜像(Image):就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

          就像软件安装包。我们可以把镜像拉(pull)下来,增加我们的更改,然后发布(push)成新的镜像,别人也可以下载我们发布的镜像,然后继续更改,继续发布;

(2). 容器(Container):镜像安装后运行的实例;同一个镜像可以在同一台服务器上安装成多个容器,同一个镜像可以同时装在多个不同的服务器上

PS:镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

(3). 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像,有公有仓库和私有仓库之分。常见的docker的官方仓库、阿里云、腾讯云等等。

 

4. 相关地址

 docker官网:https://www.docker.com/

 镜像官方地址:https://hub.docker.com/    (可以去搜索各种镜像,查询镜像的版本号等)

 

二. 下载和配置镜像加速器

1. docker的安装

(1). yum 包更新到最新  (可省略这一步!!更新比较慢

【sudo yum update】

(2). 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

【sudo yum install -y yum-utils device-mapper-persistent-data lvm2】

(3). 设置yum源

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

(4). 安装docker,出现输入的界面都按 y  (在指令中加入  -y的话,一路安装不需要确认了)

下载最新版本:sudo yum install -y docker-ce docker-ce-cli containerd.io

                     或 【sudo yum install -y docker-ce】 这里发现我只安装docker-ce的时候,docker-ce-cli 和 containerd.io这两个工具也都给安装了,所以这两个指令等效

eg:失败截图(或者安装完以后无法启动,建议先安装containerd.io ,再安装 docker-ce ,docker-ce-cli ,详见下面)

根据提示执行命令: sudo yum install -y docker-ce docker-ce-cli containerd.io --nobest】 或sudo yum install  -y docker-ce docker-ce-cli containerd.io --skip-broken】 完成下载  (下载比较慢,大约10min)

下载中截图:

在centos8系统中,上述步骤可能还不行,需要先单独安装一下containerd.io,

sudo yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm

然后再重新执行一下docker的安装指令 【sudo yum install -y docker-ce docker-ce-cli】

 

(5). 查看docker版本,验证是否验证成功

【docker -v】

 

2. docker相关指令

(1). 启动docker:【sudo systemctl start docker】

(2). 停止docker:【sudo systemctl  stop docker

(3). 重启docker:【sudo systemctl restart docker

(4). 查看docker服务状态:sudo systemctl  status docker

(5). 设置开机启动docker:sudo systemctl  enable docker

 

3. 配置镜像加速器

(1). 默认镜像的下载地址是:https://hub.docker.com/  国外的,下载慢的要死,我们可以把它配置成国内的镜像,常见的有以下这几种:

  USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)

  阿里云:注册登录后查看  (推荐!!!)

  网易云:注册登录后查看

  腾讯云:注册登录后查看

(2) . 配置阿里云的镜像加速器(都类似)

A. 登录阿里云--------进入控制台------搜索容器镜像服务并进入-------选择镜像加速器--------复制地址

B. 进入Linux系统

(1). 打开配置文件: 【vi /etc/docker/daemon.json】 默认是空的

(2). 复制下面代码到上面的文件里,进行保存

{ "registry-mirrors": ["https://阿里云复制的地址"] }

(3). 执行相关重启命令:【sudo systemctl daemon-reload 】和【sudo systemctl restart docker

简单方法(推荐)

  直接去阿里云那复制整段代码,copy到Linux系统,敲回车一步搞定。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ijmr3it2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

 

三. 镜像和容器的使用

1. 镜像

A 相关指令:

(0). 构建镜像:docker build -t  <imageName>:版本号 .      (注:最后是一个空格和一个点, 版本号可以省略)

ps:如果Dockerfile文件不在当前目录,或者重命名了,需要通过 -f参数指定路径。  eg:【docker build -f ./ypfcentos_Dockerfile -t ypfcentos:1.0 .    】  

(1). 搜索镜像: docker search imageName

(2).下载镜像:docker pull <imageName> 

     下载指定版本号的镜像:docker pull imageName:版本号

PS:镜像可以去这个网站上找:https://hub.docker.com ,版本号也上这找。

(3). 查看所有映像:docker images   【等价 docker image ls】

(4). 查看所有镜像ID:docker images –q

(5). 删除指定镜像:docker rmi <imageid  或 imageName>

(6). 删除全部镜像:docker rmi $(docker images -q)

(7). 删无标签镜像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

B. 案例:

(1). 删除系统中nginx镜像 和 redis 镜像(分别通过name 和 ID)

(2). 下载5.7版本的MySql镜像

 先去仓库中查询一下有没有5.7这个版本,经查询是有的, 然后进行下载即可。

2. 容器

A. 相关指令:

(1). 运行容器:docker run 各种参数 <imageName>    

PS:当本机一个镜像存在多个版本的时候需要加上版本号:  docker run 各种参数 <imageName>:版本号

参数说明:

--name:指定容器名称  eg:   --name=ypf  或者 --name ypf  都行

-i:保持容器运行。通常与 -t  或 -d同时使用。

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,容器创建后自动进入容器中,退出容器后,容器自动关闭

-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。

  -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器

-p:指定端口映射  eg: -p 5001:80 (其中5001表示docker主机《即linux系统》对外开放的端口,80表示容器对外开放的端口-dockerFile中)

-P:暴露所有端口 

 常用组合:

【docker run -it --name=xxx  <imageName>】: 以交互式创建容器,容器创建后自动进入容器中,退出容器后,容器自动关闭

【docker run -id --name xxx  <imageName>:7】:以守护时创建容器,并且制定使用镜像的版本为7, i可以省略

【docker run --name xxx -id -p 5001:80 <imageName>】: 以守护时创建容器,并做端口映射,linux端口5001,容器端口为80

(2). 查看运行容器:docker ps      【等价  docker container ls】

      查看所有容器:docker ps -a  

(3). 进入容器内部:docker exec -it <containerId> /bin/bash       (可省略bin,简介写法  【docker exec -it <containerId> bash】)

注:这里不能 -id

(4). 退出当前容器:exit

(5). 启动一个容器:docker start  <containerId  或 containerName>

(6). 停止一个容器:docker stop $(docker ps -q)

      停止一个容器:docker stop $(docker ps -q)

(7). 删除单个容器:docker rm <containerId  或 containerName>    (加个 -f 可以强制删除启动的容器

   删除所有容器:docker rm $(docker ps -aq)

(8). 查看容器信息:docker inspect  <containerName>

(9). 查看容器日志:

docker logs [OPTIONS] 容器name/ID
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

假设容器的名字为test1

 A. 查看最近20分钟内的所有日志 

docker logs --since 20m  test1】

 B. 查看最近20分钟内的最新的100条日志

docker logs --since 20m --tail 100 test1】

 C. 查看最近20分钟内的最新的100条日志,并实时监控后续日志

docker logs -f --since 20m --tail 100 test1】

 D. 查询某个时间段内的日志

docker logs --since="2020-09-17" test1】   查询20200917后的所有日志

docker logs --since="2020-09-17"  --until="2020-09-18" test1】查询20200917-20200918之间的日志

B. 案例:

(1). 用交互式的方式创建一个名为myCentos1的容器,查看是否直接进入容器,退出后容器是否关闭。

(2). 指定端口的用法

【docker run -id --name=ypfwebapicontainer1 -p 8000:9000 ypfwebapi1】 

(3). 随机所有端口的用法

 【docker run -id --name=test1 -P ypfwebapi1】

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

 

posted @ 2020-09-04 07:33  Yaopengfei  阅读(893)  评论(4编辑  收藏  举报