Docker技术总结(基础篇01)

282 阅读7分钟

一、Docker简介

1、Docker是什么?

项目中部署不同程序员的配置可能不同,那么上线或者测试的时候就会有很大问题,如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?

解决方案:使用Docker——一个系统平滑移植,容器虚拟化技术。安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

总而言之,开发的环境和运维的环境不一致,希望能把环境一起复制过来,一次镜像,处处运行。

Docker是基于Go语言实现的云开源项目

2、Docker与容器

比较了 Docker 和传统虚拟化方式的不同之处:

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • Docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

3、官网

Docker官网:www.docker.com

DockerHub官网:hub.docker.com/

二、Docker安装

1、Docker说明

Docker依赖于已存在并运行的Linux内核环境。Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个虚拟的Linux环境。

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x

查看自己的内核

cat /etc/redhat-release

uname -r

2、Docker组成

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

通俗的说法

Docker镜像文件相当于是一个Java的类,可以创建对象,Docker的容器实例就有点像创建出来的对象。

img

3、Docker安装

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • yum安装gcc相关内容
yum -y install gcc

yum -y install gcc-c++
  • 安装需要的软件包
sudo yum install -y yum-utils
  • 设置镜像仓库

下面这个最好不要执行

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

推荐下面这个指令

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 更新yum软件包索引
yum makecache fast
  • 安装Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动测试docker
systemctl start docker

ps -ef | grep docker
  • 可以简单测试hello-world
docker run hello-world
  • 卸载
systemctl stop docker

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

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

3、阿里云镜像加速

登录:promotion.aliyun.com/ntms/act/ku…

搜索容器镜像服务

容器镜像服务 (aliyun.com):进入镜像工具、镜像加速器,赋值地址。

配置镜像加速器:

image.png

目录地址:/etc/docker/daemon.json

修改daemon文件,直接执行即可,不需要进入daemon.json文件:

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

4、docker的工作流程

docker run 干了什么?

image.png

  • docker有着比虚拟机更少的抽象层

由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

  • docker利用的是宿主机的内核,而不需要加载操作系统OS内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

三、Docker命令

1、帮助启动类命令

#启动docker
systemctl start docker

#停止docker
systemctl stop docker

#重启docker
systemctl restart docker

#查看docker状态
systemctl status docker

#开机启动
systemctl enable docker

#查看docker概要信息
docker info

#查看docker总体帮助文档
docker --help

#查看docker命令帮助文档
docker 具体命令 --help

2、镜像命令

(1)列出本地的镜像

docker images 

各个参数说明

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签版本号

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

选项说明

  • **-a:**列出本地所有的镜像
  • **-q:**只显示镜像id

(2)查询某个镜像

docker search 【options】某个XXX镜像的名字

各个参数说明

NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否 docker 官方发布

stars:类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED:自动构建。

选项说明

  • **--automated :**只列出 automated build类型的镜像;
  • **--no-trunc :**显示完整的镜像描述;
  • **-f <过滤条件>:**列出收藏数不小于指定值的镜像;
  • **--limit:**只列出一定数量的镜像,默认是25个

(3)下载镜像

docker pull 某个镜像的名字:【TAG】

#TAG有值就是最新版
#写了就是该版本

(4)查看镜像/容器/数据卷所占的空间

docker system df

(5)删除镜像

删除单个镜像:

docker rmi -f 镜像ID

删除多个镜像:

docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部镜像:

docker rmi -f $(docker images -qa) 

3、容器命令

(1)新建/启动容器

docker run 【options】 image 【command】【args】

OPTIONS说明

  • --name="容器新名字",为容器指定一个名称
  • -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
  • -i:以交互模式运行容器,通常与 -t 同时使用
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

也即启动交互式容器(前台有伪终端,等待交互)。

例子

#拉取ubuntu镜像
docker pull ubuntu

#查看镜像
docker images

#后台启动ubuntu
docker run -it ubuntu /bin/bash 

#查看正在运行的容器
docker ps

#查看所有运行过的容器
docker ps -a

#查看最近创建的n个容器
docker ps -n number

查看会发现:names是一个奇怪的值

[root@oliver001 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
80ebd502fc24   ubuntu    "/bin/bash"   13 seconds ago   Up 12 seconds             musing_archimedes

如果希望自己设置来明确一下,可以使用--name来启动:

docker run -it --name=ubuntu01 ubuntu /bin/bash

(2)退出容器

两种退出方式:

  • exit退出并停止容器
  • ctrl+p+q退出不停止容器

如果想再进去这个容器:

docker exec -it 容器名 bashShell(例如:/bin/bash)

(3)启动已经停止的容器

docker start 容器ID或容器名

(4)重启容器

docker restart 容器ID或容器名

(5)强制停止容器

docker kill 容器ID或容器名

(6)删除已经停止的容器

#注意这个必须先stop掉,再删除
docker rm 容器名或容器ID

#一次删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

(7)启动守护式容器(后台服务器)

docker run -d 容器名

(8)查看容器日志

docker logs 容器id

(9)查看容器内部的运行进程

docker top 容器ID

(10)查看容器内部的细节

docker inspect 容器ID

(11)进入正在运行的容器并以命令行交互

exec的方式重新进入:

docker exec -it 容器ID bashShell

attach的方式重新进入:

docker attach 容器ID

上面两个的区别

  • attach:直接进入容器启动命令的终端,不会启动新的进程。用exit退出,会导致容器的停止。
  • exec:是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。

(12)从容器内拷贝文件到主机上

docker cp 容器ID:容器内路径 目的主机路径

(13)导入和导出容器

  • export:导出容器的内容作为一个tar归档文件
  • import:从tar报中的内容创建一个新的文件系统再导入为镜像

案例:把一个docker容器删掉再恢复回来

docker export 容器ID > 文件名.tar

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

#案例
docker export xxxxxx > abcd.tar
cat abcd.tar | docker import - atguigu/ubunut:3.7