Docker入门(包含Docker常用命令)

Posted 程序dunk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker入门(包含Docker常用命令)相关的知识,希望对你有一定的参考价值。

个人博客欢迎访问

总结不易,如果对你有帮助,请点赞关注支持一下
微信搜索程序dunk,关注公众号,获取博客源码、数据结构与算法笔记、面试笔试题

虚拟机和容器

  • 虚拟机和容器都属于虚拟化技术

  • 虚拟机是在一套硬件上,虚拟出一个完整的操作系统,在该系统上再运行所需的应用程序

  • 容器不是虚拟出一个完整的操作系统,而是对进程的隔离

容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而虚拟机则是在硬件层面实现

image-20210610002118655

虚拟机和容器的区别

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

特性虚拟机容器
量级重量级轻量级
性能接近原生弱于原生
启动时间以分钟为单位以毫秒为单位
硬盘使用一般为 GB一般为 MB
占用资源占用更多的内存和CPU资源占用较少的内存和CPU资源
隔离性完全隔离,因此更安全进程级隔离,可能不太安全
系统支持量一般几十个支持上千个容器

认识Docker

什么是Docker

  • Docker是开源应用容器引擎,轻量级容器技术,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署,如果出现故障是,可以通过镜像,快速恢复服务
  • Docker诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护
  • Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。RedHat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用
  • Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术

LXC(Linux Container):容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源

  • 在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单

Docker的优点

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

  • 一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
  • 更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 隔离性:避免公用的服务器,资源会容易受到其他用户的影响。
  • 弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力。
  • 更轻松的迁移:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
  • 持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。

Docker的应用场景

  • Web应用的自动打包,自动测试和持续集成、快速部署
  • 弹性的云服务:因为Docker容器可以随开随关,很适合动态扩容和缩容
  • 提供一致性的环境:同步开发环境和生产环境

Docker核心

1

三个基本概念即生命周期

  • 镜像(Image)
  • 容器(Container)
  • 仓库(repository)

三个关键动作

  • Build(构建镜像):镜像就像是集装箱包括文件及运行环境等资源
  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像超级码头一样
  • Run(运行镜像):正在运行的镜像就是一个容器,容器就是运行程序的地方

Docker镜像

  • 一个只读模板,可以用来创建容器,一个镜像可以创建多个容器
  • Docker 提供了一个很简单的机制来创建和更新现有的镜像,甚至可以直接从其他人那里获取做好的镜像直接使用

Docker容器

  • 容器是从镜像创建的运行实例,也就是镜像启动后的一个实例称为容器,是独立运行的一个或一组应用
  • Docker利用容器来运行应用,他可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台(沙箱)
  • 可以把容器看做是一个简易版的 Linux(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

Docker仓库

  • 仓库是集中放镜像文件的场所,有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
  • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式
  • 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问
  • 当然,用户也可以在本地网络内创建一个私有仓库
  • 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了

注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务

扩展问题

Docker为什么快?

这里主要说一下Docker为什么比VMware快

  • 首先Docker的抽象层比VMware虚拟机少,Docker不需要Hypervisor实现硬件资源的虚拟化,Docker需要的硬件都是实际物理机上的硬件资源。所以磁盘占用、CPU、内存利用率上Docker有很大的优势
  • Docker利用的宿主机的内核,不需要Guest OS,当新建一个容器时,Docker不需要像虚拟机一样重新加载一个操作系统内核,这样就减少了加载操作系统内核这样的费时费资源过程。因为Docker使用宿主机的操作系统,新建一个Docker容器只需要几秒
在这里插入图片描述

安装Docker

官网教程

卸载旧版本

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

在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker

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

安装Docker引擎

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

启动docker

sudo systemctl start docker

测试是否安装成功

sudo docker run hello-world
image-20210610172402532

卸载docker

卸载 Docker Engine、CLI 和 Containerd 包

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

主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷

/var/lib/docker:默认工作路径

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

.配置镜像加速器

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

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

Docker常用命令

命令文档

帮助命令

docker version				#docker版本信息
docker info					#docker详细信息,镜像和容器的数量
docker [命令] --help			#查看具体docker命令的解释

镜像命令

docker images

docker images    #获取已下载镜像列表	

Options:
  -a, --all             #列出本地所有镜像(包含中间映像层)
      --digests         #显示镜像摘要信息			
  -f, --filter filter   #过滤
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           #只显示镜像 ID
  --no-trunc			#显示完整的镜像信息
image-20210620115928987
  • RESPOSITORY:镜像名;
  • TAG:镜像版本,latest 代表最新版;
  • IMAGE_ID :镜像唯一 ID;
  • CREATED :镜像的创建时间;
  • SIZE:镜像的大小。

docker search

docker search    #搜索镜像

-f, --filter filter:根据提供的条件过滤输出
	#比如
	docker search -f stars=3000 mysql	#列出星数不小于3000的mysql镜像;
--no-trunc:显示镜像完整描述信息;
--limit int:最大搜索结果数(默认 25)
image-20210620120446005
  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:星数(点赞)
  • OFFICAL:是否是官方镜像
  • AUTOMATED:是否是自动构建的

docker pull

docker pull [IMAGE_NAME]:[TAG]      #下载镜像
#IMAGE_NAME:镜像名,TAG :标签,镜像版本,可选的,默认为 latest

docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
# 分层下载   结合联合文件系统
75646c2fb410: Pull complete   
878f3d947b10: Pull complete 
1a2dd2f75b04: Pull complete 
8faaceef2b94: Pull complete 
b77c8c445ec2: Pull complete 
074029aeaa5f: Pull complete 
5a1122545c6c: Pull complete 
6c95ccd00139: Pull complete 
60a719448fdb: Pull complete 
f31898a387a3: Pull complete 
bcf402a978dc: Pull complete 
cf0bc7da512e: Pull complete 
Digest: sha256:c35eb76bbccfd0138c8c68ccb9b4cffe42c488a27f64ddc31a2b5f65aa93fce6   #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest   真实地址

docker rmi

docker rmi       #删除镜像
docker rmi -f 镜像ID #删除指定镜像
#删除多个镜像
docker rmi -f ID ID ID
#删除所有镜像
docker rmi -f $(docker images -aq)

容器命令

docker run [参数] image

#运行容器
docker run [参数]  image

-- name			#为容器起一个名称
-i				#以交互方式运行容器,通常与 -t 搭配使用
-t				#为容器重新分配一个伪输入终端,通常与 -i 搭配使用
-d				#执行完这句命令后,控制台将不会阻塞,可以继续输入命令操作,不会阻塞,也就是启动守护式容器
-it  			#会进入启动容器的命令控制台,也就是启动交互式容器	退出使用exit
-P				#随机端口映射
-p				#指定端口映射
image-name		#要运行的镜像名称

Ctrl + p + q	#不会退出镜像

docker ps

docker ps [参数]		#列出所有运行的容器

-a				#查看所有容器,包括已停止运行的
-q				#静默模式,只显示容器编号
-l				#显示最近创建的容器
-n 3			#显示最近创建的 num(此处为 3)个容器
--no-trunc		#不截断输出,显示完整信息
image-20210620122035895
  • CONTAINER ID:启动时生成的容器 ID;
  • IMAGE:该容器使用的镜像;
  • COMMAND:容器启动时执行的命令;
  • CREATED:容器创建时间;
  • STATUS:当前容器状态;
  • PORTS:当前容器所使用的端口号;
  • NAMES:启动时给容器设置的名称。

docker stop

docker stop container-name/container-id			#停止容器

docker kill

docker kill container-name/container-id			#强制停止容器(类似强制关机)

docker start

docker start container-name/container-id		#启动容器

run 和 start的区别

docker run

docker run只有在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器的时候,只需要使用命令docker start就可以

docker run相当于执行了两步操作:将镜像(Image)放到容器(Container)中,这一步过程叫做docker create,然后将容器启动,使之变成运行时容器(docker start)

在这里插入图片描述
docker start

docker start的作用是:重新启动已经存在的容器。也就是说,如果使用这个命令,我们必须先要知道这个容器的ID、或者这个容器的名字,我们可以使用docker ps命令找到这个容器的信息

docker restart

docker restart container-name/container-id		#重启容器

其他命令

docker run -d存在的问题

启动后发现立刻停止掉了

docker 容器使用后台运行 ,就必须有一个前台进程 docker发现没用应用会立刻停止

通过Ctrl + p + q退出容器不会停止容器

docker logs container-id/container-name

docker logs 	#查看容器日志

参数含义
-t				#加入时间戳
-f				#跟随最新的日志打印
-n				#显示最后多少条

 docker logs -tf --tail 10 		#容器id  显示指定行数的日志
 docker logs -tf  				#容器id  显示所有日志

docker top

docker top 				#查看容器中运行的进程信息

docker inspect

docker inspect 			#查看镜像元数据

docker exec -it containerId

docker exec -it cId		#进入正在运行的容器*(进入容器后,开启一个新的中断)

docker attach 			#容器id /bin/bash (进入正在运行的终端(当前中断))

重用命令小结

image-20210626163004385
命令英文中文
attachAttach to a running container当前 shell 下 attach 连接指定运行镜像
buildBuild an image from a Dockerfile通过 Dockerfile 定制镜像
commitCreate a new image from a container changes提交当前容器为新的镜像
cpCopy files/folders from the containers filesystem to the host path从容器中拷贝指定文件或者目录到宿主机中
createCreate a new container创建一个新的容器,同 run,但不启动容器
diffInspect changes on a container’s filesystem查看 docker 容器变化
eventsGet real time events from the server从 docker 服务获取容器实时事件
execRun a command in an existing container在已存在的容器上运行命令
exportStream the contents of a container as a tar archive导出容器的内容流作为一个 tar 归档文件[对应 import]
historyShow the history of an image展示一个镜像形成历史
imagesList images列出系统当前镜像
importCreate a new filesystem image from the contents of a tarball从 tar 包中的内容创建一个新的文件系统映像[对应 export]
infoDisplay system-wide information显示系统相关信息
inspectReturn low-level information on a container查看容器详细信息
killKill a running containerkill 指定 docker 容器
loadLoad an image from a tar archive从一个 tar 包中加载一个镜像[对应 save]
loginRegister or Login to the docker registry server注册或者登陆一个 docker 源服务器
logoutLog out from a Docker registry server从当前 Docker registry 退出
logsFetch the logs of a container输出当前容器日志信息
portLookup the public-facing port which is NAT-ed to PRIVATE_PORT查看映射端口对应的容器内部源端口
pausePause all processes within a container暂停容器
psList containers列出容器列表
pullPull an image or a repository from the docker registry server从 docker 镜像源服务器拉取指定镜像或者库镜像
pushPush an image or a repository to the docker registry server推送指定镜像或者库镜像至 docker 源服务器
restartRestart a running container重启运行的容器
rmRemove one or more containers移除一个或者多个容器
rmiRemove one or more images移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
runRun a command in a new container创建一个新的容器并运行一个命令
saveSave an image to a tar archive保存一个镜像为一个 tar 包[对应 load]
searchSearch for an image on the Docker Hub在 docker hub 中搜索镜像
startStart a stopped containers启动容器
stopStop a running containers停止容器
tagTag an image into a repository给源中镜像打标签
topLookup the running processes of a container查看容器中运行的进程信息
unpauseUnpause a paused container取消暂停容器
versionShow the docker version information查看 docker 版本号
waitBlock until a container stops, then print its exit code截取容器停止时的退出状态值

参考文献:

Docker 从入门到实践系列一 - 什么是Docker

《Docker从入门到实践》

官网文档

以上是关于Docker入门(包含Docker常用命令)的主要内容,如果未能解决你的问题,请参考以下文章

docker入门之二:docker常用命令

Docker入门-常用命令

Docker 从入门到实践系列三 - Docker 常用命令

Docker 从入门到实践系列三 - Docker 常用命令

Docker容器入门-基本命令的使用

入门:Docker常用命令及解释