docker学习

docker的常用命令

Docker 是什么?

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

 
 
 
x
 
 
 
 
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版本称为dockerdocker-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 installor 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
 

如果它防火墙的状态是这样,那么久关闭成功了

img

如果防火墙关闭了。访问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

image-20201118101055074

查看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镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像〉,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
 

image-20201119093228643

docker镜像加载原理

image-20201119093415325

 
 
 
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等等。
 

image-20201119093804996

 
 
 
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:数据卷的生命周期一直持续到没有容器使用它为止

posted @ 2020-11-19 15:40  不希望有明天  阅读(78)  评论(0编辑  收藏  举报