文章目录
- 一、Docker介绍
- 1.什么是虚拟化
- 2.虚拟化模块
- 3.docker是什么
- 4.docker平台介绍
- 5.为什么使用docker
- 6.docker主要解决的问题
- 二、docker整体结构
- 1.Docker引擎介绍(Docker Engine)
- 2.Docker结构概览介绍
- 3.Docker底层技术
- 三、docker安装
- 1.Docker-CE和Docker-EE版本介绍
- 2.Centos上安装Docker-CE
- 3.Ubuntu上安装Docker-CE
- 4.配置国内源(加速配置)
- 四、镜像
- 1.镜像介绍
- 2.镜像操作
- 1)常用命令
- 2)其他命令
- 3.镜像总结
- 4.注册并登录到docker远程仓库
- 五、容器
- 1.容器介绍
- 2.容器与虚拟机
- 3.容器生命周期
- 4.容器相关命令
- 1)常用命令
- 2)docker stop和docker kill的区别
- 3)其他命令
- 5.docker run命令-v参数做目录映射
- 6.docker run命令-p参数做端口映射
- 7.注意项
- 8.文件拷贝
- 9.容器总结
- 六、Docker的容器与镜像
- 1.容器与镜像的关系
- 2.容器操作
一、Docker介绍
1.什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
2.虚拟化模块
-kvm:开源的免费的 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块
'自Linux 2.6.20之后集成在Linux的各个主要发行版本中'
-exsi:vmware商用的,装在裸机上,可以虚拟化出很多机器
-openstack(python开发的,开源的):电信云,华为云 openstack 管理云平台,对虚拟化的机器进行管理(创建、销毁、增加等)
-阿里云(自研,阿里飞天):阿里自研的类似于openstack,云服务器,之前在上面买云服务器的操作
-docker:容器技术
-k8s:多机容器管理,容器编排
3.docker是什么
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 项目的目标是实现【轻量级的操作系统虚拟化解决方案】。
Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的【容器就像操作一个快速轻量级的虚拟机】一样简单。
'Docker是开发运行和部署应用程序的开放管理平台'
开发人员能利用docker 开发和运行应用程序
运维人员能利用docker 部署和管理应用程序
4.docker平台介绍
- Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。
- 由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预。
- Docker已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:
使用容器来开发应用程序及其支持组件
容器成为分发和测试你的应用程序的单元
准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。
5.为什么使用docker
- Docker 容器虚拟化的好处,通过
容器
来打包应用、解耦应用和运行平台 - 更快的交付和部署
- 使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境
开发完之后,测试和运维人员可以直接使用完全相同的环境来部署代码
只要是开发测试过的代码,就可以确保 在生产环境无缝运行
Docker 可以快速创建和删除容器,实现快速迭代
,节约开发、测试及部署的时间
- 使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境
- 更高效的利用资源
- 运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能
同时对资源的额外需求很低
,与传统的虚拟机方式相比,Docker 的性能要提高 1 ~ 2 个数量级
- 运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能
- 更轻松的迁移和扩展
- 使用
Dockerfile
,只需要小小的配置修改,就可以替代以往大量的更新工作
所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理
- 使用
6.docker主要解决的问题
- 保证程序运行环境的一致性
- 降低配置开发环境、生产环境的复杂度和成本
- 实现程序的快速部署和分发
二、docker整体结构
1.Docker引擎介绍(Docker Engine)
- Docker Engine是一个包含以下组件的客户端-服务端(C/S)应用程序
- 服务端一个长时间运行的守护进程(Docker Daemon)
- REST API一套用于与Docker Daemon通信并指示其执行操作的接口
- 客户端命令行接口CLI( Command Line Interface)
- CLI利用Docker命令通过REST API直接操控Docker Daemon执行操作
- Docker Daemon负责创建并管理Docker的对象(镜像、容器、网络、数据卷)
2.Docker结构概览介绍
1.Docker客户端(Docker Client)
- Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,
- 对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,
- 通过更改或指定DOCKER_HOST连接远程服务端。
2.Docker服务端(Docker Server)
- Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象(Docker Objects),
- 如镜像、容器、网络、数据卷等
3.Docker Registries(注册中心)
- 俗称Docker仓库,专门用于存储镜像的云服务环境.
- Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。
- 当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时, 可以在仓库中下载下来
4.Docker 对象(Docker Objects)
- 镜像(Image):一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
* Docker 镜像(Image),就相当于是一个 root 文件系统
比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
- 容器(Container):镜像被运行起来后的实例。
* 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静 态的定义,容器是镜像运行时的实体
- 网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。
- 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。
1 docker 是cs架构 ,mysql,redis,c和s要通信,使用的http协议,符合resful规范
2 Docker镜像:镜像是基于一堆文件,相当于虚拟机装了操作系统,又装了软件的一堆文件
3 Docker容器:镜像运行起来,成为了容器,【当成一台虚拟机上面装了一些软件】
- 类和对象的概念
- 镜像是类---》生成多个对象
4 Registry(注册中心)
-镜像从哪里来?
-注册中心中拉取下来
3.Docker底层技术
-
Docker使用Go语言实现
-
Docker利用linux内核的几个特性来实现功能:
利用Linux的命名空间(Namespaces)
利用Linux控制组(Control Groups)
利用Linux的联合文件系统(Union File Systems)
这也就意味着Docker只能在linux上运行
在windows、MacOS上运行Docker,其实本质上是借助了虚拟化技术,然后在linux虚拟机上运行的Docker程序。
- 容器格式( Container Format ):
Docker Engine将namespace、cgroups、UnionFS进行组合后的一个package,就是一个容器格式(Container Format)。
Docker通过对这个package中的namespace、cgroups、UnionFS进行管理控制实现容器的创建和生命周期管理。
容器格式(Container Format)有多种,其中Docker目前使用的容器格式被称为libcontainer
- Namespaces(命名空间):为Docker容器提供操作系统层面的隔离
进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始起算
网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络
进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互相不可见的,通信需要借助网络
文件系统挂载隔离: 容器拥有自己单独的工作目录
内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的,而非宿主机的
- Control Groups(控制组-cgroups):为Docker容器提供硬件层面的隔离
控制组能控制应用程序所使用的硬件资源。
基于该性质,控制组帮助docker引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。
- Union File Systems(联合文件系统–UnionFS):利用分层(layer)思想管理镜像和容器
三、docker安装
1.Docker-CE和Docker-EE版本介绍
-Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。
-Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。
-相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障。
-此外,Docker的发布版本分为Stable(稳定)版和Edge(测试)版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。
-通常情况下,Docker-CE足以满足我们的需求。主要针对Docker-CE进行学习。
版本情况
自从区分docker-ce和docker-ee之后,docker最初始的版本是17.03,也就是17年发布的,所有17是老版本和新版本的分水岭
系统支持情况
2.Centos上安装Docker-CE
可以在虚拟机上创建centos7.9的系统,具体创建查看有些博主写的详细博文:
https://blog.csdn.net/qq_45743985/article/details/121152504?spm=1001.2014.3001.5506
'然后可以远程链接到虚拟机上的centos,但是需要获取到ip,当然也可以选择直接购买云服务器,购买的云服务器有公网ip'
几种链接方式:
-finalshell:免费的
-xshell :只能win用,收费
-命令窗口:git bash创建(git bash里输入ssh root@10.0.0.xxx root是用户,@符号后面是IP地址,然后需要输入密码链接即可)
'当然也可以不远程链接操作,可以直接在虚拟机centos上面直接操作也是一样'
'''
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。
在很多版本的CentOS中是不支持更新最新的一些补丁包的。
'''
0.yum 包更新到最新
yum update
卸载老版本docker:
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
1.安装必要的系统工具(依赖)
yum install -y yum-utils device-mapper-persistent-data lvm2
2.添加源信息(把yum源设置为阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.检查添加源是否设置成功
cat /etc/yum.repos.d/docker-ce.repo
4.安装Docker-CE
yum install docker-ce -y
5.验证是否安装成功docker
docker -v
6.运行docker-ce
systemctl status docker # 查看docker软件运行状态
systemctl start docker # 启动docker
systemctl restart docker # 重启docker
systemctl stop docker # 停止docker
docker info # 查看Docker信息
docker --help # 查看docker帮助文档
systemctl enable docker # 开机启动docker
3.Ubuntu上安装Docker-CE
"""
系统要求:Ubuntu 14.04及其以上版本
"""
1.安装必要工具
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
2.安装GPG证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
换成阿里云
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
2.1 写入软件源信息
#官方
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#换成阿里云
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
3.更新并安装docker-ce
sudo apt-get -y install docker-ce
4.开启docker服务
systemctl status docker
5.卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
"""
安装成功后,使用docker version查看
如果出现权限禁止,需要切换到root用户执行
su
输入密码
docker version
"""
4.配置国内源(加速配置)
为什么使用加速器?:
配置Docker加速器,将会提升在国内获取Docker官方镜像的速度,否则后面下载镜像(docker pull)的过程会很慢,
甚至有可能无法下载镜像
'配置方式:'
方式1(仅对当次有效)
docker run centos:7 --registry-mirror=https://docker.mirrors.ustc.edu.cn
#修改 /etc/default/docker,加入 DOCKER_OPTS=”镜像地址”,可以有多个
DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn"
方式2(json 配置文件的方式)(严格的json格式,不符合格式会报错)
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
'''
几个速度比较快的镜像地址
Docker 官方中国区: https://registry.docker-cn.com
网易: http://hub-mirror.c.163.com
中科大: https://docker.mirrors.ustc.edu.cn
'''
方式3(阿里云方式,同方式2,只是阿里云分配的私有地址,自己用自己的)
参考教程:https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.545.OY7haW
vi /etc/docker/daemon.json
{
"registry-mirrors": ["xxxxxxxxxxxxx"]
}
'这里的key就是阿里云镜像加速器地址'
# 按 esc
# 输入 :wq 敲回车
# 保存退出
systemctl daemon-reload # 重新加载docker配置
systemctl restart docker # 重启docker
四、镜像
1.镜像介绍
镜像是一个Docker的可执行文件 其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
通过镜像可以创建一个或多个容器
2.镜像操作
1)常用命令
1.镜像搜索:docker search
# 作用:
搜索Docker Hub(镜像仓库)上的镜像
# 命令格式:
docker search [OPTIONS] TERM
# 命令参数(OPTIONS):
-f, --filter filter 根据提供的格式筛选结果
--format string 利用Go语言的format格式化输出结果
--limit int 展示最大的结果数,默认25个
--no-trunc 内容全部显示
# 命令演示
docker search -f is-offical=true ubuntu
docker search ubuntu
2.镜像查看:docker images/docker image ls # 两个命令结果相同
# 作用:
列出本地镜像
# 命令格式:
docker images [OPTIONS] [REPOSITORY[:TAG]]
或者 docker image ls [OPTIONS] [REPOSITORY[:TAG]]
# 命令参数(OPTIONS):
-a, --all 展示所有镜像 (默认隐藏底层的镜像)
--no-trunc 不缩略显示
-q, --quiet 只显示镜像ID
# 命令演示:
docker images
docker images centos:latest
3.镜像下载:docker pull
# 作用:
下载远程仓库(如Docker Hub)中的镜像
# 命令格式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 命令参数(OPTIONS):
-a, --all-tags 下载所有符合给定tag的镜像
# 命令演示:
指定标签 tag
docker pull ubuntu
docker pull centos # centos版本号 如果不指定默认下载最新版:latest
docker pull centos:centos7 # 指定版本号,就下载指定的
4.镜像删除:docker rmi/docker image rm
# 作用:
将本地的一个或多个镜像删除
# 命令格式:
docker rmi [OPTIONS] IMAGE [IMAGE...]
或者 docker image rm [OPTIONS] IMAGE [IMAGE...]
# 命令参数(OPTIONS):
-f, --force 强制删除
# 命令演示:
docker rmi e934 452a # 删除多个,用空格隔开
docker rmi xxx(镜像id) -f # 强制删除正在运行的镜像
'一次性删除所有镜像'
docker rmi `docker images -q`
2)其他命令
5.镜像保存备份:docker save
# 作用:
将本地的一个或多个镜像打包保存成本地tar文件(输出到STDOUT)
# 命令格式:
docker save [OPTIONS] IMAGE [IMAGE...]
# 命令参数(OPTIONS):
-o, --output string 指定写入的文件名和路径
# 命令演示:
docker save -o linux_images.tar centos ubuntu
6.镜像备份导入:docker load
# 作用:
将save命令打包的镜像导入本地镜像库中
# 命令格式:
docker load [OPTIONS]
# 命令参数(OPTIONS):
-i, --input string 指定要打入的文件,如没有指定,默认是STDIN
-q, --quiet 不打印导入过程信息
# 命令演示
docker load -i linux_images.tar
docker load -i linux_images.tar -q
7.镜像重命名 – docker tag
# 作用:
对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像
# 命令格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 命令参数(OPTIONS):
无
# 命令演示
docker tag e934 centos-newname:newtag
8.镜像详细信息:docker image inspect/docker inspect
# 作用:
查看本地一个或多个镜像的详细信息
# 命令格式:
docker image inspect [OPTIONS] IMAGE [IMAGE...]
或者 docker inspect [OPTIONS] IMAGE [IMAGE...]
# 命令参数(OPTIONS):
-f, --format string 利用特定Go语言的format格式输出结果
# 命令演示:
docker image inspect -f "{{json .id}}" centos
docker image inspect -f "{{json .Created}}" centos
docker image inspect
9.镜像历史信息:docker history
# 作用:
查看本地一个镜像的历史(历史分层)信息
# 命令格式:
docker history [OPTIONS] IMAGE
# 命令参数(OPTIONS):
-H, --human 将创建时间、大小进行优化打印(默认为true)
-q, --quiet 只显示镜像ID
--no-trunc 不缩略显示
# 命令演示
docker history ubuntu
docker history ubuntu -H=false
3.镜像总结
4.注册并登录到docker远程仓库
1.网站:https://hub.docker.com/
'注册登录后,就可以查看我们自己的镜像(repositories),也可以把自己的镜像上传上去,给其他人用'
2.上传镜像
-登录docker:docker login
-给镜像打标签:
docker tag 本地镜像名:标签 你的名字/镜像名字:标签
例如:docker tag centos:centos7 0jchen/centos7:latest
3.上传到远程仓库
docker push 0jchen/centos7:latest
4.从远程仓库拉下镜像
docker pull centos7:latest
五、容器
1.容器介绍
容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行
Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
容器具备一定的生命周期。另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。
2.容器与虚拟机
作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势
- Docker 容器启动很快,启动和停止可以实现
秒级
,相比传统的虚拟机方式(分钟级)要快速很多 - Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器
- Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新
- Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程
3.容器生命周期
虚拟机的生命周期
容器的生命周期
4.容器相关命令
1)常用命令
1. 容器创建: docker create
# 作用:
利用镜像创建出一个Created 状态的待启动容器
# 命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
docker create centos
docker create --name centos7 centos ps -A (如果不带--name[--name后面跟着就是设置的名字],容器名字就不设置,会随机生成)
docker create -it --name centos7 centos /bin/bash
docker ps -a
2. 容器启动: docker start
# 作用:
将一个或多个处于创建状态或关闭状态的容器启动起来
# 命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
-i, --interactive 将当前shell的 STDIN连接到容器上
# 命令演示:
docker ps -a (查看所有容器状态,包含已停止容器)
docker start b97b3fcfab77 (容器id号)
docker start centos7 (容器名称)
'容器要运行,内部必须有个前台进程阻塞,否则容器就会停掉 /bin/bash'
3. 容器创建并启动: docker run # 如果本地有对应的镜像,就使用本地镜像创建启动,没有则从仓库去下载latest
# 作用:
利用镜像创建并启动一个容器
# 命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称
-d, --detach 在后台运行容器并打印出容器ID
--rm 当容器退出运行后,自动删除容器
-docker run 参数
-i 表示运行容器
-d 以守护式容器在后台运行,用这个参数创建出来的容器,命令行还在宿主机上,没有进入到容器内部
-t 表示容器启动后会进入容器命令行。加入这参数后,容器创建就能登录进去。即分配一个伪终端。
--name 指定容器名字,如果不指定,会随机一个名字
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
守护式方式创建容器:
docker run -id --name 容器名字 镜像:标签 # (不带--name默认随机自动生成容器名字,最好带上取名)
docker run -id --name centos7 centos:centos7 '(创建并运行容器,命令行在宿主机上)'
docker run -it --name centos7 centos:centos7 '(创建并运行容器,命令行在容器内部)'
退出容器 exit ,只要一退出容器就停止
交互式方式创建容器:
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
退出容器 exit
'可组合使用'
docker run -d centos
docker run --rm -d centos
'docker run 与 docker create + docker start'
docker run 相当于 docker create + docker start –a 前台模式
docker run -d 相当于 docker create + docker start 后台模式
4. 容器内执行新命令: docker exec
# 作用:
在进入容器中,立刻运行一个命令
# 命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 命令参数(OPTIONS):
-d, --detach 后台运行命令
-i, --interactive 即使没连接容器,也将当前的STDIN绑定上
-t, --tty 分配一个虚拟终端
-w, --workdir string 指定在容器中的工作目录
-e, --env list 设置容器中运行时的环境变量
# 命令演示:
docker exec -it 容器名称/容器id /bin/bash # 新开了一个bash进程
'-it进入到容器内的命令行中,-id还在宿主机内'
'当进入后退出容器exit,容器也不会停止,因为是新开的一个bash进程,停止的是新开的bash进程,创建容器时运行的bash进程还在'
docker exec -it 容器名称/容器id ls # 进入容器后执行ls命令,其他命令同样操作
5. 容器关闭: docker stop
# 作用:
关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认 10s)
# 命令演示:
docker stop -t 1 容器id/容器名称
docker stop 容器id/容器名称
6. 容器终止: docker kill
# 作用:
强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
# 命令演示:
docker kill 容器名称/容器id
7. 容器重启: docker restart
# 作用:
重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
该命令相当于stop和start命令的结合
# 命令格式:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 重启前,等待的时间,单位秒(默认 10s)
实则是关闭前等待的时间
8. 容器删除: docker centos7 rm
# 作用:
删除一个或多个容器
# 命令格式:
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-f, --force 强行删除容器(会使用 SIGKILL信号)
-v, --volumes 同时删除绑定在容器上的数据卷
# 命令演示
docker rm 容器id/容器名
docker rm -f 容器id/容器名 # 强制删除正在运行的容器
'一次性删除所有容器'
docker rm `docker ps -a -q`
2)docker stop和docker kill的区别
'docker stop和docker kill的区别'
# 一 前提知识点:
1 Linux其中两种终止进程的信号是:SIGTERM和SIGKILL
2 SIGKILL信号:无条件终止进程信号。
进程接收到该信号会立即终止,不进行清理和暂存工作。
该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。
3 SIGTERM信号:程序终结信号,可以由kill命令产生。
与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。
# 二 docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。
# 三 docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。
# 四 因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker kill几乎是立刻发生,无法撤销。
# 五 此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。
3)其他命令
9. 容器暂停: docker pause
# 作用:
暂停一个或多个处于运行状态的容器
# 命令格式:
docker pause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
无
# 命令演示
docker ps -a # 查看容器状态,包含已停止容器
docker pause centos7/容器id
docker ps -a # 容器是Pause状态
10. 容器取消暂停: docker unpause
# 作用:
取消一个或多个处于暂停状态的容器,恢复运行
# 命令格式:
docker unpause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
无
# 命令演示:
docker unpause centos7/容器id
docker ps -a # 处于运行状态
11. 容器详细信息: docker inspect 容器名/容器id
# 作用:
查看本地一个或多个容器的详细信息
# 命令格式:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-f, --format string 利用特定Go语言的format格式输出结果
-s, --size 显示总大小
# 命令演示
docker inspect -f "{{json .State.Status}}" 容器id/容器名
docker inspect python3.9
12. 容器日志信息: docker logs
# 作用:
查看容器的日志信息
# 命令格式:
docker logs [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
--details 显示日志的额外信息
-f, --follow 动态跟踪显示日志信息
--since string 只显示某事时间节点之后的
--tail string 显示倒数的行数(默认全部)
-t, --timestamps 显示timestamps时间
--until string 只显示某事时间节点之前的
# 注意:
容器日志中记录的是容器主进程的输出STDOUT\STDERR
13. 容器重命名: docker rename
# 作用:
修改容器的名称
# 命令格式:
docker rename CONTAINER NEW_NAME
# 命令参数(OPTIONS):
无
14. 容器连接: docker attach
# 作用:
将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接
# 命令格式:
docker attach [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
--no-stdin 不绑定STDIN
5.docker run命令-v参数做目录映射
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
'docker run命令-v参数做目录映射'
创建容器 添加-v参数 后边为 宿主机目录:容器目录
'''
以一个案例演示:
-运行出一个 centos77 容器,不进入, 做目录映射
-把宿主机的 /root/jack文件夹 映射到 容器内部的 /jack文件夹 /xx 在容器根路径创建
- -v可以写多个,可以是文件或文件夹
'''
1.cd # 回家 前提你是root用户
2.pwd # 可以看到/root
3.mkdir jack # 在root目录下创建一个文件夹
4.运行一个容器,做目录映射,但是不直接进入容器内
docker run -id --name centos77 -v /root/jack:/jack centos:centos7
5.docker exec -it centos77(也可以填容器id) /bin/bash # 以在容器内执行命令方式进入容器
6.ls # 这样就可以在容器根路径看到在宿主机root路径下创建的jack文件夹了,这样就做好了目录映射
7.在容器内部的jack文件夹下创建一个1.txt,并写入hello world!
8.退出容器,在宿主机/root/jack文件夹中查看是否存在1.txt以及输入的内容
cat 1.txt # 查看文件内容
'''
做了目录映射,容器和宿主机直接是相互影响的:
在容器内部修改文件,也会影响到外部宿主机文件
在外部修改文件,也会影响到容器内部
'''
'做目录映射好处'
后期咱们部署django项目
1 有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
2 运行mysql容器---》mysql配置文件,数据data目录,放在宿主机上做好映射
如果 mysql容器---》表数据,放到容器中---》如果删了容器---》数据库全没了
表数据,放在宿主机上---》把容器删除---》表数据还在----》再启动一个容器做好映射---》数据都还在
......
'''
注意:
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
'''
6.docker run命令-p参数做端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则。.
'docker run命令-p参数做端口映射'
创建容器 添加-p参数 后边为 宿主机端口:容器端口
'''
以一个案例演示:
-容器中启动一个mysql5.7 --》容器中的3306监听,宿主机3306没人监听,做端口映射后,宿主机的3306就被docker的这个容器监听了
'''
1.启动一个容器mysql5.7的root密码是1234
2.启动mysql容器 -p 宿主机端口:容器端口
以后台守护进程运行mysql容器,mysql的root用户密码是1234,宿主机和容器做了端口映射
docker run -id --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7
3.查看宿主机 3306端口占用情况
# netstat -nlp |grep 3307 查看本机80端口占用情况
yum install net-tools -y
netstat -nlp | grep 3306 # 查看后发现,被docker占了
'查看windows端口命令 netstat -nao | findstr 3306'
4.以后访问宿主机3306端口就等于访问容器的3306端口
5.win机器可以远程链接docker容器中的mysql5.7了
方式一:cmd窗口链接:
mysql -h192.168.174.xxx -P 3306 -uroot -p
输入密码即可
方式二:Navicat可视化软件链接:
输入链接名、主机、端口、用户名、密码链接即可
方式三:python链接
6.在本地链接的mysql中创建数据库,然后去宿主机中的容器中mysql5.7登录查看是否存在此数据库
docker exec -it mysql5.7 /bin/bash # 进入容器内部
mysql -uroot -p # 进入mysql
show databases; # 查看所有数据库
7.注意项
有很多镜像底层都是debian系统,因此在进入到容器内部安装模块的时候,需要用到
apt-get命令
例如python、mysql等镜像都是底层的操作系统是debian,所以安装模块的时候就不用直接使用yum install xxx安装了
需要使用apt-get install xxx来安装,另外在安装软件之前,最好更新一下apt-get update
apt-get install iputils-ping # ping模块
8.文件拷贝
虽然上面已经说过做目录映射,但是有的时候就是想不做目录映射,然后吧宿主机的文件直接拷贝到容器内,又想把容器内部文件拷贝到宿主机上,这个时候就需要用到文件拷贝
docker cp
文件拷贝(在宿主机上执行)
'容器的文件copy到宿主机上(不是在容器内执行)'
docker cp 容器名称/容器id:容器目录 需要拷贝的文件或目录
docker cp 0a96331:/1.txt /root/jack/1.txt
'宿主机的文件copy到容器中'
docker cp 需要拷贝的文件或目录 容器名称/容器id:容器目录
docker cp /root/jack/1.txt 0a96339:/1.txt
'补充'
docker无状态的服务(在容器中尽量运行无状态的服务)
-mysql reids 有状态,运行过程中产生数据,保存,容器删除,数据就没了
-uwsgi+django 无状态的服务
9.容器总结
六、Docker的容器与镜像
1.容器与镜像的关系
2.容器操作
1.容器提交 – docker commit
# 作用:
根据容器生成一个新的镜像
# 命令格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# 命令参数(OPTIONS):
-a, --author string 作者
-c, --change list 为创建的镜像加入Dockerfile命令
-m, --message string 提交信息,类似git commit -m
-p, --pause 提交时暂停容器 (default true)
# 命令演示
docker run --rm -dti centos bash
docker exec -d 容器id号 yum -y install net-tools
docker commit -m 'install net-tools' 容器id号 centos-net-tools:lastest
docker images
docker history centos-net-tools
2.容器导出 – docker export
# 作用:
将容器当前的文件系统导出成一个tar文件
# 命令格式:
docker export [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
-o, --output string 指定写入的文件,默认是STDOUT
3.容器打包的导入 – docker import
# 作用:
从一个tar文件中导入内容创建一个镜像
# 命令格式:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 命令参数(OPTIONS):
-c, --change list 为创建的镜像加入Dockerfile命令
-m, --message string 导入时,添加提交信息