Docker

0、基础

概念

Docker是一个开源的容器引擎,基于LXC容器技术,使用Go语言开发。源代码托管在Github上,并遵从Apache2.0协议。

Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。

简单来说:Docker就是一种快速解决生产问题的一种技术手段。

Docker 官网:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

Docker与虚拟机

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

  • docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
  • docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。
  • docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量。对系统的利用率非常高。
  • 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离
  • 安全性: docker的安全性也更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
  • 可管理性:docker的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力。
  • 高可用和可恢复性:docker对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%高可用,保证业务连续性。
  • 快速创建、删除:虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。
  • 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署;

  

      virtualization 虚拟机结构

      docker结构

优缺点

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

对比传统虚拟机总结

特性容器虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

缺点:

  • 依赖操作系统
  • 高度依赖网络
  • 银行U盾等场景不能用

docker三大基本组件:镜像、容器、仓库

镜像:镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像只是一个虚拟的概念,并不是非得由一个一个的文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础,采用分层存储的方式。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

容器:镜像Image和容器Container的关系,就像是面向对象程序设计中的  和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在镜像基础上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

仓库:Docker Registry,镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

 Ubuntu 镜像 为例ubuntu 是仓库的名字,其内包含有不同的版本标签,如16.0418.04我们可以通过 ubuntu:16.04或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest

仓库名经常以 两段式路径  形式出现,比如 jwilder/nginx-proxy前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

  • Docker Registry 公开服务,是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。
  • 私有 Docker Registry除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。

一、基础使用

官网软件源配置 : https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#upgrade-docker-after-using-the-convenience-script

国内软件源配置 https://blog.csdn.net/weixin_32820767/article/details/83820505

cd /etc/apt/
mv sources.list sources.list.bak
vim sources.list
# sohu shangdong
deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

# 163 guangdong
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

# tsinghua.edu
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

# aliyun
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse

# neu.edu
deb http://mirror.neu.edu.cn/ubuntu/ xenial main restricted universe multiverse partner
deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

安装依赖软件
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
使用官方推荐源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

使用阿里云的源{推荐1}
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

使用清华的源{推荐2}
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

检查
apt-get update
国内软件源

docker软件安装

apt-cache madison docker-ce  # 查看支持的docker版本

apt-get install docker-ce -y    # 安装docker

apt-get install docker-ce=<VERSION> -y    # 可指定版本安装dockerapt-get install docker=5:18.09.0~3-0~ubuntu-xenial -y

启动docker

systemctl start docker

systemctl status docker

注意:ubuntu安装完毕后,默认就开启服务了

docker version      # 测试docker

 

网卡区别:

安装前:只有ens33和lo网卡

安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1

docker服务命令格式:

systemctl [参数] docker    参数详解:start 开启服务  stop 关闭  restart 重启  status 状态

删除docker命令:

apt-get autoremove remove docker-ce    # 自动删除

# 单个手动删除

rm -rf /var/lib/docker/     

rm -rf /etc/docker 

基本目录

 /etc/docker/     docker的认证目录

 /var/lib/docker/     docker的应用目录

docker加速器

 加速器简介 在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daocloud 的方法进行加速配置。

 访问 daocloud.io 网站,登录 daocloud 账户 

终端执行命令 & 修改配置项

二、镜像管理

搜索镜像

命令格式:

docker search [image_name]

命令演示:

docker search ubuntu

 

获取镜像

命令格式:

docker pull [image_name]  或者  docker image pull [image_name]

命令演示:

docker pull Ubuntu  或者  docker image pull nginx

获取的镜像在  /var/lib/docker 目录下,具体详见docker仓库知识

查看镜像

命令格式:

docker images <image_name>  或者  docker image ls <image_name>

命令演示:

docker images 

docker images -a    列出所有的本地的images(包括已删除的镜像记录)

镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息

查看镜像历史

命令格式:

docker history [image_name]

我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息

镜像重命名 : 同一个镜像(id相同),相当于给镜像多添加一个引用

命令格式:

docker tag [old_image]:[old_version] [new_image]:[new_version]

命令演示:

docker tag nginx:latest sswang-nginx:v1.0

 

删除镜像

命令格式:

docker rmi [image_id/image_name:image_version]  或者  docker image rm [image_id/image_name:image_version]

命令演示:

docker rmi 3fa822599e10

注意:如果一个image_id存在多个名称,那么应该使用 name:tag 的格式删除镜像

docker image prune    # 清除状态为dangling的镜像

docker image prune -a      # 移除所有未被使用的镜像

docker image prune -a --filter "until=24h"    # 删除在24h之前安装的镜像

导出镜像  :  将已经下载好的镜像,导出到本地,以备后用。

命令格式:

docker save -o [新包文件名] [镜像]

docker save [镜像1] ... [镜像n] > [包文件名]

或者

docker image save –o [新包文件] [镜像1] ... [镜像n]

docker image save [镜像1] ... [镜像n] > [包文件]

注意:docker save 会保存镜像的所有历史记录和元数据信息

导出镜像

docker save -o nginx.tar sswang-nginx

 

导入镜像

命令格式:

docker load < [image.tar_name]

docker load --input [image.tar_name]

注意: docker load 不能指定镜像的名称

导入镜像文件

docker load < nginx.tar

三、容器管理 依靠一个镜像创建一个容器  --->  启动容器  --->  执行命令

查看容器

命令格式docker ps   或者   docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES      # docker ps

注意:

管理docker容器可以通过名称,也可以通过ID,同一个镜像可运行成多个容器

ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器

启动容器

守护进程方式启动容器

命令格式docker run <参数,可选> [docker_image] [执行的命令]  或者    docker container run <参数,可选> [docker_image] [执行的命令]

 docker run -d nginx    # 让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现

启动已终止的容器  :  在生产过程中,常常会出现运行和不运行的容器,我们使用 start 命令开起一个已关闭的容器

命令格式docker start [container_id]    或者   docker container start [container_id]

关闭容器 : 在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器

命令格式docker stop|stop|restart [container_id]        或者    docker container stop|stop|restart [container_id]

关闭容器id  docker stop 8005c40a1d16

 

删除容器

删除容器有两种方法:

正常删除 -- 删除已关闭的

强制删除 -- 删除正在运行的

 

正常删除容器

命令格式: docker rm [container_id]              docker container rm [container_id]

删除所有已停止的容器: docker container prune

删除已关闭的容器,命令演示

docker rm 1a5f6a0c9443

强制删除运行容器

命令格式:docker rm -f [container_id]

删除正在运行的容器

docker rm -f 8005c40a1d16

删除部分容器

docker container prune --filter "until=24h"

批量关闭容器

命令格式:  docker rm -f $(docker ps -a -q)    # -a : 所有容器    -q : 所有容器的id     

创建并进入容器

命令格式:docker run --name [container_name] -it [docker_image] /bin/bash

        docker container run --name [container_name] -it [docker_image] /bin/bash

命令演示:

docker run -it --name sswang-nginx nginx /bin/bash

root@7c5a24a68f96:/# echo "hello world"  # 在docker中的Ubuntu终端输出信息

hello world

root@7c5a24a68f96:/# exit    # 退出docker中的Ubuntu终端

exit        

 

docker 容器启动命令参数详解:

--name:给容器定义一个名称

-i : 则让容器的标准输入保持打开。

-t : 让docker分配一个伪终端,并绑定到容器的标准输入上

/bin/bash : 终端即是一个程序,执行一个终端程序

退出容器:

方法一exit

方法二Ctrl + D

手工方式进入容器

命令格式:

docker exec -it 容器id /bin/bash  或者  docker container exec -it 容器id /bin/bash

效果演示:

docker exec -it d74fff341687 /bin/bash

基于容器创建镜像

命令格式:

docker commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]

或者

docker container commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]

命令演示:

进入一个容器,创建文件后并退出

./docker_in.sh d74fff341687

mkdir /sswang

exit

创建一个镜像

docker commit -m 'mkdir /sswang' -a "sswang" d74fff341687 sswang-nginx:v0.2

查看镜像

docker images

启动一个容器

docker run -itd sswang-nginx:v0.2 /bin/bash

进入容器进行查看

docker container exec -it  ae63ab299a84 /bin/bash

ls

 

查看容器运行日志

命令格式:  docker logs [容器id]  或者  docker container logs [容器id]

命令效果:  docker logs 7c5a24a68f96

查看容器详细信息

命令格式:  docker inspect [容器id]  或者  docker container inspect [容器id]

命令效果:  docker inspect 930f29ccdf8a    # 查看容器全部信息

 

查看容器网络信息

docker container  inspect -f '{{.NetworkSettings.IPAddress}}' 759942f45646  # {{ }} 模板语言,用此命令得到的是一个json格式数据

dockers  image inspect  镜像名:tag          # 查看镜像的-m信息

 

四、仓库管理

Docker的仓库有三大类:

公有仓库:Docker hub、Docker cloud、

 私有仓库:registry、harbor

本地仓库:在当前主机存储镜像的地方。

 

相关命令

和仓库相关的命令:

docker login [仓库名称]

docker pull [镜像名称]

docker push [镜像名称]

docker search [镜像名称]

registry私有仓库部署

创建仓库流程

1、根据registry镜像创建容器

2、配置仓库权限

3、提交镜像到私有仓库

4、测试

实施方案

 docker pull registry            # 下载registry镜像

 docker run -d -p 5000:5000 registry   # 启动仓库容器, -p 宿主机端口:容器端口  端口映射,访问registry时可以使用 192.168.137.128:5000|127.0.0.1:5000|172.17.0.2:5000

 curl 127.0.0.1:5000/v2/_catalog       # 检查容器效果

 vim /etc/docker/daemon.json       # 配置容器权限

 {"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:5000"]}

注意:私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号

重启docker服务

 systemctl restart docker

 systemctl status docker

 效果查看

docker start 315b5422c699    # 启动容器

 docker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini    # 标记镜像,需要将push镜像重命名   私有仓库ip/镜像名

 docker push 192.168.8.14:5000/ubuntu-14.04-mini          # 提交镜像

 docker pull 192.168.8.14:5000/ubuntu-14.04-mini          # 下载镜像

五、数据管理: 将宿主机目录映射到仓库容器目录中,此时就算删除容器,容器内保存的镜像也不会被删除

数据卷实践 之 目录

命令格式:  docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称]   # 注意宿主机目录&容器目录都是绝对路径

命令演示:

echo "file1" > /tmp/file1.txt      # 创建测试文件

docker run -itd --name test1 -v /tmp:/test1 nginx    # 启动一个容器,挂载数据卷,宿主机中的目录必须存在

测试效果

~# docker exec -it a53c61c77 /bin/bash

root@a53c61c77bde:/# cat /test1/file1.txt

file1

数据卷实践 之 文件

命令格式:  docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称]   # 注意宿主机目录&容器目录都是绝对路径

注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致

命令演示: 

 echo "file1" > /tmp/file1.txt      # 创建测试文件

docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx    # 启动一个容器,挂载数据卷 

测试效果

~# docker exec -it 84c37743 /bin/bash

 root@84c37743d339:/# cat /nihao/nihao.sh

 file1

 

数据卷实践 之 删除

 docker volume rm

 docker volume prune

数据卷容器 

将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的

docker 数据卷命令详解

# docker run --help 

  -v, --volumes-from value       Mount volumes from the specified container(s) (default [])    #   从指定的容器挂载卷,默认为空

               

数据卷容器操作流程

1、创建数据卷容器 

2、其他容器挂载数据卷容器

注意:数据卷容器不启动

数据卷容器实践

创建一个数据卷容器

命令格式:

docker create -v [宿主机数据卷目录]:[容器数据卷目录] --name [容器名字] [镜像名称

docker create -v [宿主机数据卷目录]:[容器数据卷目录]  -v [宿主机数据卷目录]:[容器数据卷目录]  --name [容器名字] [镜像名称

执行效果:

docker create -v /data --name v-test nginx    # 数据卷容器无需启动运行,创建即可不用run

创建两个容器,同时挂载数据卷容器

命令格式:

docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称

执行效果:

docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash    # 创建 vc-test1 容器

docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash    # 创建 vc-test2 容器

确认卷容器共享

进入vc-test1,操作数据卷容器

~# docker exec -it vc-test1 /bin/bash

root@c408f4f14786:/# ls /data/

root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt

root@c408f4f14786:/# exit

 

进入vc-test2,确认数据卷

 ~# docker exec -it vc-test2 /bin/bash

 root@7448eee82ab0:/# ls /data/

 v-test1.txt

 root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt

 root@7448eee82ab0:/# exit

 

回到vc-test1进行验证

 ~# docker exec -it vc-test1 /bin/bash

 root@c408f4f14786:/# ls /data/

 v-test1.txt  v-test2.txt

 root@c408f4f14786:/# cat /data/v-test2.txt

 v-test2

 

回到宿主机查看/data/目录

 ~# ls /data/

结果证明:容器间可以共享数据卷里容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中

六、网络管理 

端口映射 : 默认情况下,容器和宿主机之间网络是隔离的,可以通过端口映射的方式,将容器中的端口映射到宿主机的某个端口上。这样就可以通过宿主机的 ip+port 的方式来访问容器里的内容

端口映射种类

1、随机映射 -P(大写)

2、指定映射  -p 宿主机端口:容器端口

注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,因为涉及到映射,不管哪种映射都会影响性能

随机映射实践

命令格式:  docker run -d -P [镜像名称]

命令效果:  docker run -d -P nginx    # 启动一个 nginx 镜像

注意:宿主机的32768端口会被映射到容器的80端口,浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口

-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1

指定主机随机映射

命令格式 :   docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]

命令效果 :   docker run -d -p 192.168.8.14::80 --name nginx-2 nginx

指定映射实践

命令格式:  docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]

注意:如果不指定宿主机ip的话,默认使用 0.0.0.0,容器端口必须清楚,而且必须写出来

命令实践:  docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx    #  启动容器时,给容器指定一个访问的端口 9999

       docker inspect --format='{{.NetworkSettings.IPAddress}}' 03d6893d32d5  # 查看新容器ip

多端口映射方法

命令格式 :   docker run -d -p [宿主机端口1]:[容器端口1]  -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]

         docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx    # 开起多端口映射实践

七、Dockerfile

Dockerfile类似于学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。dockerfile本质是docker的脚本文件

Dockerfile 使用准则

1、大: 首字母必须大写D,创建一个名为 Dockerfile 的文件(固定写法),文件内进行相应配置

2、空: 尽量将Dockerfile放在空目录中。

3、单: 每个容器尽量只有一个功能。

4、少: 执行的命令越少越好。

 

Dockerfile 基础四指令:

基础镜像信息 从哪来?

维护者信息 我是谁?

镜像操作指令 怎么干?

容器启动时执行指令 嗨!!!

 

Dockerfile 使用命令:

构建镜像命令格式:

docker build -t [镜像名]:[版本号] [Dockerfile所在目录]

构建样例:  docker build -t nginx:v0.2 /opt/dockerfile/nginx/

参数详解:  -t 指定构建后的镜像信息,   /opt/dockerfile/nginx/ 则代表Dockerfile文件存放位置,如果是当前目录,则用 .(点)表示

准备环境

mkdir /home/python/Desktop/docker    # 创建Dockerfile专用目录

cd  /home/python/Desktop/docker

ssh-keygen -t rsa             #创建秘钥认证

cat ~/.ssh/id_rsa.pub > authorized_keys

cp /etc/apt/sources.list ./    # 准备软件源,略过

定制文件

 /home/python/Desktop/docker 目录下创建Dockerfile文件

# 构建一个基于ubuntu的ssh定制镜像

FROM ubuntu   # 基础镜像

MAINTAINER President.Wei 000000@qq.com    # 镜像作者


ADD sources.list /etc/apt/sources.list    # 增加软件源 

# 安装 ssh 服务

RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove

# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys

 
EXPOSE 22    # 对外端口


ENTRYPOINT ["/usr/sbin/sshd","-D"]    # 启动ssh
Dockerfile

构建镜像 :  docker build -t ubuntu-ssh .

效果查看 :  docker run -d -p 10086:22 ubuntu-ssh  # 使用新镜像启动一个容器,查看效果

 

容器检查 

docker ps

docker port c03d146b64d4

ssh查看效果 :  ssh 192.168.8.14

注意: 若出现sign_and_send_pubkey: signing failed: agent refused operation” 报错

执行代码解决:

eval "$(ssh-agent -s)"

ssh-add

 

 

 

Dockerfile 基础指令详解

FROM 

格式:

FROM <image>

FROM <image>:<tag>。

解释:FROM Dockerfile 里的第一条而且只能是除了首行注释之外第一条指令

 

MAINTAINER

格式:MAINTAINER <name>

解释:指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用 -a参数 指定的信息

RUN

格式:

RUN <command> (shell模式)              RUN apt-get install python3

RUN["executable", "param1", "param2"]。 (exec 模式) 

解释:表示当前镜像构建时候运行的命令,exec模式的param是执行命令时的参数

注释:

    shell 模式类似于  /bin/bash -c command   举例: RUN echo hello

   exec  模式类似于 RUN ["/bin/bash", "-c", "command"]    举例: RUN ["echo", "hello"]

EXPOSE

格式:    EXPOSE <port> [<port>...]

解释:     设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。

ENTRYPOINT

格式:

   ENTRYPOINT ["executable", "param1","param2"]  (exec 模式)

   ENTRYPOINT command param1 param2 (shell模式)

解释: 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

Dockerfile 文件编辑指令详解

ADDCOPY相当于数据卷操作VOLUME相当于数据卷容器操作

目录文件编辑指令

ADD

格式:

    ADD <src>... <dest>    ADD 宿主机文件路径 容器文件路径

    ADD ["<src>",... "<dest>"]

解释:将指定的 <src> 文件复制到容器文件系统中的 <dest>  src 指的是宿主机,dest 指的是容器

如果源文件是个压缩文件,则docker会自动解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)

 

COPY

格式:

    COPY <src>... <dest>

    COPY ["<src>",... "<dest>"]

解释:

  单纯复制文件场景,Docker推荐使用COPY  

 

VOLUME

格式:  VOLUME ["/data"]

解释:

   VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点

通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

举例:      VOLUME ["/var/lib/tomcat7/webapps/"]

 

Dockerfile环境设置指令

ENV

格式:

    ENV <key> <value>

    ENV <key>=<value> ...

解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定

 

WORKDIR

格式:  WORKDIR /path/to/workdir (shell 模式)

解释:

    切换目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd

    可以多次切换(相当于cd命令),也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

举例:

    WORKDIR /a

    WORKDIR b

    WORKDIR c

    RUN pwd

    则最终路径为 /a/b/c。

 

Dockerfile构建过程

从基础镜像1运行一个容器A

遇到一条Dockerfile指令,都对容器A做一次修改操作

执行完毕一条命令,提交生成一个新镜像2

再基于新的镜像2运行一个容器B

遇到一条Dockerfile指令,都对容器B做一次修改操作

执行完毕一条命令,提交生成一个新镜像3

构建过程镜像

构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用去启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。

通过docker history <镜像名> 可以查看整个构建过程所产生的镜像 

构建缓存

我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。即:之后的每一次构建镜像时,如果发现之前曾经构建过,那么就直接使用原本的

构建镜像时禁用缓存:docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]

只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了

 

构建历史:

docker history  # 查看构建详细过程

   

清理构建缓存:

docker system prune

docker system prune --volumes  

 

原文地址:https://www.cnblogs.com/hsmwlyl/p/10581903.html