Docker

  • 官网:https://www.docker.com/
  • 文档:https://docs.docker.com/
  • 仓库:https://hub.docker.com/

Docker的组成

  1. 镜像 (images)
  2. 容器(container)
  3. 仓库(registry)

1. 安装Docker

#1.卸载原有的Docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
#2.安装yum-utils软件包
sudo yum install -y yum-utils
#3.设置稳定的存储库
sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
#4.安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io
#5.启动Docker
sudo systemctl start docker
#6.查看版本
docker version
-------------------------------------------
Client: Docker Engine - CommunityVersion:           19.03.8API version:       1.40Go version:        go1.12.17Git commit:        afacb8bBuilt:             Wed Mar 11 01:27:04 2020OS/Arch:           linux/amd64Experimental:      falseServer: Docker Engine - CommunityEngine:Version:          19.03.8API version:      1.40 (minimum version 1.12)Go version:       go1.12.17Git commit:       afacb8bBuilt:            Wed Mar 11 01:25:42 2020OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.2.13GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429runc:Version:          1.0.0-rc10GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dddocker-init:Version:          0.18.0GitCommit:        fec3683#7.测试Docker
sudo docker run hello-world
-------------------------------------------
Hello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/

2. 底层原理

  • Docker Client:也称为Docker客户端。其实就是Docker提供命令行界面工具,是许多Docker用户与Docker进行交互的主要方式。

  • Docker daemon:是服务器组建,以Linux后台服务的方式运行,是Docker最核心的后台进程,我们也把它称为守护进程。它负责响应来自Docker Client的请求,然后将这些请求翻译成系统调用完成容器管理操作。

  • Docker Image:可以看作一个特殊的文件系统,除了提供运容器运行时所需要的程序、库、资源、配置等文件外,还包含了一些为运行时准备的参数(匿名卷,环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将Docker镜像看成只读模版,通过它可以创建Docker容器。

  • Docker registry:是存储docker image的仓库

  • Docker Container:就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。

3. 容器与虚拟机

Docker 的命令

1. 帮助命令

docker version   #版本信息
docker info     #详细信息
docker 命令 --help    #帮助信息

2. 镜像命令

docker images    #查看镜像
--------------------------------#REPOSITORY:镜像名称          #TAG:镜像版本                 #IMAGE ID:镜像ID            #CREATED:镜像创建时间             #SIZE:镜像大小
docker images -a    #显示所有信息
docker images -q    #只显示镜像ID
docker search --help #搜索命令
-----------------------------------
Usage:  docker search [可选参数] TERM
Options:    #可选参数-f, --filter filter   根据提供的条件过滤输出--format string   使用Go模板进行打印搜索--limit int       最大搜索结果数(默认25)--no-trunc        不要截断输出
docker pull --help   #镜像下载
----------------------------------
Usage:  docker pull [可选参数] NAME[:版本号]
Options:-a, --all-tags                下载存储库中所有标记的图像--disable-content-trust   跳过图像验证(默认为true)-q, --quiet                   禁止详细输出
----------------------------------------------
[root@wdd ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql#版本信息
afb6ec6fdc1c: Pull complete #分层下载
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
4eec965ae405: Pull complete
a531a782d709: Pull complete
10e94c02b508: Pull complete
799a94b968ef: Pull complete
Digest: sha256:5c9fd7949bc0f076429fa2c40d0e7406e095bdb5216a923257b31972a6f3ae4f
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7#真实地址
docker rmi --help    #镜像删除
Usage:  docker rmi [可选参数] IMAGE [镜像名。。。]
Options:-f, --force      强制删除镜像--no-prune   不要删除未标记的父级
---------------------------------------------------------
docker rmi -f b84d68d0a7db  #删除镜像
docker rmi -f id1 id2 id3 #批量删除镜像
docker rmi -f $(docker images -aq)  #删除所有镜像

3. 容器命令

docker run --help    #运行镜像
Usage:  docker run [可选参数] IMAGE [命令] [参数]
--name  容器姓名区分
-d      后台运行
-p      指定端口映射
-P      随机端口映射
-it     交互模式运行,进入容器内部
-v      绑定挂载卷
-e      环境配置,运行内存等
#测试
docker pull centos#启动
docker run -it 470671670cac /bin/bash#容器停止并退出
exit#容器不停止退出
ctrl+P+Q#显示容器
docker ps 【参数】
-a  #显示所有容器包括历史容器
-n=?#参数限定
-q  #只显示ID#删除容器
docker rm id    #删除容器,不能删除
docker rm -f $(docker ps -aq)   #删除所有容器
docker ps -a -q|xrags docker rm #删除所有容器#容器启动和停止
docker strat id #启动容器
docker restart id   #重启容器
docker stop id  #停止容器
docker kill id  #强制停止容器

4. 常用命令

#后台运行容器
docker run -d id#docker ps 时容器停止了,后台运行必须有一个前台进程,没有即停止#查看日志
docker logs -t -f --tail 行数 id#容器进程
docker top id#容器元数据
docker inspect id#进入容器
docker exec -it id /bin/bash    #交互模式进入正在运行的容器中,进入后开启新的终端
docker attach id    #进入容器正在执行的终端,没有创建新的进程#拷贝命令
docker cp

Docker镜像原理

1. 镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行

某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

  • 获取镜像:远程仓库+好友分享+自己制作

2. 联合文件系统(UnionFS)

  • Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提

    交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

  • Union文件系统是Docker镜像的基础。

  • 镜像可以通过分层来进行集成,基于基础镜像,可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠

    加起来,这样最终的文件系统会包含所有底层文件和目录。

3. Docker 镜像加载原理

  • docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • bootfs(boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启

    时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样

    的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs

    转交给内核,此时系统也会卸载bootfs。

  • roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标

  • 准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。

  • 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

4. Docker镜像

  • 采用这种分层结构最大的一个好处就是共享资源,比如有多个镜像都从相同的base镜像构建而来,那么宿主

    机只需要在磁盘上保存一份base镜像,

  • 同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

  • docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作 “容器

    层”,“容器层” 之下的都叫镜像层。

5. commit镜像

docker commit [可选参数] 容器id [新镜像名[:版本]]
-a, --author string    作者
-c, --change list      将Dockerfile指令应用于创建的映像
-m, --message string   提交信息
-p, --pause            提交期间暂停容器(默认为true)

容器数据卷

**Docker数据持久化:**容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。

1. 优点:

  1. 绕过“拷贝写”系统,以【达到本地磁盘IO的性能】,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
  2. 绕过“拷贝写”系统,有些文件【不需要在docker commit打包】进镜像文件。
  3. 数据卷可以在【容器间】共享和重用数据
  4. 数据卷可以在【宿主】和【容器】间共享数据
  5. 数据卷数据改变是【直接修改】的
  6. 数据卷是【持续性】的,直到没有器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。

2. 命令挂载 -v

docker run 【-d】【 -v 宿主机目录:容器目录】 【--name 容器名】 【-p 宿主端口:容器端口】 镜像ID
#启动mysql
#查看元数据
docker inspect 970ffe5b3623
-----------------------------------------
"Mounts": [       #挂载{"Type": "bind","Source": "/root/mysql/conf",    #宿主机目录"Destination": "/etc/mysql/conf.d",   #容器目录,Mysql的配置文件"Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "bind","Source": "/root/mysql/logs","Destination": "/logs","Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "bind","Source": "/root/mysql/data","Destination": "/var/lib/mysql","Mode": "","RW": true,"Propagation": "rprivate"}],

3. 具名与匿名挂载

#匿名挂载 -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的卷信息
docker vplume ls
------------------------------
DRIVER              VOLUME NAME
local               9f38292179faal78afcce54d80be99d4ddd68c91d2a68870bcece72d2b7ed061#具名挂载 -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginxdocker volume Is
DRIVER              VOLUME NAME
local               juming-nginxdocker volume inspect juming-nginx
------------------------------------
Mountpoint:“/var/Lib/docker/voLumes/juming-nginx/_data”
#docker容器内没有指定目录时默认在 /var/Lib/docker/voLumes/xxx/_data
-v 容器路径  #匿名挂载
-v 卷名:容器路径   #具名挂载
-v /路径:容器路径  #路径挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx#ro readonly 只读权限-----只能通过宿主机操作,容器内无法操作
#rw readwrite   可读可写权限

4. Dockerfile挂载

vim dockerfile1
FROM centos
VOLUME ["volume1","volume1"]    #匿名挂载
CMD echo "-----end------"
CMD /bin/bash
docker build -f /home/dockerfile1 -t wddcentos:1.0 .#创建镜像

5. 数据卷同步不同容器

父容器:数据卷容器

--volume-from #数据备份,双向拷贝
docker -it --name docker01 970ffe5b3623 #父容器
docker -it --name docker02 --volumes-from docker01 970ffe5b3623 #挂载docker01数据
docker -it --name docker03 --volumes-from docker01 970ffe5b3623 #挂载docker01数据
#docker01 docker02 docker03 挂载卷数据共享,持久化保存,删除某个容器数据仍存在

DockerFile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

  • 创建文件——vim文件——docker build——docker run——docker commit ——docker push

1. dockerfile命令

  • 保留关键字大写

  • 每一个命令为一层

  • #注释

  • DockerFile——Docker镜像——Docker 容器

FROM     #基础容器
MAINTAINER  #作者 姓名+邮箱
RUN     #用于执行后面跟着的命令行命令
ADD     #
WORKDIR #镜像的工作目录
VOLUME  #挂载的目录
EXPOSE  #暴漏端口配置
CMD     #指定这个容据启动的时候要运行的今,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候运行的指今,可追加命令
ONBUILD #用于延迟构建命令的执行,新的镜像使用镜像时,执行命令

Docker-Compose

通过编写docker-compose.yml文件来管理镜像

docker-compose up -d #启动docker-compose
docker-compose down  #关闭docker容器
docker-compose restart #重启docker容器
docker-compose up -d --build  #从新构建docker镜像

docker管理redis

version: '3'
services:redis:restart: alwaysimage: redis:latestcontainer_name: redisports:- 6379:6379volumes:- ./data:/data- ./conf/redis.conf:/usr/local/redis/redis.conf- ./logs:/logscommand:redis-server /usr/local/redis/redis.conf"

docker-compose up -d #启动
docker-compose down #关闭docker容器
docker-compose restart #重启docker容器
docker-compose up -d --build #从新构建docker镜像

docker管理redis

version: '3'
services:redis:restart: alwaysimage: redis:latestcontainer_name: redisports:- 6379:6379volumes:- ./data:/data- ./conf/redis.conf:/usr/local/redis/redis.conf- ./logs:/logscommand:redis-server /usr/local/redis/redis.conf"

Docker学习记录(到docker-compose)相关推荐

  1. docker 学习记录1

    一. 1. Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到 ...

  2. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  3. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  4. Docker学习二:Docker镜像与容器

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  5. Docker学习一:Docker简介与安装

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  6. Docker学习三:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  7. Docker学习笔记2 -- Docker的基本命令和使用

    目录 Docker学习笔记1 Docker帮助命令 Docker镜像命令 Docker容器命令 Docker commit操作 Docker学习笔记1 Docker学习笔记1 – Docker基本原理 ...

  8. b站docker学习记录

    https://www.bilibili.com/video/BV1og4y1q7M4?p=22 一.部署nginx 搜索nginx的镜像 可以在docker hub中搜索,也可以直接使用命令dock ...

  9. Docker学习记录(三):配置 Docker 加速器:使用阿里云镜像仓库

    上两篇文章介绍了Windows环境下通过Docker Toolbox使用Docker,由于国内的网络问题,从Docker的官方镜像仓库获取镜像往往很慢,甚至经常失败,这篇文章介绍如何通过阿里云镜像库获 ...

  10. Docker学习记录-01

    Docker 的基本组成 镜像(image): 好比一个模板,tomcat -> run -> tomcat01 (container) 镜像可以创建多个容器 容器(container): ...

最新文章

  1. oracle如何查询虚拟列,Oracle11g新特性之--虚拟列(VirtualColumn)
  2. yolo loss 将图像标注的真实事坐标转换到anchor坐标
  3. Ubuntu ORTP 编译及安装
  4. [云炬创业学笔记]第一章创业是什么测试13
  5. 【Centos 8】【Centos 7】腾讯云服务器 安装 docker
  6. 【IT笔试面试题整理】位操作
  7. 51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!
  8. AgileConfig-1.5.5 发布 - 支持 JSON 编辑模式
  9. 我的世界基岩版json_我的世界基岩版app_我的世界基岩版app下载_我的世界基岩版安卓版下载-新手游网...
  10. MySQL数据库迁移注意点
  11. matlab定积分上界求解,定积分问题的数值求解及Matlab实现
  12. Java语句详解(图解java语句概念、快速掌握java基础知识点)——Java基础系列
  13. 陈吉平的Oracle职业生涯:兴趣与思考 成败之所系
  14. Hbuilder:实现阴影透明背景特效
  15. RDKit入门教程(1)——RDKit 安装 (Win10)
  16. windows server 2008 关机后安装自动更新,反复启动,不能进入系统
  17. 《敏捷个人》周刊 第13期 (可下载)
  18. 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss
  19. 如何选择和更换阿里云服务器操作系统?
  20. 3月20 Bundle Adjustment光束平差法概述

热门文章

  1. 内网通信软件要如何挑选?
  2. 学习笔记1 三大聚类方法:K-means聚类、层次聚类、DBSCAN聚类
  3. MOS管知识P/N沟道辨别
  4. 完全二叉树的最后一个非终端节点的下标
  5. 如何在G宝盘通过迅雷下载
  6. [CSP-S模拟测试]:模板(ac)(线段树启发式合并)
  7. 图片高清放大效果怎么做?这三种方法分享给你
  8. 23道易忽略的java面试题及答案解析
  9. 计算机视觉图像常用基本算法(阈值化、形态学变化、模糊)
  10. Registry和Harbor镜像仓库实例