01.
Docker历史?
摘自《Docker开发指南》
航运的比喻
Docker 的哲学经常用航运集装箱的比喻来解释,这或许能解释Docker 名字的由来。
这个比喻大概是这样的。运输货物时,要用到多种不同的运输工具,可能包括货车、叉车、起重机、火车和轮船。这意味着这些工具必须能够处理大小不一、运输需求各异的货物(例如袋装的咖啡、桶装的有毒化学品、盒装的电子产品、成队的豪华轿车、冷冻羊排)。以往这是一道复杂且成本高昂的工序,需要付出大量人力物力。如图1-3 所示,码头工人在每个中转站手动装卸货物。
联运集装箱的诞生为运输产业带来了一场革命。集装箱的大小有了统一标准,并且设计的出发点是能以最少的人力在不同的运输方式之间搬运。所有的运输机械,无论是叉车和起重机,还是货车、火车和轮船,都为搬运这些集装箱而设计。运输对温度敏感的货物(如食品和药物)时,可以使用具有冷冻及保温功能的集装箱。标准化的好处甚至延伸到其他支撑体系,如集装箱的标签及铅封方式。因此,运输产业只需专注于处理集装箱本身的搬运以及储存的问题,而集装箱内的东西则完全由货物生产商负责。
Docker的目标是把集装箱的标准化流程运用到IT行业中去。近年来,软件系统的多样性激增。在单一机器中运行LAMP4组合的日子已一去不复返。如今典型的系统可能包含JavaScript框架、NoSQL数据库、消息队列、REST API,以及由各种不同编程语言所写的后端。而这个组合的全部或部分都需要能够在各种不同的硬件上运行——从开发者的笔记本电脑,到公司内部的测试集群,再到云端的生产环境。每个环境都存在差异,它们在不一样的硬件上运行着不一样的操作系统和不同版本的程序库。简而言之,我们的问题与当时运输产业遇到的极为相似——我们正不断付出巨大人力,在不同环境之间移动程序。Docker容器简化了移动应用程序的工作,好比联运集装箱简化了货物运输一样。开发者只需专注于程序开发,再也不用担心测试与正式发布时环境及依赖关系的差异所带来的问题。运维部门则只需专心处理与运行容器相关的核心问题,例如分配资源、启动和停止容器,以及在服务器间的迁移工作。
文章图片
总结:
Docker可以理解为一个容器(把应用和应用所需要的依赖打包,再任意环境上都可以复用部署)02.
Docker介绍?
Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为
集装箱化
。使用docker轻松部署应用程序。集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
2、Docker核心概念
核心概念:层、镜像、容器。
1.image(镜像)三者之间的关系:
docker把应用程序以及其依赖,打包在image文件里面,docker容器是通过运行image生成的实例,同一个image文件可以生成多个容器实例。
2.container(容器)
container是一个docker的运行实例,也叫做容器,本身也是一个文件,可以理解容器实例就是通过渲染运行image镜像之后才产生的。值得注意的是生成容器之后,关闭容器不会删除该容器文件,该容器文件之后停止运行了而已。
层可以理解为一些文件的集合,镜像由不同的层构成(只有最上面的层可以写,其他层都是只读的)
文章图片
容器和镜像的关系:
文章图片
总结:
镜像可以理解为java中的类,容器可以理解为java中类的对象。要删除镜像,需要删除使用该镜像实例化的所有容器。仓库:
我们的镜像是要在其它机器上运行,如何进行传输呢?
这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.
谁提供了这样的仓库呢?docker自己提供了,
hub.docker.com
,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库.比较知名的是由网易蜂巢提供的 https://c.163yun.com/hub#/m/home/
3、Docker安装
文章图片
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本:
Docker CE
和Docker EE
。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
本文介绍 Docker CE 的安装使用。
1)检查系统内核版本
Docker采用Linux(内核)技术,所以只能运行在Linux上,官方说
Linux kernel
至少3.8以上(通过uname -r
查看你当前的内核版本)2)移除旧的版本
$ yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
3)安装依赖设置yum仓库
安装依赖:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置仓库:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4)安装:
yum install docker
- 1
新建文件:/etc/docker/daemon.json,然后添加如下json,重启docker即可永久选择国内镜像。{
"registry-mirrors": ["https://registry.docker-cn.com"]}
查看安装版本:
docker version
- 1
文章图片
注:
docker使用yum工具安装,默认的安装位置为5)设置开机启动Docker Daemon进程/var/lib/docker
目录。
systemctl start docker.service
systemctl enable docker.service
systemctl grep docker查看docker进程的状态
4、Docker命令
01.
镜像操作命令?
1)docker images
docker images [options] [REPOSITORY[:TAG]]
:查看本地镜像options是选项,后面是指定镜像的名称.这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像.
# docker images REPOSITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
ubuntu14.102185fd50e2ca13 days ago236.9 MB
…
其中我们可以根据REPOSITORY来判断这个镜像是来自哪个服务器,如果没有 / 则表示官方镜像,类似于username/repos_name表示Github的个人公共库,类似于regsistory.example.com:5000/repos_name则表示的是私服。IMAGE ID列其实是缩写,要显示完整则带上–no-trunc选项2)docker search
在docker index中搜索image
docker search xxx
docker search mysql:5.7.3
docker search -s 100 ubntu # 找出start数超过100的镜像,默认不加-s
文章图片
搜索的范围是官方镜像和所有个人公共镜像。NAME列的 / 后面是仓库的名字。
3)docker pull
docker pull [options] NAME[:TAG]
:通过此命令可以docker远程仓库拉取镜像到本地.name是拉取镜像的名称,:TAG表示是可选的,如果不选表明时latest,如果选择表明是指定版本的.
options是拉去的一些参数.
docker pull xxx # 拉取tag为最新的镜像docker pull centos:centos6 # 拉取tag为centos6的镜像docker pull mysql:5.7.3 # 拉取版本为5.7.3的mysql镜像docker pull seanlook/centos:centos6 # 拉取个人仓库下的镜像,docker pull username/repository<:tag_name>docker pull dl.dockerpool.com:5000/mongo:latest # 如果你没有网络,或者从其他私服获取镜像,形如docker pull registry.domain.com:5000/repos:
下载tag为latest的镜像(以及同一images id的其他tag)。
4)docker push
推送一个image或repository到registry
docker push seanlook/mongo
docker push registry.tp-link.net:5000/mongo:2014-10-27 # registry.tp-link.net也可以写成IP,172.29.88.222。sudo docker push 192.168.0.100:5000/ubuntu # 推送镜像库到私有源[可注册 docker 官方账户,推送到官方自有账户] sudo docker push 192.168.0.100:5000/ubuntu:14.04 # 推送指定镜像到私有源
在repository不存在的情况下,命令行下push上去的会为我们创建为私有库,然而通过浏览器创建的默认为公共库。
5)docker rmi
推送一个image或repository到registry
docker rmi 镜像名字
docker rmi ubuntu:16.04 # 当存在多个名字一样的镜像时,根据tag名删除。
6)docker运行镜像流程
文章图片
docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作.如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来.
docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器.
02.
容器操作?
1)docker create
根据镜像创建一个容器。
docker create 镜像名字 # 返回容器id
文章图片
2)docker start
用于启动一个容器
docker start 容器id
3)docker stop
用于停止容器。
docker stop 容器id # stop也可以改为kill
4)docker ps
docker ps # 查看当前运行的容器docker ps -a # 查看全部的docker容器docker ps -l # 查看最新启动的一个容器
5)docker rm
用于删除容器
docker rm 容器id
文章图片
6)docker restart
用于重启容器。
docker restart 容器id
文章图片
7)docker run
docker run [options] IMAGE[:TAG] [COMMAND] [ARG..]
:根据镜像实例化为容器。说明:如果需要设置开机自启动,需要加上参数:
--restart=always
IMAGE是镜像的名字
COMMAND是运行起来的时候要执行什么命令.
ARG表示这条命令运行需要的参数.
docker run命令首先会从特定的image之上create一层可写的container,然后通过start命令来启动它。
启动mysql容器```bash
docker run -p 3306:3306 --name mymysql --privileged=true -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql# --privileged=true:在docker run中加入 --privileged=true 给容器加上特定权限# --name mysqlserver :指定容器的名字为mysqlserver # -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。# -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。# -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
- 使用image创建container并执行相应命令,然后停止
docker run ubuntu echo "hello world" # hello world# 这是最简单的方式,跟在本地直接执行echo 'hello world' 几乎感觉不出任何区别,而实际上它会从本地ubuntu:latest镜像启动到一个容器,并执行打印命令后退出(docker ps -l可查看)。需要注意的是,默认有一个--rm=true参数,即完成操作后停止容器并从文件系统移除。因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。容器启动后会自动随机生成一个CONTAINER ID,这个ID在后面commit命令后可以变为IMAGE ID
- 使用image创建container并进入交互模式, login shell是/bin/bash
docker run -i -t --name mytest centos:centos6 /bin/bash# 上面的--name参数可以指定启动后的容器名字,如果不指定则docker会帮我们取一个名字。镜像centos:centos6也可以用IMAGE ID (68edf809afe7) 代替),并且会启动一个伪终端,但通过ps或top命令我们却只能看到一两个进程,因为容器的核心是所执行的应用程序,所需要的资源都是应用程序运行所必需的,除此之外,并没有其它的资源,可见Docker对资源的利用率极高。此时使用exit或Ctrl+D退出后,这个容器也就消失了(消失后的容器并没有完全删除?)
- 运行出一个container放到后台运行
docker run -d ubuntu /bin/sh -c "while true;
do echo hello world;
sleep 2;
done"# 它将直接把启动的container挂起放在后台运行(这才叫saas),并且会输出一个CONTAINER ID,通过docker ps可以看到这个容器的信息,可在container外面查看它的输出docker logs ae60c4b64205,也可以通过docker attach ae60c4b64205连接到这个正在运行的终端,此时在Ctrl+C退出container就消失了,按ctrl-p ctrl-q可以退出到宿主机,而保持container仍然在运行另外,如果-d启动但后面的命令执行完就结束了,如/bin/bash、echo test,则container做完该做的时候依然会终止。而且-d不能与--rm同时使用可以通过这种方式来运行memcached、apache等。
8)docker logs
用于查看日志。
docker logs 容器id或者容器名 # 查看该容器的日志
文章图片
9)docker port
用于查看端口映射情况。
docker port 容器ID或容器name
文章图片
10)docker inspect
用于查看docker容器底层信息 docker inspect。
docker inspect [容器ID或容器name]
文章图片
11)docker update
docker update用户设置容器开机自启动。
docker update 容器id
03.
【docker|docker笔记总结】镜像和容器之间操作?
1)docker exec
用于将终端连接到docker容器。
docker exec -it 容器id或者容器名 /bin/bash
2)docker commit
保存更改并生成一个新的image文件。
docker commit -m "mess" 镜像id 镜像名字
推荐阅读
- 2022年4月9日记:Linux服务器开发,Darren,fastdfs架构分析和配置
- SpringBoot|Spring Boot 参考文档(官网对照翻译)
- Java基础|Java程序员的重启人生-3.Java基础碾压
- gitlab|gitlab+Jenkins+harbor+kubernetes的DevOps连通构建
- docker Kubernetes框架解析和安装步骤详解——docker开发教程
- docker持续集成操作详解——docker开发教程
- docker组合compose操作和使用详解——docker开发教程
- docker日志管理介绍和使用——docker开发教程
- docker cloud云服务使用和操作——docker开发教程