面试必问-Docker使用

news/2024/5/17 16:57:41

专栏介绍

本专栏将会对近年高频测试相关面试题做详细解答,结合自己多年工作经验,以及同行大佬指导总结出来的。旨在帮助测试、python方面的同学,顺利通过面试,拿到自己满意的offer。

每篇的题量虽然不多,但完全消化掉也是需要时间的。务必不用着急心切,揠苗助长,只有多多练习,反复温习,掌握理解清楚了,才不会遗忘,这样才能应对各种情况的面试。

让我们一起卷起来吧!

全部文章请访问专栏:《大厂测试高频面试题详解》

再推荐一下最近热更的:《Python全栈教程(0基础)》 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!


文章目录

    • 专栏介绍
    • Docker 使用
    • 安装Docker
      • mac下安装
      • Linux下安装
      • Windows下安装
    • Docker 概念
    • Docker 常用命令
      • 启动docker
      • 镜像操作
        • 查找镜像
        • 获得镜像
        • 运行镜像(启动容器)
        • 列出镜像
        • 镜像体积
        • 虚悬镜像
        • 删除本地镜像
        • 保存镜像(慎用)
        • Dockerfile
      • 容器操作
        • 启停容器
        • 查看容器的具体信息
        • 查看容器运行状态
        • 进入容器
        • 复制文件
        • 导入/导出容器快照
        • 删除容器
    • 数据卷操作
        • 创建数据卷
        • 查看数据卷
        • 挂载数据卷
        • 删除数据卷
    • 网络
        • 指定端口运行容器
        • 查看端口映射
    • 其他
    • 实际案例


Docker 使用

安装Docker

mac下安装

brew cask install docker

启动docker:进入launchpad,双击docker图标即可启动

Linux下安装

https://yeasy.gitbooks.io/docker_practice/install/centos.html (CentOS)

https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html (Ubuntu)

Windows下安装

https://yeasy.gitbooks.io/docker_practice/install/windows.html

Docker 概念

镜像:一个特殊的文件系统,提供容器运行所需的程序、库、资源等。可以把它看作一个类。

容器:容器的实质是进程,每个进程最好占用一个容器,比如 jenkins,wiki,jira,gitlab单独放在不同容器中。可以把它看作是镜像的一个实例。

仓库:相当于git的远程仓库,有公开的,也有私有的,表现形式是 <仓库名>:<标签>,每个标签即为一个远程镜像。

网络:Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。有多种网络模式。

数据管理:分为数据卷volume)和挂载主机两种方式

  1. 数据卷,是一个可供一个或多个容器使用的特殊目录,通过docker volume create vol_name 创建数据卷
  2. 挂载主机,是挂载一个主机目录作为数据卷,docker容器启动时,通过 --mount 参数去实现

Docker 常用命令

启动docker

安装docker的时候已经提到如何启动docker

镜像操作

查找镜像

docker search <镜像名> 再官方仓库查找镜像

获得镜像

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

举例:

# docker方式获取jenkins
docker pull jenkins/jenkins:lts

运行镜像(启动容器)

docker run [选项] IMAGE [命令][参数..]

举例:

# 启动jenkins
docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts# -d :--detach 后台运行容器
# -v :--volume 绑定挂载目录
# -p : 绑定端口,主机端口:容器端口 8080是web端口,50000是从属服务器使用端口

列出镜像

docker image ls 列出全部镜像

docker image ls <镜像名> 列出部分镜像

# 列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
b3log/solo          latest              deba8aac9495        4 days ago          150MB

镜像体积

docker system df

虚悬镜像

仓库名标签都为 <none>的镜像

docker image ls -f dangling=true 查看虚悬镜像

docker image prune 删除虚悬镜像

删除本地镜像

docker image rm [选项] <镜像1> [<镜像2> ...] 删除本地镜像

docker image rm $(docker image ls -q image_name) 成批删除镜像,用在某个镜像可能有不同tag,但想全部删除的情况

保存镜像(慎用)

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

Dockerfile

作用:定制镜像

构建镜像:docker build [上下文路径/URL/-],(docker build -t <镜像名> -f <DOckerfile路径> . 是常用命令)

Dockerfile 常用指令:

FROM <镜像名> 指定基础镜像

RUN <命令> 执行命令

# 举个例子
# stretch 是空白镜像
FROM debian:stretch# RUN最多是42层,所以不要滥用RUN,一个RUN一般是一个步骤,比如下方的编译、安装 redis 可执行文件可以放在一个步骤里执行,用 && 可以串联命令
RUN buildDeps='gcc libc6-dev make wget' \&& apt-get update \&& apt-get install -y $buildDeps \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& mkdir -p /usr/src/redis \&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \&& make -C /usr/src/redis \&& make -C /usr/src/redis install \&& rm -rf /var/lib/apt/lists/* \&& rm redis.tar.gz \&& rm -r /usr/src/redis \&& apt-get purge -y --auto-remove $buildDeps

COPY [--chown=<user>:<group>] <源路径>... <目标路径> 复制文件

  • 源路径可以有多个,甚至可以用通配符
  • 源路径是相对路径
  • 目标路径可以是绝对路径,也可以是相对于工作目录的相对路径

ADD [--chown=<user>:<group>] <源路径>... <目标路径> 比COPY更高级的复制文件

  • 源路径可以是URL、压缩文件(会自动解压到目标路径)

CMD 容器启动命令

  • shell 格式: CMD <命令>
  • exec 格式: CMD ["可执行文件", "参数1", "参数2"...]
  • 参数列表格式:CMD ["参数1", "参数2"...]。指定ENTRYPOINT指令后,用CMD指定具体参数
  • 注意:CMD 的命令不能是后台运行的命令!例如,不能是 CMD service nginx start
  • 注意:CMD 推荐使用exec格式编写
  • 注意:一个Dockerfile只能有一个CMD指令

ENTRYPOINT 入口点

详细参考:https://yeasy.gitbooks.io/docker_practice/image/dockerfile/entrypoint.html

  • ENTRYPOINT "CMD"ENTRYPOINT ["可执行文件", "参数1", "参数2"...]

  • 注意:一个Dockerfile只能有一个ENTRYPOINT指令

  • 应用场景:

    • 运行docker容器(docker run)时,可以把镜像当命令一样使用
    • 应用在运行前的准备工作

ENV 设置环境变量

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>...

使用环境变量 $<key>

ARG 构建参数

  • 格式:ARG <参数名>[=<默认值>]
  • 作用也是设置环境变量,但是在容器运行时不会存在这些环境变量

VOLUME 定义匿名数据卷

  • VOLUME ["<路径1>", "<路径2>"...]
  • VOLUME <路径>

EXPOSE 声明端口

  • EXPOSE <端口1> [<端口2>...] 只是声明打算使用什么端口,但实际不会自动在宿主进行端口映射

WORKDIR 指定工作目录

  • 用法:WORKDIR <工作目录路径>

USER 指定当前用户

  • USER <用户名> [:<用户组>]
  • 用户必须是事先简历好的,否则无法切换
  • 不要用susudo,应该用gosu

HEALTHCHECK 健康检查

  • HEALTHCHECK [选项] CMD <命令> 设置检查容器健康状况的命令
  • HEALTHCHECK NONE 如果基础镜像有健康检查指令,使用这个命令屏蔽掉健康检查指令
  • 注意:一个Dockerfile只能有一个HEALTHCHECK指令
  • 参数可选
    • --interval=<间隔>:两次健康检查的间隔,默认为30秒;
    • --timeout=<时长>: 健康检查命令运行超时时间,运行超时则本次健康检查视为失败
    • --retries=<次数>:健康检查次数,默认为3次

容器操作

启停容器

docker run -d 后台启动容器

docker container start <容器名/ID> 启动一个已终止的容器

docker container stop <容器名/ID> 停止一个正运行的容器

docker container restart <容器名/ID> 重启一个正运行的容器

查看容器的具体信息

docker inspect <容器名> 查看容器的具体信息

查看容器运行状态

docker container ls 查看正运行的容器运行状态

docker ps 列出正在运行的容器

docker container ls -a 查看所有的容器的运行状态

docker ps -a 列出所有容器

docker logs -f 容器名称 查看容器应用程序运行日志

进入容器

docker attach <容器名/ID> 进入容器,但退出容器时,会导致容器停止(不建议用这种方式)

docker exec -it <容器名/ID> /bin/sh 进入容器,退出容器时,不会导致容器停止(推荐)

复制文件

docker cp 主机源文件路径 <容器名>:容器目的文件路径 往容器里导入文件

docker cp <容器名>:容器的源文件路径 主机目的文件路径 把文件从容器里导出

导入/导出容器快照

docker export <容器名/ID> > <xxx.tar> 导出容器快照

cat xxx.tar | docker import - <镜像:tag> 从快照文件中再导入为镜像

删除容器

docker container rm <终止的容器> 删除终止状态的容器

docker container rm -f <运行的容器> 删除运行状态的容器

docker container prune 删除所有处于终止状态的容器

数据卷操作

创建数据卷

docker volume create <数据卷名>

查看数据卷

docker volume ls

挂载数据卷

docker run -d -P \--name web \# -v my-vol:/webapp \--mount source=my-vol, target=/webapp \training/webapp \python app.py

删除数据卷

docker volume rm my-vol

docker volume prune 删除无主的数据卷

网络

指定端口运行容器

docker run --name 镜像 \-p 8090:8080 \  # 宿主机端口8090,容器端口8080

查看端口映射

docker port <容器名>

其他

docker-compose :负责快速部署分布式应用

https://yeasy.gitbooks.io/docker_practice/compose/

docker machine:快速安装 Docker 环境

https://yeasy.gitbooks.io/docker_practice/machine/

实际案例

利用solo搭建属于自己的博客网站

solo github:https://github.com/b3log/solo

环境:linux CentOS7

step1

安装 docker ,移步本文开头安装 docker

step2

手动创建数据库(mysql)

我是用宝塔Linux面板创建的,十分方便,创建数据库非常简单,大家也可以用其他方式创建,比如用sql创建

mysql> create database solo;

step3

docker拉取solo镜像

docker pull b3log/solo

step4

在终端执行以下命令

# qa.tencentgg.cn 端口号9090
docker run --detach --name solo --network=host \--env RUNTIME_DB="MYSQL" \--env JDBC_USERNAME="user" \--env JDBC_PASSWORD="password" \--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \b3log/solo --listen_port=9090 --server_scheme=http --server_host=qa.tencentgg.cn

注意的点:

--name : 容器名(随意填,默认solo也行)

--env:配置环境变量

  • JDBC_USERNAME 填你创建数据库的用户名

  • JDBC_PASSWORD 填你创建数据库的密码

--network=host:网络采用和主机互通的网络

最后一行是 solo 启动命令,具体参数可以查看 solo/src/main/java/org/b3log/solo/Starter.java

注意的是:

--server_host 配置你浏览器访问该网站的域名,假如你用域名访问,就配置域名;假如你用IP访问,就配置IP

step5

nginx配置

首先确保你的域名是可解析的!我的服务器是腾讯云的服务器,域名也是腾讯云买的,腾讯云有专门的域名解析服务

upstream backend {server localhost:9090; # Solo 监听端口
}server {listen       80;server_name  qa.tencentgg.cn; # 博客域名access_log off;location / {proxy_pass http://backend$request_uri;proxy_set_header  Host $host:$server_port;proxy_set_header  X-Real-IP  $remote_addr;client_max_body_size  10m;}
}

nginx 配置检测

nginx -t 假如显示 syntax is ok 及 test is successful,说明nginx配置没问题

nginx 重启

nginx -s reload 重启nginx

step6

浏览器地址栏访问:http://qa.tencentgg.cn


http://www.mrgr.cn/p/11427248

相关文章

数据安全

数据的备份与恢复 1. 数据备份技术 任何数据在长期使用过程中&#xff0c;都存在一定的安全隐患。由于认为操作失误或系统故障&#xff0c;例如认为错误、程序出错、计算机失效、灾难和偷窃&#xff0c;经常造成数据丢失&#xff0c;给个人和企业造成灾难性的影响。在这种情况…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

TypeScript -- 函数

文章目录 TypeScript -- 函数JS -- 函数的两种表现形式函数声明函数的表达式es6 箭头函数 TS -- 定义一个函数TS -- 函数声明使用接口(定义)ts 定义参数可选参数写法 -- ?的使用TS函数 -- 设置剩余参数函数重载 TypeScript – 函数 JS – 函数的两种表现形式 我们熟知js有两…

python字典:怎么取出key对应的值

目录 python中的字典是什么 怎么判断key是否在字典中 怎么取出key对应的值 总结 python中的字典是什么 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序且可变的数据类型&#xff0c;用于存储键-值&#xff08;Key-Value&#xff09;对。字典通过…

基于传统检测算法hog+svm实现图像多分类

直接上效果图&#xff1a; 代码仓库和视频演示b站视频005期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在datasets文件夹下 运行01train.py即可训练 训练结束后会保存模型在本地 运行02pyqt.py会有一个可视化…

Element Drawer 抽屉改变默认宽度和高度

Drawer 抽屉 默认宽度为30%&#xff0c;想要改变宽度只需要使用 :size"你需要设置的值" <el-drawer title"我是标题" :visible.sync"drawer" :size"你需要设置的值"><span>我来啦!</span> </el-drawer> dat…

nginx实战

1.nginx简介 1.1 什么是nginx Nginx 是高性能的 HTTP 和反向代理的web服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发…

Windows11+Opencv+Clion编译源码

Windows11OpencvClion编译源码 参考&#xff1a;https://www.robotsfan.com/posts/69395e08.html 注意事项 编译过程中使用的软件&#xff0c;开源码等所有工具的安装路径一定不要有中文和空格。cmake过程会下载一些文件&#xff0c;如果是局域网的话可能下载不下来&#xf…

【网络】应用层——HTTP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; &#x1f3c0;认识HTTP协议 上篇文章中&#xff0c;本喵带着大家对HTTP有了一个初步的认识&#xff0…

2023最新ChatGPT商业运营版网站源码+支持ChatGPT4.0+GPT联网+支持ai绘画(Midjourney)+支持Mind思维导图生成

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 支持GPT3模型、GPT4模型Midjourney专业绘画&#xff08;全自定义调参&#xff09;、Midjourney以图生图、Dall-E2绘画Mind思维导图生成应用工作台&#xff08;Prompt&#xff09;AI绘画广场自定…

27 用linprog、fmincon求 解线性规划问题(matlab程序)

1.简述 ① linprog函数&#xff1a; 求解线性规划问题&#xff0c;求目标函数的最小值&#xff0c; [x,y] linprog(c,A,b,Aeq,beq,lb,ub) 求最大值时&#xff0c;c加上负号&#xff1a;-c ② intlinprog函数&#xff1a; 求解混合整数线性规划问题&#xff0c; [x,y] intl…

Vue3 Radio单选切换展示不同内容

Vue3 Radio单选框切换展示不同内容 环境&#xff1a;vue3tsviteelement plus 技巧&#xff1a;v-if&#xff0c;v-show的使用 实现功能&#xff1a;点击单选框展示不同的输入框 效果实现前的代码&#xff1a; <template><div class"home"><el-row …

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试&#xff1a; 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…

Sentinel Dashboard集成Nacos

1.前言 当项目上Sentinel Dashboard做流量监控的时候&#xff0c;我们可以通过Sentinel控制台修改限流配置&#xff0c;但当我们使用Nacos作为配置中心动态配置流控规则的时候&#xff0c;问题就来了。 首先我们要明白&#xff0c;Sentinel Dashboard的配置是从机器的内存中加…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

推荐用于学习RN原生模块开发的开源库—react-native-ble-manager

如题RN的原生模块/Native Modules的开发是一项很重要的技能&#xff0c;但RN官网的示例又比较简单&#xff0c;然后最近我接触与使用、还有阅读了react-native-ble-manager的部份源码&#xff0c;发现里边完全包含了一个Native Modules所涉及的知识点/技术点&#xff0c;故特推…

web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

工程师是怎样对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师&#xff0c;亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践&#xff0c;也看到了很多 Bad Cases&#xff0c;所以想把自己的一些心得体会写在这里&#xff0c;供工程师进行…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…

无涯教程-jQuery - jQuery.post( url, data, callback, type)方法函数

jQuery.post(url&#xff0c;[data]&#xff0c;[callback]&#xff0c;[type])方法使用POST HTTP请求从服务器加载页面。 该方法返回XMLHttpRequest对象。 jQuery.post( url, [data], [callback], [type] ) - 语法 $.post( url, [data], [callback], [type] ) 这是此方法使…