docker的基础知识
docker命令
docker-帮助命令
显示docker版本信息
docker version
显示docker系统信息
docker info
显示docker命令的帮助说明
docker 选项 --help
docker-镜像命令
显示本地镜像
docker images [选项]
选项:
-a 显示所有镜像
-q 仅显示镜像id
显示的列:
REPOSITORY-镜像的仓库源
TAG-镜像的标签
IMAGE ID-镜像id
CREATED-镜像的创建时间
SIZE-镜像的大小
eg:
显示本地镜像
docker images
搜素镜像
docker search xx
eg:
搜索 redis相关的镜像
docker search redis
下载镜像
docker pull 镜像名[:TAG]
eg:
下载最新版本redis(不写tag默认为最新版本:latest)
docker pull redis
下载6.2.14版本redis
docker pull redis:6.2.14
删除镜像
docker rmi 镜像ID
选项:
-f 强制删除镜像
eg:
删除单个镜像
docker rmi 镜像ID
删除多个镜像
docker rmi 镜像A-ID 镜像B-ID
强制删除所有本地镜像
docker rmi -f $(docker images -aq)
展示一个镜像的形成历史
docker history 镜像ID
docker-容器命令
有镜像才可以创建容器,这里拉取了centos:7的镜像,用来举例
新建容器并启动
docker run 选项 镜像
选项:
-e
设置环境变量
eg: -e TEST_USERNAME=alex
--name
为新建的容器指定一个名称
eg: --name test01
-d
后台方式运行容器,并返回容器ID
-p
指定端口映射
格式有三种:
-p ip:宿主机端口:容器端口
-p 宿主机端口:容器端口
-p 容器端口
-P
随机指定端口映射
-it
使用交互模式运行,进入容器查看内容。-i:以交互模式运行容器。-t:为容器重新分配一个伪输入端口
-v 宿主机目录:容器目录
挂载卷
eg: 以后台方式运行容器,映射宿主机与容器的54321端口,添加TEST_NAME环境变量,容器命名为centos-1
docker run -d --name centos-1 -p 54321:54321 -e TEST_NAME=alex centos:7
eg: 使用交互模式运行容器,映射宿主机与容器的54322端口,添加TEST_NAME环境变量,容器命名为centos-2
docker run -it --name centos-2 -p 54322:54322 -e TEST_NAME=alex centos:7
显示当前正在运行中的容器
docker ps 选项
选项:
-a 列出所有容器
-q 只显示容器ID
eg:
显示当前正在运行中的容器ID
docker ps -q
退出容器
exit 停止容器退出
ctrl + P + Q 不停止容器退出
删除容器
docker rm 容器ID
选项:
-f 强制删除容器
eg:
强制删除所有容器
docker rm -f $(docker ps -aq)
启停容器
docker start 容器ID 启动容器
docker restart 容器ID 重启容器
docker stop 容器ID 停止容器
docker kill 容器ID 强制停止容器
docker-常用命令
查看容器日志
docker logs 选项 容器
选项:
-f 跟踪日志输出
--tail number 从日志末尾显示number行
-t 显示时间戳
eg:
持续跟踪日志并显示时间戳,显示名为centos-1的容器的末尾200行日志
docker logs -tf --tail=200 centos
查看容器中的进程信息
docker top 容器
eg:
查看容器id为2c3d1827d24d的进程信息
查看容器或镜像的元数据
docker inspect 容器ID|镜像ID
进入当前正在运行中的容器
方式一:
docker exec -it 容器ID /bin/bash
/bin/bash是shell工具运行地址
进入容器后会开启一个新的终端,可以在里面操作
方式二:
docker attach 容器ID
进入容器中正在运行的终端,不会启动新的终端
容器与宿主机之间的文件拷贝
docker cp 源路径 目的路径
eg:
将名为centos-1容器中的test.txt文件拷贝到宿主机上
docker cp centos-1:/home/test.txt /home/
将宿主机上的test.txt文件拷贝到名为centos-1容器上
docker cp /home/test.txt centos-1:/home/
docker镜像原理
镜像概念
镜像是一种轻量级,独立的可执行软件包,其中包括运行应用程序所需的一切内容:代码、运行时环境、系统工具、系统库、环境变量、设置。
镜像的获取方式有两种:1.从官方镜像仓库下载;2.通过DockerFile文件制作一个镜像。
联合文件系统(UnionFS)
docker镜像实质上是UnionFS
联合文件系统(Union File System):2004年由纽约州立大学开发,它可以把多个目录(也叫分支)的内容联合挂载到同一个目录下,而目录的物理位置是分开的。是一种分层、轻量级且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(VFS)。
联合文件系统是docker镜像的基础。镜像通过分层来进行继承,基于基础镜像,可以制作出各种具体的应用镜像。
联合文件系统的特性是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样文件系统会包含所有底层的文件和目录。
镜像的结构
bootfs
bootfs(boot file system):包含操作系统boot loader(内核引导器) 和kernel(内核)。用户不会修改该文件系统。boot loader主要引导kernel,Linux刚启动的时候会加载bootfs,启动完成后,整个Linux内核加载进内存,之后bootfs会被卸载掉
rootfs
rootfs(root file system):包含典型的目录结构,包括/dev,/proc,/bin,/etc,/lib,/usr,/tmp等,再加上要运行用户应用所需要的所有配置文件,二进制文件和库文件。这个文件系统在不同的Linux发行版中是不同的。Linux系统在启动时,rootfs会被挂载为只读模式,之后在启动完成后修改为读写模式,用户可以对文件进行修改。
镜像的结构
docker镜像实际上是由一层一层的文件系统组成,使用联合文件系统(UnionFS)技术能够将不同层文件系统整合成一个文件系统,隐藏了多层的存在,在用户角度来看,只存在一层文件系统。
最底层是bootfs,使用的是宿主机的bootfs
第二层是rootfs,又称为基础镜像(base image)
再往上是可叠加的其他镜像文件,如java镜像、tomcat镜像
当新建一个容器启动时,docker会在最顶层加载一个可读写的文件系统作为容器,这一层也称为容器层
镜像的分层
当我们使用docker pull下载镜像的时候,可以看到是一层一层下载的
这里通过docker pull命令查看下载tomcat的过程
使用docker inspect命令也可以查看tomcat的分层
镜像采用这种分层的结构,最大的好处是资源共享。比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
提交镜像
提交一个容器成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
eg: 提交修改过的tomcat容器成为一个新的镜像
docker commit -m="add env file" -a="alex" 2c3d1827d24d tomcat01:1.0
相当于把之前容器可写层作为一层可读镜像,生成一个新的镜像
docker数据管理
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
1.当容器不再存在时,数据不会持久存在,并且如果另一个进程需要数据则很难从容器中取出数据。
2.可写容器层与运行容器的宿主机紧密耦合。你不能轻易地将数据转移到其他地方。
3.在可写容器层上写入是需要一个存储驱动管理程序来管理文件系统。存储驱动程序使用Linux内核提供了一个联合文件系统。与使用直接写入宿主机文件系统的数据卷相比,这种额外的抽象降低了性能。
docker为容器提供了两个选项来存储主机上的文件,这样即使在容器停止后文件也能持久化:卷(volume)和绑定挂载(bind mount)。
卷(volume)
卷存储在宿主机文件系统的一部分,由docker管理(Linux环境上存储在/var/lib/docker/volumes/)。非docker进程不应该修改文件系统的这一部分。卷是在docker中持久化数据的最佳方式
挂载卷的相关命令
创建一个卷
docker volume create xx
eg:
创建一个名为test的卷
docker volume create test
查看所有数据卷
docker volume ls
查看卷信息
docker volume inspect xx
eg:
查询一个名为test的卷的信息(Mountpoint字段是数据卷存放数据的路径)
docker volume inspect test
删除数据卷
docker volume rm xx
eg:
删除一个名为test的卷
docker volume rm test
创建容器时挂载数据卷
docker run -it -d --name 容器名称 --mount source=数据卷名称,target=容器中的对应目录 镜像名称
绑定挂载
与卷相比,绑定挂载的功能有限。使用绑定挂载时,将宿主主机上的文件或目录挂载到容器中。文件或目录由其在宿主机上的完整路径引用。该文件或目录不需要在宿主机上已存在。如果不存在会按需创建。绑定挂载速度很快,但他们依赖于主机的文件系统具有特定的可用目录结构。
绑定挂载的相关命令
创建容器时挂载目录(方式一)
docker run -it -d --name 容器名称 --mount type=bind,source=宿主机目录,target=容器中的对应目录 镜像名称
type=bind表示挂载目录
创建容器时挂载目录(方式二)
docker run -it -d --name 容器名称 -v 宿主机目录:容器中的对应目录 镜像名称
匿名挂载
-v 容器内路径
具名挂载
-v 卷名:容器内路径
指定路径挂载
-v 宿主机路径:容器内路径
只读 ro (readonly)
-v 宿主机路径:容器内路径:ro
可读可写 rw (readwrite)
-v 宿主机路径:容器内路径:rw
数据卷容器
数据卷容器是一个容器,其目的是专门提供数据卷给其他容器挂载。
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
挂载数据卷容器的相关命令
前提:创建一个数据卷容器,选择一个共享目录
docker run -it --name 数据卷容器名称 -v 共享目录 镜像名称
挂载数据卷容器
docker run -it --name 容器名称 --volumes-from 数据卷容器名称 镜像名称
Dockerfile
DockerFile是用来构建docker镜像的文件
构建步骤
1.编写一个Dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像
Dockerfile的指令
指令 | 描述 |
---|---|
ADD | 添加本地或远程的文件或目录 |
ARG | 指定构建时的变量 |
CMD | 指定默认命令 |
COPY | 复制文件或目录 |
ENTRYPOINT | 指定默认可执行命令 |
ENV | 设置环境变量 |
EXPOSE | 描述应用程序正在监听哪些端口 |
FROM | 基于一个基本镜像进行构建 |
HEALTHCHECK | 在启动时检查容器的运行状况 |
LABEL | 向镜像添加元数据 |
MAINTAINER | 指定镜像的作者 |
ONBUILD | 指定在构建镜像时使用的指令 |
RUN | 执行构建命令 |
SHELL | 指定shell形式的默认值 |
STOPSIGNAL | 指定退出容器的系统调用信号 |
USER | 设置用户和组ID |
VOLUME | 创建卷挂载 |
WORKDIR | 更改工作目录 |
dockerFile常用指令说明
FROM指令
格式: FROM image:tag
初始化一个新的构建阶段,并为后续指令设置基本镜像。一个有效的Dockerfile必须以FROM指令开始。该镜像可以是任何有效的镜像。
LABEL指令
格式: LAVEL key1=value1 key2=value2 ...
将元数据添加到镜像中。一个标签是一个键值对。要在LABEL的value中包含空格,请像在命令行解析中那样使用引号和反斜杠。
COPY指令
格式: COPY src dest
从src复制新的文件或目录,并将它们添加到路径<dest>的镜像文件系统中。
ADD指令
格式: ADD src dest
从src复制新的文件、目录、远程文件URL,并将它们添加到路径dest的镜像文件系统中。如果src是一个压缩文件,会被解压为一个目录。如果是src是远程文件URL,下载文件后如果是压缩包则不会被解压。
ENV指令
格式: ENV key=value
将环境变量key设置为value。该值将存在与构建阶段所有后续指令的环境中。该值将被解释为其他环境变量,因此如果引号字符没有转义,将被删除。与命令行解析一样,引号和反斜杠可用于在之值中包含空格。
WORKDIR指令
格式: WORKDIR path
为Dockerfile中跟随它的RUN、CMD、ENTRYPOINT、COPY、ADD指令设置工作目录。如果WORKDIR路径不存在,即使在后续的Dockerfile指令中没有使用它,它也会被创建。WORKDIR指令可以在Dockerfile中多次使用,如果提供了一个相对路径,它将是相对与之前WORKDIR指令的路径。WORKDIR指令可以解析以前使用ENV命令设置的环境变量。如果未指定,则默认工作路径为/
USER指令
格式: USER user
设置用户名(或UID),作为当前阶段剩余时间的默认用户。指定用户用于RUN指令,并在运行时运行相关的ENTRYPOINT和CMD命令。
EXPOSE指令
格式: EXPOSE port[/protocol]
通知docker容器在运行时监听指定的网络端口。可以指定端口在TCP还是UDP。如果不指定协议则默认为TCP。EXPOSE指令时间上并不发布端口,其作用是作为构建镜像的人员与运行容器的人员之间的一种文档,说明打算发布哪些端口。要在运行容器时发布端口,请在docker run命令上使用-p选项来发布和映射一个或多个端口。
VOLUME指令
格式: VOLUME path
创建指定名称的挂载点,并将其保存到宿主机或其他容器中。此种方式相当于匿名挂载,相当于docker run -v path。
RUN指令
格式1(shell格式): RUN command param1 param2
格式2(exec格式): RUN ["executable","param1","param2"]
将执行任何命令,在当前镜像之上创建一个新层。添加的层在Dockerfile下一步中使用。其中shell形式是最常用的命令。
CMD指令
格式1(shell格式): CMD command param1 param2
格式2(exec格式): CMD ["executable","param1","param2"]
设置从镜像运行容器时要执行的命令。一个Dockerfile中只能有一个CMD指令。如果你列出了多个CMD命令,则只有最后一个生效。CMD的目的是为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,你还必须指定ENTRYPOINT指令。
ENTRYPOINT指令
格式1(shell格式): ENTRYPOINT command param1 param2
格式2(exec格式): ENTRYPOINT ["executable","param1","param2"]
设置容器运行时要执行的命令。与CMD指令一样,一个Dockerfile中可以有多个ENTRYPOINT,但只有最后一个生效。ENTRYPOINT用于启动父进程,后面跟的参数被当成子进程来启动。
DockerFile示例-使用DockerFile创建一个镜像
1.编写一个DockerFile文件
创建一个Dockerfile文件
vi Dockerfile
Dockerfile文件中添加指令
#以centos7镜像作为基本镜像
FROM centos:7
#添加标签,如果作者信息等等
LABEL author="alex [email protected]"
#复制当前路径下的文件到容器文件系统的路径下
COPY readme.txt /usr/local/
#复制配置文件夹到镜像文件系统的路径下
COPY config /usr/local/
#添加java压缩包到容器文件系统的路径下(压缩包会被解压成文件夹)
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
#设置环境变量MYPATH,用于后续指令的引用
ENV MYPATH=/usr/local
#设置工作目录(引用之前的环境变量)
WORKDIR $MYPATH
#暴露8080端口
EXPOSE 8080
#运行yum命令下载vim工具,用于在容器中能够正常使用vim命令
RUN yum -y install vim
#匿名挂载/usr/local/data路径
VOLUME /usr/local/data
#添加CMD用于启动容器后打印end字符串到标准输出
CMD echo "---end---"
2.通过Dockerfile文件构建镜像
docker build -f Dockerfile文件路径 -t 镜像名:[tag] .
3.测试运行容器
docker run -it 镜像名:[tag]
4.发布镜像
在dockerhub中注册自己的账号,网址为:https://hub-stage.docker.com/
在服务器中登陆账号
docker login -u 用户名
提交镜像
docker push 镜像名:tag
参考资料
https://docs.docker.com/engine/reference/commandline/docker/
https://docs.docker.com/engine/reference/builder/
https://docs.docker.com/engine/
标签:容器,宿主机,文件系统,基础知识,挂载,镜像,docker From: https://www.cnblogs.com/shenStudy/p/18001813