目录

1 Docker 介绍

1.1 简介

Docker是开发,运行和部署应用程序的开放管理平台。

开发人员能利用docker 开发和运行应用程序运维人员能利用docker 部署和管理应用程序

1.2 Docker平台介绍

  • Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。

  • 由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预。

  • Docker已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:

  • 使用容器来开发应用程序及其支持组件。•容器成为分发和测试你的应用程序的单元。•准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。

1.3 为什么使用Docker

  • Docker使您能够将应用程序与基础架构分开,以便您可以快速交付软件。

  • 借助Docker,您可以像管理应用程序一样管理基础架构。

  • 通过利用Docker的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间的延迟

  • 开发人员在本地编写代码,可以使用Docker同事进行共享,实现协同工作。

  • 使用Docker开发完成程序,可以直接对应用程序执行自动和手动测试。

  • 当开发人员发现错误或BUG时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验证。

  • 利用Docker开发完成后,交付时,直接交付Docker,也就意味着交付完成。后续如果有提供修补程序或更新,需要推送到生成环境运行起来,也是一样的简单。

  • Docker主要解决的问题:

  • 保证程序运行环境的一致性;

  • 降低配置开发环境、生产环境的复杂度和成本;

  • 实现程序的快速部署和分发

2 Docker 整体结构(了解)

2.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.2 Docker结构概览介绍

  • Docker客户端(Docker Client)

  • Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,通过更改或指定DOCKER_HOST连接远程服务端。

  • Docker服务端(Docker Server)

  • Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象(Docker Objects),如镜像、容器、网络、数据卷等

  • Docker Registries

  • 俗称Docker仓库,专门用于存储镜像的云服务环境.

  • Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。

  • Docker 对象(Docker Objects)

  • 镜像:一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。

  • 容器:镜像被运行起来后的实例。

  • 网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。

  • 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

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引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。

  • Union File Systems(联合文件系统–UnionFS):利用分层(layer)思想管理镜像和容器

2 Docker安装

一 Docker-CE 和 Docker-EE介绍版本介绍

  • Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。
  • Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。
  • 相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障。
  • 此外,Docker的发布版本分为Stable(稳定)版和Edge(测试)版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。
  • 通常情况下,Docker-CE足以满足我们的需求。主要针对Docker-CE进行学习。

1.1 版本情况

注意:自从区分docker-ce和docker-ee之后,docker最初始的版本是17.03,也就是17年发布的,所有17是老版本和新版本的分水岭

1.2 系统支持情况

二 Centos 上安装 Docker-CE

# 0 卸载老版本(新机器不用操作)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# yum list installed | grep docker
# yum remove docker-ce.x86_64 docker-ce-cli.x86_64
# rm -rf /var/lib/docker
# sudo yum update # 1 安装必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 2 添加源信息
-官方:地址在国外,很慢
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-阿里云:(推荐)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3 检查一下/etc/yum.repos.d/docker-ce.repo 中的url地址是不是都是阿里云
cat /etc/yum.repos.d/docker-ce.repo
# 4 安装
sudo yum -y install docker-ce
# 5 开启docker服务
systemctl start docker # 6 docker info 查看docker信息
  • 安装成功后,使用 docker version 命令查看

三 Ubuntu 上安装 Docker-CE

# 0 卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
# 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 写入软件源信息
#官方
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
  • 安装成功后,使用 docker version查看

如果出现权限禁止,需要切换到root用户执行

su

输入密码

docker version

四 Windows /MacOS 上安装 Docker-CE

五 加速配置

  • 为什么使用加速器:

配置Docker加速器,将会提升在国内获取Docker官方镜像的速度,否则后面下载镜像(docker pull)的过程会很慢,甚至有可能无法下载镜像

  • 配置阿里云/清华源加速器(docker 17以上版本)
# 方式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": ["https://x1566319.mirror.aliyuncs.com"]
}

3 镜像

一 镜像简介

镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。

通过镜像可以创建一个或多个容器。

二 镜像管理

2.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.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

2.3 镜像下载 - docker pull

# 作用:
下载远程仓库(如Docker Hub)中的镜像
# 命令格式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 命令参数(OPTIONS):
-a, --all-tags 下载所有符合给定tag的镜像
# 命令演示:
docker pull ubuntu
docker pull centos

2.4 镜像删除 - docker rmi/docker image rm

# 作用:
将本地的一个或多个镜像删除
# 命令格式:
docker rmi [OPTIONS] IMAGE [IMAGE...]
或者 docker image rm [OPTIONS] IMAGE [IMAGE...]
# 命令参数(OPTIONS):
-f, --force 强制删除
# 命令演示:
docker rmi e934 452a

2.5 镜像保存备份 – docker save

# 作用:
将本地的一个或多个镜像打包保存成本地tar文件(输出到STDOUT)
# 命令格式:
docker save [OPTIONS] IMAGE [IMAGE...]
# 命令参数(OPTIONS):
-o, --output string 指定写入的文件名和路径
# 命令演示:
docker save -o linux_images.tar centos ubuntu

2.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

2.7 镜像重命名 – docker tag

# 作用:
对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像
# 命令格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 命令参数(OPTIONS):

# 命令演示
docker tag e934 centos-newname:newtag

2.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

2.9 镜像历史信息 – docker history

# 作用:
查看本地一个镜像的历史(历史分层)信息
# 命令格式:
docker history [OPTIONS] IMAGE
# 命令参数(OPTIONS):
-H, --human 将创建时间、大小进行优化打印(默认为true)
-q, --quiet 只显示镜像ID
--no-trunc 不缩略显示
# 命令演示
docker history ubuntu
docker history ubuntu -H=false

三 总结

4 容器

一 容器简介

容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行

  • Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
  • 容器具备一定的生命周期。
  • 另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。

二 容器与虚拟机

  • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
  • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
  • 容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
  • 同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers下

注意:容器并不是虚拟机,但它们有很多相似的地方

  • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
  • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
  • 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

三 容器生命周期

3.1 虚拟机的生命周期

3.2 容器的生命周期

四 容器生命周期管理

4.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 --name test-container centos ps -A
docker create -ti --name test-container2 centos /bin/bash docker ps -a

4.2 容器启动 – docker start

# 作用:
将一个或多个处于创建状态或关闭状态的容器启动起来
# 命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
-i, --interactive 将当前shell的 STDIN连接到容器上
# 命令演示:
docker ps -a
docker start -a 65ebc
docker start test-container2

4.3 容器创建并启动 – docker run

# 作用:
利用镜像创建并启动一个容器
# 命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称
-d, --detach 在后台运行容器并打印出容器ID
--rm 当容器退出运行后,自动删除容器
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
docker run centos ps -A
docker run -d centos ps -A
docker run --rm -d centos ps -A
docker run -d centos ps -A

4.4 docker run 与 docker create + docker start

docker run 相当于 docker create + docker start –a       前台模式
docker run -d 相当于 docker create + docker start 后台模式

4.5 容器暂停 – docker pause

# 作用:
暂停一个或多个处于运行状态的容器
# 命令格式:
docker pause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):

# 命令演示
docker ps -a
docker pause test-container2
docker ps -a # 容器是Pause状态

4.6 容器取消暂停 – docker unpause

# 作用:
取消一个或多个处于暂停状态的容器,恢复运行
# 命令格式:
docker unpause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):

# 命令演示:
docker unpause test-container2
docker ps -a # 处于运行状态

4.7 容器关闭 – docker stop

# 作用:
关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认 10s)
# 命令演示:
docker stop -t 1 容器id

4.8 容器终止 – docker kill

# 作用:
强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
# 命令演示:
docker kill test-container2

4.9 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重启、容器内部进程运行发生错误等等“异常原因”。

4.10 容器重启 – docker restart

# 作用:
重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
该命令相当于stop和start命令的结合
# 命令格式:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 重启前,等待的时间,单位秒(默认 10s)
实则是关闭前等待的时间

4.11 容器删除 – docker container rm

# 作用:
删除一个或多个容器
# 命令格式:
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-f, --force 强行删除容器(会使用 SIGKILL信号)
-v, --volumes 同时删除绑定在容器上的数据卷
# 命令演示
docker rm -f 容器id 容器名

五 容器信息查看

5.1 容器详细信息 – docker container inspect

# 作用:
查看本地一个或多个容器的详细信息
# 命令格式:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-f, --format string 利用特定Go语言的format格式输出结果
-s, --size 显示总大小
# 命令演示
docker container inspect -f "{{json .State.Status}}" 容器id
docker container inspect 容器id

5.2 容器日志信息 – docker logs

# 作用:
查看容器的日志信息
# 命令格式:
docker logs [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
--details 显示日志的额外信息
-f, --follow 动态跟踪显示日志信息
--since string 只显示某事时间节点之后的
--tail string 显示倒数的行数(默认全部)
-t, --timestamps 显示timestamps时间
--until string 只显示某事时间节点之前的
# 注意:
容器日志中记录的是容器主进程的输出STDOUT\STDERR

5.3 容器重命名 – docker rename

# 作用:
修改容器的名称
# 命令格式:
docker rename CONTAINER NEW_NAME
# 命令参数(OPTIONS):

六 容器运行时操作

6.1 容器连接 – docker attach

# 作用:
将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接
# 命令格式:
docker attach [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
--no-stdin 不绑定STDIN

6.2 容器中执行新命令 – docker exec

# 作用:
在容器中运行一个命令
# 命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 命令参数(OPTIONS):
-d, --detach 后台运行命令
-i, --interactive 即使没连接容器,也将当前的STDIN绑定上
-t, --tty 分配一个虚拟终端
-w, --workdir string 指定在容器中的工作目录
-e, --env list 设置容器中运行时的环境变量

七 总结

docker容器与镜像

一 Docker的容器与镜像

1.1 容器与镜像的关系

1.2 容器提交 – 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

1.3 容器导出 – docker export

# 作用:
将容器当前的文件系统导出成一个tar文件
# 命令格式:
docker export [OPTIONS] CONTAINER
# 命令参数(OPTIONS):
-o, --output string 指定写入的文件,默认是STDOUT

1.4 容器打包的导入 – docker import

# 作用:
从一个tar文件中导入内容创建一个镜像
# 命令格式:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 命令参数(OPTIONS):
-c, --change list 为创建的镜像加入Dockerfile命令
-m, --message string 导入时,添加提交信息

数据卷

一 Docker 数据卷简介

1.1 为什么用数据卷

  • 宿主机无法直接访问容器中的文件
  • 容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
  • 容器之间也无法直接访问互相的文件

    为解决这些问题,docker加入了数据卷(volumes)机制,能很好解决上面问题,以实现:
  • 容器与主机之间、容器与容器之间共享文件
  • 容器中数据的持久化
  • 将容器中的数据备份、迁移、恢复等

1.2 数据卷的特点

  • 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
  • 数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
  • 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
  • 容器对数据卷的修改是实时进行的。
  • 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。

二 Docker 数据卷管理

2.1 Docker挂载容器数据卷的三种方式

  • bind mounts:将宿主机上的一个文件或目录被挂载到容器上。
  • volumes:由Docker创建和管理。使用docker volume命令管理
  • tmpfs mounts:tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上。

2.2 bind mounts方式挂载数据卷

# 利用docker run/create的参数为容器挂载数据卷
# 用法:
方式一: -v, --volume参数
-v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
方式二:--mount参数
--mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路径
注意:src指定的文件和路径必须提前创建或存在
# 命令演示:

2.3 volumes方式挂载数据卷

# 利用docker run/create为容器挂载数据卷
# 用法:
方式一: -v, --volume参数
-v VOLUME-NAME:容器中的文件或者文件夹路径
方式二:--mount 参数
--mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
# volume对象管理:
docker volume 命令管理volume数据卷对象
docker volume create 创建数据卷对象
docker volume inspect 查看数据卷详细信息
docker volume ls 查看已创建的数据卷对象
docker volume prune 删除未被使用的数据卷对象
docker volume rm 删除一个或多个数据卷对象

2.4 tmpfs mount方式挂载数据卷

# 利用docker run/create为容器挂载数据卷
# 用法:
--mount type=tmpfs, dst=PATH

2.5 共享其他容器的数据卷-数据卷容器

# 利用docker run/create 的--volumes-from参数指定数据卷容器
# 用法:
docker run/create --volumes-from CONTAINER

三 Docker 数据卷注意事项

Docker的数据卷更多会是使用volumes方式来进行使用。使用时需注意:

​ •如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。

​ •如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。

这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。

Dockerfile

一 Dockerfile 简介

  • Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件
  • 利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(定制镜像)

二 Dockerfile 示例与使用

2.1 Dockerfile参考示例

mkdir dockerfile_test
cd dockerfile_test
vim Dockerfile # Test
# VERSION 0.01
FROM ubuntu
RUN echo 'hello world'
CMD ["echo","this is image create by lqz"] docker build # 构建

2.2 Dockerfile使用命令 – docker build

# 作用:
根据dockerfile创建镜像
# 命令格式:
docker build [OPTIONS] PATH | URL | -
# 命令参数:
PATH Dockerfile所在路径(文件夹路径),文件名必须是Dockerfile
URL Dockerfile所在URL地址 OPTIONS:
-t, --tag list 为镜像设置名称和tag
-f, --file string 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

三 Dockerfile 特征

3.2 Dockerfile 构建特征

查看官方的Dockerfile:https://github.com/docker-library/docs

  • Dockerfile必须具备一个FROM命令来进行构建
  • 每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交后,产生新的镜像层)
  • 通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID

四 Dockerfile 命令概述

4.1 Dockerfile 命令概述(一)

FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build
CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
:为镜像添加对应的数据。
MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:设置对外暴露的端口。
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷
USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:设置工作目录
ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
STOPSIGNAL:设置容器退出时发出的关闭信号。
HEALTHCHECK:设置容器状态检查。
SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

docker 配置pycharm连接

1 原理介绍

2 操作 docker宿主机

# 1 配置运行远程客户端连接docker
vim /lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock 将管理地址写入 /etc/profile
执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2376' >> /etc/profile
执行命令:source /etc/profile 重启服务
执行命令: systemctl daemon-reload && systemctl restart docker # 2 vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"]
}
systemctl daemon-reload && systemctl restart docker
# 启动会报错,因为/lib/systemd/system/docker.service和该文件的本地连接配置冲突,修改/lib/systemd/system/docker.service
vim /lib/systemd/system/docker.service
...
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#改为
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
...
systemctl daemon-reload
systemctl restart docker curl 127.0.0.1:2376/version http://10.0.0.102:2376/version

3 修改本地pycharm配置

1 打开设置,搜索docker
2 选择TCP socket
3 填入:tcp://101.133.225.166:2376
4 Certificates folder暂时不填,Path mappings:暂时删掉
5 点击ok,在下面就能看到图形界面的管理

6 选择新的解释器(使用docker的解释器)解释器---》add---》docker--》默认会选中,点击ok(稍等一会,需要连接)

7 修改运行文件(可以看到目录映射,现在我们需要把代码传到宿主机的:/Users/liuqingzheng/PycharmProjects/llqz_test 路径)

8 配置sftp,远程上传代码

9 点 + 新建,输入名字

10 选择Mappings,配置上传的目录

11 上传代码,在项目上右键,Deplayment--》上传
运行代码即可

12 也可以选择tools-->Deployment-->Automatic Upload,每次改完代码会自动上传

13 我们无法安装模块,所有通过Dockerfile方式构建镜像,再切换解释器为新构建的镜像

14 写完直接在Dockerfile上右键运行

15 这样运行构建的镜像没有名字,我们可以配置,指定构建成的镜像名字



16 构建完成,重新选择该镜像作为解释器即可

最后:docker pull 的时候报错

error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/b6/b63ef4ef530f7ff2d368fb0df9c28840a285e503c8710aa29e7e1da54cbb6f54/data?verify=1588096454-x6AMkkUV0qUaOPWhqC%2FQpkcJ1RA%3D: x509: certificate has expired or is not yet valid

# 提示x509:证书已过期或尚未生效。则是系统时间错误。只要同步一下网络时间即可。同步网络时间命令:

data
yum install ntpdate -y
ntpdate ntp1.aliyun.com

Docker系列——介绍、安装、镜像、容器、docker容器与镜像、数据卷、Dockerfile、docker 配置pycharm连接的更多相关文章

  1. docker 数据卷和docker数据卷容器以及数据卷的备份和还原

    一:数据卷 1.什么是数据卷 数据卷是通过特殊设计的目录,可以绕过联合文件系统,为一个或者多个容器提供服务,数据卷是在docker宿主机当中,数据卷可以是文件也可以是文件夹. 2.特点 1.数据卷在容 ...

  2. 数据卷之Docker File

    DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本.后面再详细了解 DockerFile ! 1.我们在宿主机 /home 目录下新建一个 docker-tes ...

  3. Docker详细介绍安装与镜像制作和拉取

    一.Docker是什么? 产生背景: 开发和运维之间因为环境不同和导致的矛盾(不同的操作系统.软件环境.应用配置等)DevOps 代码.系统.环境.配置等封装成镜像Image--->运维: 集群 ...

  4. Docker Compose 介绍安装

    Compose介绍 Compose是一个定义和管理多容器的工具,也是一种容器编排工具,前身是Pig,使用Python语言编写.使用Compose配置文件描述多个容器应用的架构,biubiu使用什么镜像 ...

  5. Java篇:Docker的介绍安装 和常用命令

    文章目录 为什么 出现docker Docker的简介 容器(Container) 镜像(Image) 仓库(Repository) Docker的安装 查看容器 删除镜像 删除容器 部署应用 以my ...

  6. Docker系列(四)Centos6.5 搭建私人镜像仓库 v2

    .下载.运行registry 下载registry镜像: $ docker pull hub.c.163.com/library/registry 这个下载的过程有点长,耐心等待一下.O(∩_∩)O哈 ...

  7. docker系列之安装配置-2

    1.docker安装 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 目前,C ...

  8. Docker数据卷和Docker系统管理(一)

    一. 创建和挂载数据卷 1. 创建数据卷 (1)执行下列命令,创建一个名为my-data的数据卷 [root@c720120 ~]# docker volume create my-data my-d ...

  9. Docker数据卷和Docker系统管理(二)

    一. 在镜像中定义卷 1. Dockerfile中定义卷的案例 VOLUME /app/data VOLUME /app/data, /app/profiles, /app/config VOLUME ...

  10. Docker系列(一)安装

    操作系统版本:Centos7 Docker版本:1.8 设置安装源 1  cat > /etc/yum.repos.d/docker.repo << -EOF 2  [dockerr ...

随机推荐

  1. Maven进阶学习指南

    前言 当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中.但当一个大的项目同时需要依赖各种各样的外部 ...

  2. Github-Readme-Stats 简明教程

    1. 更新 Readme 文件 在你想要放置 Readme-WakaTime 的位置中放置以下注释,这将作为程序的入口 <!--START_SECTION:waka--> <!--E ...

  3. Idea报错:无法创建java虚拟机

    报错如下: 我怀疑是在配置algo4环境时,将系统变量改变了 于是我又重新配置了一下环境变量 然后运行 cmd 执行 java -version 还是报错 <JAVA_HOME>/lib/ ...

  4. java解析CSV文件(zipFiles 打成压缩包 exportObeEventDataExcel 前端页面响应)

    JAR包及代码17:39:09 <!-- https://mvnrepository.com/artifact/com.opencsv/opencsv --> <dependency ...

  5. 关于ChatGPT与机器时代的展望

    关于 ChatGPT 与机器时代的展望 机器人这一概念,最初不是出自计算机科学家或工程师之手,而是来自于捷克的戏剧家卡雷尔·恰佩克(Karl Capek)在 1920 年编排的一出名为"罗森 ...

  6. Anchored Neighborhood Regression【阅读笔记】GR全局回归

    论文信息 [Anchored Neighborhood Regression for Fast Example-Based uper Resolution]-TIMOFTER, 2013, IEEE ...

  7. PNG结构

    参考此博客 PNG的文件头总是固定的八个字节 89 50 4E 47 0D 0A 1A 0A 数据块长度13 00 00 00 0D 文件头数据块标识IDCH 49 48 44 52 13位数据块(I ...

  8. windows CMD命令的一些使用方法及注意事项

    windows CMD命令的一些使用方法及注意事项 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572397.html 一.执行路径或参数带中文.空格.特 ...

  9. Element-ui源码解析(二):最简单的组件Button

    好家伙,为了有足够的能力去开发组件,先研究一下别人的组件 开始抄袭模仿我们的行业标杆element-ui   找到Button组件的源码  只有三个文件,看上去非常易读,开搞  其中最重要的部分,自然 ...

  10. Linux 函数: my_func

    # A man and his 'fuctions' ;) # quick use ipmitool cmd to do something ipmi-ip-cmd () { local ip=$1 ...