cker概念简介

1.1什么是docker

Docker 是一个开源的应用容器引擎Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。                        通俗点说:docker翻译过来为码头工人,docker提供的是一种容器化搬运东西(我们的软件、程序)的过程。

1.2 dokcer的优点

docker是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中,可以隔离开发环境。虚拟机是我们在操作系统虚拟出来的文件,docker类似虚拟机,比虚拟机效率更高,都是可以被其他主机拿来直接使用的。

举个例子:当我们在主机上搭载服务器,需要配置环境,配置文件等。若要运行在多个不同的主机上,就需要多次配置。有了Docker我们就可以把配置好的环境,文件,打包成一package(docker镜像)。比如,在linux下EMQX部署,很多情况下直接下载emqx运行是跑不起来的,有了Docker,我们可以直接从官网拉取EMQX镜像,运行即可。这样就省去了我们去配置环境,修改文件这些繁琐的过程。Docker让应用程序不必再关心主机环境,各个应用安装在Docker镜像里,Docker引擎负责运行包裹了应用程序的docker镜像。

Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。

1.3 docker运行原理行

Build once,Run anywhere(一次搭建,到处运行)

虚拟机的运作原理:是虚拟电脑的硬件资源,把硬件资源分配出来,然后虚拟出来多个操作系统,虚拟出来的是一个完整的电脑。

docker的运作原理:虚拟的软件资源,把电脑中的网络、存储的分成几份虚拟成容器,我们的软运行在容器中,每个容易只占用电脑的部分所需要的资源,并不是一个完整的电脑。

 1.4 docker应用场景

        1.Web 应用的自动化打包和发布。2.自动化测试和持续集成、发布。3.在服务型环境中部署和调整数据库或其他的后台应用。4.从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

二、docker内部核心

2.1docker核心思想

2.1.1集装箱

没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西.

2.1.2 标准化
1. 运输方式

docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去.

2. 存储方式

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

3. API接口

docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令.有了docker我们记docker的命令就可以对其进行操作.
2.1.3 隔离
我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒.

2.2 docker镜像(images)

2.2.1 镜像是什么?

镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。就像是集装箱,鲸鱼拖着的集装箱就是镜像。通俗点,镜像就是一堆静态的模板,运行起来的镜像就是容器。

2.2.2 镜像文件系统

从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件。linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下.

下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,再往上是应用代码。docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.

2.3 docker容器(container

Docker属于Linux容器的一种封装,提供简单易用的容器使用接口,它也是目前最流行的Linux容器解决方案。Docker 将软件代码和其依赖,全打包在一个文件中。运行单个文件,就会生成虚拟容器。在这个虚拟容器中,不管本地的操作系统是如何的不同,此容器都能照常运行。
 
简而言之,Docker的接口非常简单,可以帮助用户更好地创建和使用容器,让相同的代码在不同的环境上正常运行。容器器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,就是在正常进程的外面套用了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层程序的隔离。

 

2.4 docker仓库(repository)

镜像怎么在不同的主机上传输呢?

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

谁提供了这样的仓库呢?docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库.比较知名的是由网易蜂巢提供的 https://c.163yun.com/hub#/m/home/

三、ubuntu下docker安装

1. 的卸载掉你系统中的 docker

 官网给的删除命令

$ sudo apt-get purge docker-ce docker-ce-cli containerd.io 
$ sudo rm -rf /var/lib/docker

ubuntu 完全干净的卸载docker

1.常归删除操作
sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
 
2. 删除docker其他没有没有卸载
dpkg -l | grep docker
dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P # 删除无用的相关的配置文件
 
3.卸载没有删除的docker相关插件(结合自己电脑的实际情况)
sudo apt-get autoremove docker-ce-*
 
4.删除docker的相关配置&目录
sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker
 
5.确定docker卸载完毕
docker --version

摘抄于 ubuntu 完全干净的卸载docker_张老鱼的博客-CSDN博客

2.安装详细步骤

摘抄于 Ubuntu 20.04 安装 docker 详解_s清风s的博客-CSDN博客_docker ubuntu20.04

2.1 安装依赖


$ sudo apt-get remove docker docker-engine docker.io containerd runc 

更新一下
$ sudo apt-get update

安装相应的依赖
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

2.2 添加 Docker 的官方 GPG 密钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

2.3 验证密钥

$ sudo apt-key fingerprint 0EBFCD88

2.4 根据你不同的系统去设置一个稳定的仓库(根据你的系统选一个 安装)

1.x86_64/amd64
 
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

2.armhf
 
$ sudo add-apt-repository \
   "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
 
3.arm64
 
$ sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

2.5  再更新一次 apt

 $ sudo apt-get update

2.6)到目录中设置daemon.json文件(值得注意的是,如果是首次安装,理论上是不会有 cd /etc/docker 这个目录滴,所以如果你真的是第一次安装, 请跳过此步骤,等你下面步骤报错之后,嘿嘿这个目录就会有了,然后从头走一遍你就会发现,这部可以用了)

可以另起一个命令窗口 Ctrl + Alt + T
$ cd /etc/docker/ 
本人安装的时候  docker文件也是我自己创建的
 
查看是否有 daemon.json 文件,没有就创建
$ ls
 
创建 daemon.json 文件
$ touch daemon.json
 
编辑文件
$ sudo gedit /etc/docker/daemon.json
 
在弹出来的文本框中收入下面这段,保存
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

2.7 安装最新的 docker

 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

2.7.1一波顺利滴成功安装,下面的 hello-world 也是非常滴顺利敲出来,感觉一切良好

然而运行一波重启docker命令:$ sudo systemctl restart docker 发现报了下面这该死滴错误

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.

这错误出来后,就完了,重启系统之后docker再也没能启动,恭喜你!!你还是没能逃脱2.6的命运,请从这里跳到安装步骤第一步,再来一次,记得要看2.6

2.7.2 执行安装步骤直接报错,错误提示:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
containerd.io 已经是最新版 (1.4.3-1)。
将会同时安装下列软件:
  docker-ce-rootless-extras pigz slirp4netns
建议安装:
  aufs-tools cgroupfs-mount | cgroup-lite
下列【新】软件包将被安装:
  docker-ce docker-ce-cli docker-ce-rootless-extras pigz slirp4netns
升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 4 个软件包未被升级。
需要下载 0 B/75.2 MB 的归档。
解压缩后会消耗 321 MB 的额外空间。
您希望继续执行吗? [Y/n] Y
正在选中未选择的软件包 pigz。
(正在读取数据库 ... 系统当前共安装有 227693 个文件和目录。)
准备解压 .../archives/pigz_2.4-1_amd64.deb  ...
正在解压 pigz (2.4-1) ...
正在选中未选择的软件包 docker-ce-cli。
准备解压 .../docker-ce-cli_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce-cli (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 docker-ce。
准备解压 .../docker-ce_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 docker-ce-rootless-extras。
准备解压 .../docker-ce-rootless-extras_5%3a20.10.3~3-0~ubuntu-focal_amd64.deb  ...
正在解压 docker-ce-rootless-extras (5:20.10.3~3-0~ubuntu-focal) ...
正在选中未选择的软件包 slirp4netns。
准备解压 .../slirp4netns_0.4.3-1_amd64.deb  ...
正在解压 slirp4netns (0.4.3-1) ...
正在设置 slirp4netns (0.4.3-1) ...
正在设置 docker-ce-cli (5:20.10.3~3-0~ubuntu-focal) ...
正在设置 pigz (2.4-1) ...
正在设置 docker-ce (5:20.10.3~3-0~ubuntu-focal) ...
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Thu 2021-02-25 15:11:03 CST; 4ms ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
    Process: 26894 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
   Main PID: 26894 (code=exited, status=1/FAILURE)
dpkg: 处理软件包 docker-ce (--configure)时出错:
 已安装 docker-ce 软件包 post-installation 脚本 子进程返回错误状态 1
dpkg: 依赖关系问题使得 docker-ce-rootless-extras 的配置工作不能继续:
 docker-ce-rootless-extras 依赖于 docker-ce;然而:
  软件包 docker-ce 尚未配置。
 
dpkg: 处理软件包 docker-ce-rootless-extras (--configure)时出错:
 依赖关系问题 - 仍未被配置
因为错误消息指示这是由于上一个问题导致的错误,没有写入 apport 报告。
                                                                    正在处理用于 man-db (2.9.1-1) 的触发器 ...
正在处理用于 systemd (245.4-4ubuntu3.4) 的触发器 ...
在处理时有错误发生:
 docker-ce
 docker-ce-rootless-extras
E: Sub-process /usr/bin/dpkg returned an error code (1)

2.8运行 hello-world

sudo docker run hello-world

四、docker基础命令

容器生命周期管理

容器rootfs命令

镜像仓库

本地镜像管理

info|version

  • docker  run     运行镜像生成容器
  • docker run [options] 容器名
    -i:以交互模式运行容器,通常与 -t 同时使用
    -t:为容器重新分配一个tty伪输入终端,通常与 -i 同时使用 
    -rm:指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    -d:后台运行容器,并返回容器ID
    -p:端口映射
    -v:挂载目录 宿主机:容器目录
    --name:后面接容器名
    例如
    docker --name centos run -it -rm -p 127.0.0.1:5001:5000  centos:2.17.0
    表示绑定本机127.0.0.1的5001端口到容器的5000端口,运行名叫centos的容器
    docker run -it -rm -p 127.0.0.1::5000
    表示绑定本机127.0.0.1的任意端口到容器的5000端口
    
  • start/stop/restartdocker start/stop/restart id(容器id)开启 关闭 重新开启某个容器
  • docker kill 容器id    删除容器
  • docker rm 容器id (可加参数: -f 强制删除 -l 移除容器间的网络连接,而非容器本身 -v 删除容器和与容器关联的卷)
  • docker pause/unpause 容器id  停止启动容器
  • docker create  容器id 创建容器
  • 容器操作

  • docker ps 查看容器 可加-a查看所有容器
  • docker inspect
  • docker top
  • docker attach
  • docker events
  • docker logs 容器id  查看容器日志
  • docker wait
  • docker export
  • docker port
  • docker stats
  • docker commit -m "描述" 容器id 镜像名:版本号ocker commit 把容器打包成镜像
  • docker cp
  • docker diff
  • docker login
  • docker pull 镜像名 拉取镜像
  • docker push 地址:端口/文件:版本(推送制定镜像到docker镜像源服务器)
  • docker search 镜像名  搜索镜像
  • docker images 查看自己服务器中docker 镜像列表

  • docker image save 镜像名>**.tar(把镜像打包成tar)或者docker save -o **.tar 镜像名:版本
  • rmi
  • #删除一个
    docker rmi -f 镜像名/镜像ID
    
    #删除多个 其镜像ID或镜像用用空格隔开即可 
    docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
    
    #删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
    docker rmi -f $(docker images -aq)
    

  • docker tag 源文件 目标文件名:版本  给镜像打标签
  • build 
  • history 镜像id  显示镜像历史
  • docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
     
  • docker image load -i **.tar(加载镜像)
  • import 
  •  docker info  查看docker信息:
  • create 查看版本
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐