Loading... ## 1. 概念类 ### 1.1 什么是容器 ```bash 容器化平台 一次封装,到处运行 ``` ### 1.2 什么是镜像、容器、仓库 ```bash 镜像:镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件, 它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。 ``` ### 1.3 Docker与LXC有何不同 ```bash LXC为Linux Container的简写,LXC容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。 Docker的底层就是使用了LXC来实现的,在LXC的基础之上,Docker提供了一系列更强的功能。 ``` ### 1.4 Docker的基本使用流程 ```bash 从Dockerfile开始,Dockerfile是镜像的源代码; 创建Dockerfile后,可以构建它以创建容器的镜像。图像只是“源代码”的“编译版本”,即Dockerfile; 获得容器的镜像后,应使用注册表重新分发容器。注册表就像一个git存储库,可以推送和拉取镜像; 接下来,可以使用该镜像来运行容器。在许多方面,正在运行的容器与虚拟机(但没有虚拟机管理程序)非常相似。 ``` ### 1.5 容器工作原理 ```bash Docker是一个CS结构的系统。 Docker daemon守护进程运行在主机上,守护进程从客户端接受命令并管理运行在主机上的容器。 每个容器都在自己的命名空间(namespace)中运行,但使用与所有其他容器完全相同的内核。 发生隔离是因为内核知道分配给进程的命名空间,并且在API调用期间确保进程只能访问其自己的命名空间中的资源。 ``` ### 1.6 Docker常用命令 ```bash docker search 搜索镜像 docker pull 拉取或者更新指定镜像 docker push 将镜像推送至远程仓库 docker rm 删除容器 docker rmi 删除镜像 docker images 列出所有镜像 docker ps 列出所有容器 ``` ### 1.7 DockerFile中常用的指令 ```bash FROM # 基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER # 镜像维护者的姓名混合邮箱地址 RUN # 容器构建时需要运行的命令 EXPOSE # 当前容器对外保留出的端口 WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 ENV # 用来在构建镜像过程中设置环境变量 ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 COPY # 类似ADD,拷贝文件和目录到镜像中! VOLUME # 容器数据卷,用于数据保存和持久化工作 CMD # 指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有后一个生效! ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样 ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发 ``` ### 1.8 DockerFile中的COPY和ADD命令有什么区别 ```bash COPY和ADD的区别时COPY的SRC只能是本地文件,其他用法一致。 那是因为COPY比ADD更直观易懂。 COPY 只是将本地文件拷入容器这么简单,而ADD有一些其它特性功能(诸如,本地归档解压和支持远程网址访问等); 这些特性在指令本身体现并不明显。 因此,有必要使用ADD指令的最好例子是需要在本地自动解压归档文件到容器中的情况,如ADD rootfs.tar.xz ``` ### 1.9 什么是Docker-compose ```bash Docker-compose就是一个编排同时管理多个容器的工具,与它配对使用的是一个docker-compose.yaml文件; docker-compose命令必须在一个包含docker-compose.yaml文件目录下才能使用。 ``` ### 1.10 Docker镜像联合文件系统 ```bash UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统; 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。 Union文件系统是docker镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统; 但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 ``` ```bash # 分层理解:控制版本、记录,比如: 下载安装centos 1层 下载安装Nginx 2层 下载安装jdk 2层 下载pull的时候看到的一层层就是这个。 # 层层的叠加: # 比如下载Tomcat需要用到centos # 再下载mysql也会用到centos,但是这次就不需要再下载centos,直接使用 # 这就是联合文件的概念 # 镜像加载原理中的图就是分层叠加的概念 ``` ### 1.11 一个完整的Docker由哪些部分组成 ```bash DockerClient # 客户端 Docker Daemon # 守护进程 Docker Image # 镜像 DockerContainer # 容器 ``` ### 1.12 Docker Image和Docker Layer有什么不同 ```bash # Image: 一个 Docker Image 是由一系列 Docker 只读层(read-only Layer) 创建出来的。 # Layer: 在 Dockerfile 配置文件中完成的一条配置指令,即表示一个 Docker 层(Layer)。 # 如下 Dockerfile 文件包含 4 条指令,每条指令创建一个层(Layer)。 FROM ubuntu:15.04 COPY . /app RUN make /app CMD python /app/app.py ``` ### 1.13 什么是Docker swarm ```bash 是Docker的本机集群的管理和编号。 Docker可以初始化一个swarm集群,其他节点可以加入。(Manager、Worker) ``` ## 2. 命令类 ### 2.1 容器与主机之间的数据拷贝命令 ```bash # Docker cp命令用于穷奇与主机之间的数据拷贝 # 主机到容器: docker cp /www 96f7f14e99ab:/www/ # 容器到主机: docker cp 96f7f14e99ab:/www /tmp ``` ### 2.2 Dokcer服务的开启 ```bash systemctl start dokcer service docker start ``` ### 2.3 Docker查看日志的命令 ```bash docker logs ``` ### 2.4 如何停止所有运行的容器 ```bash docker kill $(docker ps -q) ``` ### 2.5 如何批量卸载后台停止的容器 ```bash docker rm $(docker ps -a -q) ``` ### 2.6 如何批量清理临时镜像文件 ```bash docker rmi $(docker images -q -f dangling=true) ``` ### 2.7 查看容器container01的详细细信息 ```bash docker inspect container01 ``` ### 2.8 查看容器统计信息命令 ```bash docker stats 容器ID ``` ### 2.9 如何运行一个zabbix时打开一个终端 ```bash docker run -it zabbix /bin/bash ``` ### 2.10 如何临时退出正在交互的容器 ```bash 按住 Ctrl+p+q ``` ## 3. 操作类 ### 3.1 本地的镜像文件存放位置 ```bash 于Docker相关的本地资源存放在/var/lib/docker/目录下; 其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像底层文件 ``` ### 3.2 如何更改Docker的默认存储设置 ```bash # 关闭docker服务 systemctl stop docker.service # 移动数据到新的目录 mv /var/lib/docker /new-path/docker # 修改docker.service文件,使用-g参数指定存储位置 vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --graph /new-path/docker # reload配置文件 systemctl daemon-reload # 重启docker ``` ### 3.3 编写一个简单的DockerFile文件 ### 3.4 进入容器的方法有哪些 ```bash # docker attach 容器名 # docker exec -it 容器ID /bin/bash docker exec -it 784fd3b294d7 /bin/bash ``` ### 3.5 如何控制容器占用系统资源的份额 ```bash 可以使用-c|–cpu-shares[=0]参数来调整同期使用CPU的权重,使用-m|–memory参数来调整容器使用内存的大小。 ``` ### 3.6 如何在生产中监控Docker ```bash # Docker统计数据: 当我们使用容器ID调用docker stats时,我们获得容器的CPU、内存使用情况等。 它类似于Linux中top命令。 # Docker事件: Docker事件是一个命令,用于查看Docker守护进程中整改再进行的活动流。 一些常见的Docker事件是:attach、commit、die、datach、rename、destroy等。 ``` ### 3.7 Docker如何查看镜像支持的环境变量 ```bash docker run IMAGE env ``` ### 3.8 启动Nginx容器端口映射3500,挂载到本地html目录 ```bash docker run -d -p 3500:80 --name mynginx -v /home/nginx:/usr/share/nginx/html nginx ``` ### 3.9 Docker的配置文件位置 ```bash # Ubuntu: /etc/default/dokcer # CentOS: /etd/dsysconfig/docker ``` ### 3.10 查看正在运行的容器和所有容器的命令分别是 ```bash # 正在运行的容器 docker ps # 所有的容器 docker ps -a ``` ### 3.11 Docker的build和commit的区别 ### 3.12 Docker数据持久化 ```bash # Docker实现数据持久化的方式: # (1)Bind mount(绑定挂载): 创建容器时,使用“-v”选项,将本地的目录挂载到容器中。采用这种方式容器的挂载类型为bind! # 特点: Data Volume是目录或文件,不能是没有格式化的磁盘(块设备); 容器可以读写volume中的数据; 随源文件变化而变化; volume数据可以永久保存,即使使用它的容器已经被销毁; # 注意: DockerHost上需要被挂着的源文件或目录,必须是已经存在,否则,当做的一个目录挂着到容器中; 默认挂载到容器内的文件,容器是有读写权限。可以在运行容器是-v后边加“:ro” 限制容器的写入权限; 可以挂载单独的文件到容器内部,使用场景:如果不想对整个目录进行覆盖,而只希望添加某个文件,就可以使用挂载单个文件; # (2)Manager Volume(数据卷管理员) 创建容器时,使用“-v“选项,只指定容器中的目录即可!采用这种方式容器的挂载类型为volume; # 特点: 随着源文件的变化而变化,跟Bind mount效果是一样; 删除容器的操作,默认不会对dockerhost主机上的原文件进行删除; 如果想要在删除容器是将原文件删除,可以在删除容器时添加“-v”选项,(一般情况下不建议使用,因为文件有可能被其他容器就使用); # (3)Volume containe(容器与容器的数据共享) 采用这种方式,即事先创建一个容器,专用于挂载本地的目录,然后创建容器时,使用“--volumes-from”指定挂载本地目录的容器即可 (这种模式是将原本容器中挂载的所有目录都挂载到新创建的容器中)! 这种方式也是提供bind mount模式和manager volume模式! ``` ## 4. 网络类 ### 4.1 Docker的网络模式 ```bash 网络模式 配置 说明 Bridge --net=bridge 默认值,在docker网桥docker0上为容器创建新的网络栈 None --net=none 不配置网络,用户可以稍后进入容器,自行配置 container --net=container:name/I 两个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace Host --net=host 容器和宿主机共享Network namespace Custom --net=custom 使用network相关命令定义网络,创建容器的时候可以指定为自己定义的网络 ``` ### 4.2 Docker容器的跨主机网络通信 ```bash # 跨主机通信的两种解决方案: # overlay网络: 使用这种方法,需要事先创建一个consul服务,将需要跨主机通信的docker host加入到同一个consul集群中,再创建一个overlay类型的自定义网络。 由于其网卡作用于是全局的,所以基于此网卡类型创建的容器就可以正常通信; # macvlan网络: 使用这种方法,首先开启网卡的混杂模式,然后配置虚拟网卡; 这些虚拟网卡拥有独立的mac地址,可以配置IP地址进行通信。 与overlay不同的是,macvlan的作用范围是本地有效。 # 如果使用macvlan网络的方式,需要以下步骤: 首先要保证需要跨主机通信的docker hos是可以正常通信的; 两台docker host创建的虚拟网卡是在同一网段; 然后两台docker host基于虚拟网卡创建macvlan类型的网卡; 通过macvlan网络类型创建的容器即可通信; ``` ## 5. 方案类 ### 5.1 什么类型的应用更适合Docker容器技术 > 对于Docker容器创建无状态性(Stateless)的应用更可取。通过从应用项目中将与状态相关的信息及配置提取掉,我们可以在项目环境外建立不依赖项目环境的Docker容器。这样,我们可以在任意产品中运行同一容器,只需根据产品需要像问&答(QA)一样给其配置环境即可。这帮助我们在不同场景重用相同的Docker映像。另外,使用无状态性(Stateless)容器应用相比有状态性(Stateful)容器应用更具伸缩性,也容易创建。 最后修改:2022 年 04 月 07 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏