docker学习
docker的常用命令
docker的常用命令Docker 是什么?容器与docker容器虚拟化技术docker的安装前提条件操作系统要求卸载旧版安装方法设置存储库安装DOCKER引擎docker可以有多个存储库吗?要安装特定版本的Docker Engine,请在存储库中列出可用版本,然后选择并安装:启动docker通过运行hello-world
映像来验证是否正确安装了Docker Engine 。卸载Docker卸载Docker Engine,CLI和Containerd软件包:主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:安装阿里云镜像使用docker命令查看镜像列表下拉镜像运行images访问tomcat成功查看docker运行的镜像有哪些退出容器启动容器容器重启容器停止强制停止容器删除已停止的容器启动交互式容器查看容器日志查看容器内的进程查看容器内的细节退出以后进入docker容器从容器内拷贝文件到主机上docker镜像commit操作补充总命令集合联合文件系统docker镜像加载原理docker容器数据卷是什么?能干什么?
Docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
容器与docker
xxxxxxxxxx
Docker利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
容器虚拟化技术
xxxxxxxxxx
由于前面虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术: Linux容器〈Linux Containers,缩写为LXC)。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
docker的安装
具体情况请访问docker官网 ---------- docker官网。
前提条件
操作系统要求
要安装Docker Engine,您需要一个CentOS 7的维护版本。不支持或未测试存档版本。
该centos-extras
库必须启用。默认情况下,此存储库是启用的,但是如果已禁用它,则需要重新启用它
overlay2
建议使用存储驱动程序。
卸载旧版
较旧的Docker版本称为docker
或docker-engine
。如果已安装这些程序,请卸载它们以及相关的依赖项。
xxxxxxxxxx
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装方法
设置存储库
安装yum-utils
软件包(提供yum-config-manager
实用程序)并设置稳定的存储库。
xxxxxxxxxx
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装DOCKER引擎
安装最新版本的Docker Engine和容器,或转到下一步以安装特定版本:
xxxxxxxxxx
$ sudo yum install docker-ce docker-ce-cli containerd.io
docker可以有多个存储库吗?
如果启用了多个Docker存储库,则在未在yum install
or yum update
命令中指定版本的情况下进行安装或更新将始终安装可能的最高版本,这可能不适合您的稳定性需求。
要安装特定版本的Docker Engine,请在存储库中列出可用版本,然后选择并安装:
一种。列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序,并被截断:
xxxxxxxxxx
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
返回的列表取决于启用了哪些存储库,并且特定于您的CentOS版本(.el7
在本示例中以后缀表示)。
b。通过其完全合格的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce
)加上版本字符串(第二列),从第一个冒号(:
)一直到第一个连字符,并用连字符(-
)分隔。例如,docker-ce-18.09.1
。
xxxxxxxxxx
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
Docker已安装但尚未启动。docker
创建该组,但没有用户添加到该组。
xxxxxxxxxx
上面安装docker Engine 我安装的时候。它表示我已经安装最新版的了,不用在安装。虽然我运行了上面的命令,但是效果并没有执行。
启动docker
xxxxxxxxxx
$ sudo systemctl start docker
通过运行hello-world
映像来验证是否正确安装了Docker Engine 。
xxxxxxxxxx
$ sudo docker run hello-world
此命令下载测试图像并在容器中运行它。容器运行时,它会打印参考消息并退出。
它会表示没有这个运行镜像然后从仓库拉取。然后运行。
卸载Docker
卸载Docker Engine,CLI和Containerd软件包:
xxxxxxxxxx
$ sudo yum remove docker-ce docker-ce-cli containerd.io
主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
xxxxxxxxxx
$ sudo rm -rf /var/lib/docker
安装阿里云镜像
xxxxxxxxxx
首先我们要有阿里云账号(淘宝,支付宝都可以登录),登录进去我们搜索服务——镜像服务
添加到服务之后选择 我的加速镜像
右边有各种docker的环境的命令。执行一下就行了。
使用docker命令
我们可以使用下面的命令查看docker的信息以及刚才我们是否使用了阿里云加速服务
xxxxxxxxxx
$ docker info
查看镜像列表
xxxxxxxxxx
$ docker image ls
或
$ docker images
下拉镜像
xxxxxxxxxx
$ docker pull tomcat:3.5
这个命令是下拉tomcat的命令,后面的版本号可以不写。默认就是latest(最新的意思)
运行images
启动容器
xxxxxxxxxx
docker run -it -p 8080:8080 tomcat
#注释
-p 主机端口:docker容器端口
-P 随机分配端口
i: 交互
t: 终端
一般而言我们都不会在终端控制台运行。而是在终端后台运行,所以我们一般都不会加t
下面我们演示一个tomcat的示例:
xxxxxxxxxx
systemctl start docker
docker ps
如果是空的话我们就下拉镜像,如果不为空,这步就跳过
xxxxxxxxxx
docker pull tomcat
运行镜像
xxxxxxxxxx
docker run -d -p 8888:8080 tomcat
这是在终端后台运行,返回一个运行的id
然后我们去访问: 虚拟机ip:8888
发现它是 404。下面我们看看它的防火墙是否开启
xxxxxxxxxx
service firewalld status
如果防火墙没有关闭,那我们就把它关闭
xxxxxxxxxx
service firewalld stop
如果它防火墙的状态是这样,那么久关闭成功了
如果防火墙关闭了。访问tomcat还是404 ,那么我们继续执行下面的操作
进入tomcat的目录
xxxxxxxxxx
docker exec -it c110e319cdd1(启动的Tomcat容器的容器id) /bin/bash
如果想要知道tomcat容器的id,执行
xxxxxxxxxx
docker ps
使用命令查看当前文件夹内的所有文件
xxxxxxxxxx
ls -l
进入webapps文件夹下
xxxxxxxxxx
cd webapps
查看webapps文件夹下面的文件
xxxxxxxxxx
ls -l
如果显示total 0, 问题就出现在这里,webapps文件夹下面没有文件
返回上一级
xxxxxxxxxx
cd..
删除webapps文件夹(-r是级联删除,-f是强制删除,不然文件夹是删不掉的)
xxxxxxxxxx
rm -rf webapps
将webapps.dist文件夹下的内容复制到给webapps文件夹
xxxxxxxxxx
mv webapps.dist webapps
访问tomcat成功
xxxxxxxxxx
docker run [OPTIONS]IMAGE [COMMAND][ARG...]
xxxxxxxxxx
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字":为容器指定一个名称;
-d:后台运行容器,并返回容器ID,也即启动守护式容器;-i:以交互模式运行容器,通常与-t同时使用;
-t为容器重新分配一个伪输入终端,通常与-i同时使用;-P:随机端口映射;
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::.containerPort
hostPort:containerPort
containerPort
如下示例:
xxxxxxxxxx
docker run -it tomcat
tomcat可以换成镜像的id
查看docker运行的镜像有哪些
xxxxxxxxxx
docker ps[OPTIONS]
xxxxxxxxxx
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q:静默模式,只显示容器编号。
--no-trunc :不截断输出。
退出容器
xxxxxxxxxx
exit容器停止退出
或
ctrl+P+Q容器不停止退出
启动容器
xxxxxxxxxx
docker start [OPTIONS]
OPTIONS参数可选值: id或名字
容器重启
xxxxxxxxxx
docker restart [OPTIONS]
OPTIONS参数可选值: id或名字
容器停止
xxxxxxxxxx
docker stop [OPTIONS]
停止所有容器
xxxxxxxxxx
docker stop $(docker ps -aq)
强制停止容器
xxxxxxxxxx
docker kill [OPTIONS]
删除已停止的容器
xxxxxxxxxx
docker rm [OPTIONS]删除容器
docker rmi [OPTIONS]删除镜像
如果要删除没有停止的容器那么加上 -f 比如
xxxxxxxxxx
docker rm -f [OPTIONS]
启动交互式容器
xxxxxxxxxx
#使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a进行查看,会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,j正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
查看容器日志
xxxxxxxxxx
docker logs -f -t --tail 容器ID
-t是加入时间戳 -f跟随最新的日志打印
--tail数字显示最后多少条
查看容器内的进程
xxxxxxxxxx
docker top 容器ID
查看容器内的细节
xxxxxxxxxx
docker inspect 容器ID
退出以后进入docker容器
xxxxxxxxxx
docker attach 容器id直接进入容器启动命令的终端,不会启动新的进程
docker exec -t 容器ID ls -l /tmp是在容器中打开新的终端,并且可以启动新的进程
从容器内拷贝文件到主机上
xxxxxxxxxx
docker cp 容器ID:容器内路径 目的主机路径
docker镜像commit操作补充
xxxxxxxxxx
docker commit 提交容器副本使之成为一个新的镜像
dockerscommit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
例如:
xxxxxxxxxx
docker commit -m="xxxx" -a="xxxx" 容器ID lxf/tomcat
总命令集合
xxxxxxxxxx
push Push an image or a repository to the docker registry server #推送指定镜像或者库镜像至docker源服务器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或f强制删除]
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image to a tar archive #保存一个镜像为一个tar包[对应load]
search Search for an image on the Docker Hub#在docker hub中搜索镜像start Start a stopped containers #启动容器
stop Stop a running containers #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Lookup the running processes of a container #查看容器中运行的进程信息
unpause Unpause a paused container #取消暂停容器
version Show the docker version information #查看docker版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
联合文件系统
xxxxxxxxxx
UnionFs(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual
filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像〉,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker镜像加载原理
xxxxxxxxxx
Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含bot加载器和内核。当bootim载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
xxxxxxxxxx
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M? ?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs就行了。由此可见对于不同的linux发行版, bootts基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
docker容器数据卷
是什么?
就是像redis里面的rdb和aof文件
能干什么?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:| 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 特点: 1:数据卷可在容器之间共享或重用数据2:卷中的更改可以直接生效 3:数据卷中的更改不会包含在镜像的更新中 4:数据卷的生命周期一直持续到没有容器使用它为止