docker的基础知识

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 alex@qq.com"

#复制当前路径下的文件到容器文件系统的路径下
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/

posted @ 2024-02-01 18:06  柯南。道尔  阅读(13)  评论(0编辑  收藏  举报