技术分享 | 掌握高频 Docker 命令,夯实内功基础

news2024/12/26 11:16:03

本文为霍格沃兹测试学院学院学员 Docker 实战课程学习笔记,供各位同学参考。

在 Dokcer 横空出世之前,应用打包一直是大部分研发团队的痛点。在工作中,面对多种服务,多个服务器,以及多种环境,如果还继续用传统的方式打包部署,会浪费大量时间精力。

 Docker 和虚拟机

在 Docker 出现后,它以更高效的利用系统资源、更高效的利用系统资源、一致的运行环境、持续交付和部署、更轻松的迁移、更轻松的维护和拓展,6 大优点迅速火了起来。

Docker 的基础命令,堪称 Docker 的内功,只有把内功修炼好了,我们在 Docker 的学习路上才会更加顺畅,不会导致“走火入魔”。

接下来我将从与虚拟机的对比开始,以实战的方式,带大家更加了解,更会“玩” Docker。

-- 左边为虚拟机,右边为docker环境 --

Server:物理机服务器
Host OS:构建的操作系统
Hypervisor:一种虚拟机软件,装了之后才能虚拟化操作系统
Guest OS:虚拟化的操作系统
Bins/Libs:执行命令、工具
App A:构建的软件
Docker Engine:跳过虚拟化内核的步骤,直接使用宿主机内核

从图片中我们可以清楚的了解到,相比于 Docker,虚拟机更加的臃肿。

虚拟机和容器都需要物理机以及操作系统,但是虚拟机有 Hypervisor 层以及 Guest OS 层。但是 Docker 是没有这两个部分的,只有一层 Docker Engine。

并且每个容器都和宿主机共享计算机的硬件资源以及操作系统。那么由Hypervisor带来的资源耗损,在容器这边是不存在的。所以Docker与虚拟机对比,是有很强大的优势的,当然,也会有一定的缺点。
 

优势(省去了虚拟化内核的步骤)

1. 节省资源(CPU、内存)

2. 秒级启动

3. 轻量级方案(同样一台服务器可以启动几百个docker,但是不能启动几百个虚拟机)


劣势

1. 隔离性、安全性相比虚拟机更弱(比如,如果其中一个容器将内核给"搞坏了",那所有的容器就都无法正常工作了) 

2. 某些情况下服务器会挑内核(eg.编译c++)

Docker 加速器配置

Docker 的作用

而对于测试人员,Docker又为我们带来了什么样的便利呢?

1. 搭建测试环境

2. 搭建各类基础服务

3. 搭建测试执行环境(自动化测试脚本执行环境)

加速器配置

在刚开始的时候,由于网络的原因,我们在下载的镜像的时候,常常速度是非常慢的。所以如果下载镜像很慢的同学,可以尝试配置国内的加速器加速镜像下载

1. 登录阿里开发者平台:
https://dev.aliyun.com/search.html


2. 点击“创建我的容器镜像”


3. 注册/登录后,进入Docker 镜像仓库,选中加速器 Tab
 https://cr.console.aliyun.com/#/imageList


4. 根据个人需要, 选择运行Docker 的OS,按照要求修改Docker配置文件。

步骤如下:

修改配置文件 :

vim usr/lib/systemd/system/docker.service

添加红色部分到

"ExecStart" ExecStart=/usr/bin/dockerd --registry-mirror=<your accelerate address>

保存文件

#重新加载配制:$
systemctl daemon-reload
#重新启动服务:
service docker restart

Docker 实战

好记性不如烂键盘,单单只背下来Docker的命令是不够的,还要自己多敲多去练习,才能更熟练、更深刻的掌握Docker。

用Docker搭建Jenkins服务

大家一起勤动小手,通过搭建一个Jenkins环境,去熟悉docker命令哦
(一定要仔细阅读官方镜像的文档)

下载镜像

docker pull jenkins/jenkins


查看已下载的镜像

docker images

我们可以看到刚刚下载的Jenkins镜像


那么,其中的每个字段又是什么意思呢?

字段名含义
REPOSITORYREPOSITORY
TAG镜像的版本号,用来指定下载的版本
IMAGE ID镜像的唯一标识ID
CREATED镜像的制作时间
SIZE镜像的所占的磁盘空间

删除镜像

docker rmi jenkins/IMAGE ID

我们可以看到,Jenkins镜像已经被成功删除了

下载指定版本的镜像

docker pull jenkins:3.1.x

此时我们可以发现,镜像的TAG不再是latest而是我们所指定的版本号

将镜像打包成一个tar包

docker save jenkins:2.60.3 > myjenkins.tar

将打包的镜像加载出来

docker load < myjenkins.tar

给镜像加tag号

docker tag jenkins:latest jenkins:3.6.0

打了tag之后,会发现多了一个3.6.0 tag版本的镜像,但是image ID和原本的保持一致


然后我们删掉这个镜像,发现提示untagged,且这个镜像被成功删除

给镜像改名称

docker tag jenkins:latest testjenkins

然后我们就可以看到,多了一个叫做testjenkins的镜像,但是image ID和原本的保持一致

push镜像到镜像仓库

docker tag jenkins gaofei_com/jenkins
docker push

容器相关命令及使用

容器运行命令参数

1. --name 指定容器名称
2. -d 后台运行
3. -port 指定端口映射规则
4. --network 指定容器运行的网路模式
5. -v 指定需要挂载的数据卷
6. -env  指定需要传递给容器的环境变量

容器管理命令参数

1. docker run --name={your_name} --d {image_name}  (运行容器)
2. docker ps -s -a  {查看当前所有容器}
3. docker stop {container_name}  (停止容器)
4. docker kill (container_name) {杀死容器}
5. docker rm -f {container_name/id}  (删除容器)
6. docker ps -s (-s表明size)

接下来我们继续使用Jenkins进行一个实战的演练

#启动运行容器
docker run -d --name=myjenkins jenkins/jenkins
#查看当前运行中的容器
docker ps

docker ps也是我们常用的一个命令,下面是docker ps后显示的启动容器信息,其中每个字段都有自己的含义

字段名含义
CONTAINER ID容器ID(和image ID无关)
IMAGE启动容器的镜像
COMMAND容器的启动命令
CREATED创建时间
STATUS当前状态
PORTS容器对外暴露的端口号
NAMES容器名称

CONTAINER ID:容器ID(和image ID无关)

如何删除这个启动的容器呢?是否可以和镜像一样,直接rm呢?

docker rm myjenkins

从图中我们可以看到,如果直接删除运行中的容器会报错,需要先stop然后删除

docker stop myjenkins
docker rm myjenkins

或者直接

docker rm -f myjenkins

我们从图片中可以看出,虽然这个容器是启动的状态,但是使用docker rm -f依然可以直接删除

在docker ps 的时候我们可以看到,PORTS字段下面显示了两个端口号,这两个端口号是做什么的呢?
其实呀,这两个端口号,是容器故意对外暴露的端口号,我们可以通过端口映射的方式,使容器内部的端口号与宿主机的某个端口号产生链接。这样我们就可以通过端口号,去访问或者操作容器啦

如何指定端口号呢?就是使用 -p 参数

docker run -d --name=myjenkins -p 8080:8080 jenkins/jenkins

将宿主机的8080端口指向容器的8080端口,这样我们在宿主机的8080端口就可以访问到Jenkins啦

在启动的过程中,我们可能会碰到各种各样的问题,我们如何定位问题呢?
当然是使用查看log大法

docker log -f myjenkins

Docker的数据持久化

学到这里,可能有同学会有疑虑啦,如果docker挂掉,在docker内产生的数据应该怎么办呢,这些数据应该如何保存呢
接下来,我们要了解的,docker是如何进行数据持久化的呢?
当我们启动容器时,添加了数据挂载的参数-v 宿主机_path:container_path,docker就可以通过数据挂载的方式,使容器和宿主机的数据进行同步保存,

接下来我们通过实战的方式,就可以看到docker是如何实现这一功能的

  1. 启动Jenkins,要增加-v挂载卷参数

docker run --name myjenkins -itd -p 8001:8080 -v /home/gaofei/test/jenkins_home:/var/jenkins_home

注意:挂载权限:sudo chown -R 1000:1000 /home/docker/jenkins
2. 使用docker exec -it myjenkins bash进入刚启动的jenkins容器,并cat /var/jenkins_home/secrets/initialAdminPassword这一步是为了找到jenkins的启动密码



3.输入密码,进入Jenkins页面创建一个job。

4.删掉容器,重新执行之前的命令,重启Jenkins,进入页面,发现job没有因为容器被删而丢失
 

注意:如果容器无法成功启动,且log提示权限问题,则在启动命令中添加-u 0

Docker 容器交互

docker exec -it {容器名称} bash
进入容器,exec的意思是在容器中运行一个命令。如果使用bash 并且指定了-it 就会打开容器的shell 交互

docker exec myjenkins echo "test"
docker exec myjenkins ping www.baidu.com
docker exec -it myjenkins bash

docker cp {container:name}:{container_path} {host_path}把宿主机上的一个文件copy到容器中

docker cp 1.sh myjenkins:/var/jenkins_home

Docker的环境变量

有一些容器启动时,我们需要给他添加一些初始的参数,比如mysql,我们需要给他添加一些初始的账号和密码,docker如何操作这种情况呢?让我们动动小手,演练一下吧

1. 启动mysql容器,注意要加-e传递参数

docker run --name some-mysql -v /home/gaofei/test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1qaz9ol. -p 8888:3306  -d mysql:5.5

2. 通过数据库连接工具连接数据库
host要填写宿主机的ip地址,Password是我们一开始设定的
端口号填写映射的宿主机的端口号

3. 在数据库中创建一个表

4. 删掉容器,然后重启
5. 进入刚刚创建的容器内的mysql路径下,发现有刚刚添加的表,这个就是容器的数据持久化的功能啦

我们接下来再思考一个问题,因为容器是有隔离性的。
如果容器之间互相链接可以用什么方式?

这里就要引入另外一个参数啦 --link,这个参数的作用就是把一台容器的网络信息,注入到另外一台容器中

老方法,我们还是通过testlink实战,体验一下这个功能吧

  1. 启动mariadb

docker run -d --name mariadb -e ALLOW_EMPTY_PASSWORD=yes -e MARIADB_USER=bn_testlink -e MARIADB_DATABASE=bitnami_testlink -v /home/gaofei/test/mysql:/var/lib/mysql -p 8088:3306 bitnami/mariadb:latest
  1. 启动tesklink,mariadb的信息注入到testlink容器中

docker run -d --name testlink -p 8099:80 -p 444:443 -e ALLOW_EMPTY_PASSWORD=yes -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --link mariadb bitnami/testlink:latest
  1. 查看日志,可以看到成功连接到mariadb

docker logs -f testlink

一个思考题,如果是三个容器需要连接呢,使用什么样的方式?
答案是:--env因为在docker中,--link就是通过环境变量的方式配置的。

Docker 前后端启动

现在很多网站的架构都是前后端分离,在这种情况下,我们应该如何使用docker分别启动前端和后端,且能互相通信呢?我们可以使用下面的命令

docker run --name=conan -itd -p 8999:4200 conan
docker run --name=holmes -itd --net=container:conan holmes

--net=container:conan:这样创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

其他命令

查看docker 的信息

docker info

获取容器/镜像的元数据

docker inspect myjenkins

以上,我们通过实战的方式了解了docker的概念,熟悉了docker的一部分基础命令,看完文章后,就要熟悉练习了哦。下一次,将带大家通过3个实战练习selenium、prometheus+grafana、mysql的监控,带大家了解docker的招式法门,学会之后,我们就可以真正的带入工作,进行实战了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的头条四面:测试工程师调岗测试开发工程师,发生了什么?

早就听说头条是算法大厂手撕代码恐怖如斯&#xff0c;进入玻璃房之前做好了心理准备&#xff0c;本次头条面试总共是四面&#xff0c;一二三技术面HR面&#xff0c;总体感觉也还不错&#xff0c;面试的是测试工程师&#xff0c;最后拿到的offer却是测试开发工程师&#xff0c;从…

Mysql主从同步时Slave_SQL_Running状态为Yes , 但是Slave_IO_Running状态为Connecting以及NO的情况故障排除

1. 环境说明 主机IP : 192.168.154.146 从机1IP : 192.168.154.147 从机2IP : 192.168.154.148 2.故障记录 当使用Navicat工具打开这三个数据库时 , 发现主库和从库的数据不同 3.排查过程-(Slave_IO_Running状态为Connecting) 3.1 网络是否互通 互ping三台机器 , 看机器…

Python自由职业可以做什么?副业月入3000的快乐你根本想象不到

很多有时间的程序员都会在业余时间接一些“私活”&#xff0c;也就是我们说的副业&#xff01; 毕竟虽然程序员加班时间长&#xff0c;但是也不是所有程序员都是需要997的…许多事业编制或者说一部分公司并不会出现特别夸张的加班时长。平常周末的时候也就会接一些副业&#x…

如何用Python操作PDF制作数据报告?

大家好&#xff0c;你是否会发现 Python 操作PDF文档内容&#xff0c;主要围绕PDF文档的内容提取、合并与拆分、加密与解密、添加水印以及不同文档格式相互转换来展开。 但大家会发现&#xff0c;其中并没有有太多直接操作PDF并向其写入的内容。这是因为我们更推荐大家Python自…

C语言练习之计算一个数的每位之和(递归实现)

目录 前言 一、思路 二、源代码以及运行截图 源代码&#xff1a; 运行截图&#xff1a; 总结 前言 写一个递归函数DigitSum(n)&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和 例如&#xff0c;调用DigitSum(1729)&#xff0c;则应该返回1 7 2 9&#…

LeetCode HOT 100 —— 297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

你还以为格子衫头发的就是程序员?这些特征都没有别说你是程序员

周一写几百个bug&#xff0c;周二到周四拼命改bug&#xff0c;周五总结bug&#xff0c;总结的好有周末&#xff0c;总结的不好周末无休&#xff01; 咳咳&#xff0c;这样的周末我可以不休息&#xff01; 有很多想要学习Python却找不到途径的朋友&#xff0c;我这里整理了一…

.NET Framework杂记

这篇博客主要记录在用C#编写上位机时&#xff0c;不会的知识点&#xff0c;随时更新&#xff0c;方便查阅。 C#语法操作杂记c#中让textbox选中不选中C#无法使用实例引用来访问成员解决方法针对不同定义情况的引用解释C# 字符串分割用字符串分割用多个字符串分割用单字符分割C#中…

【DevOps实战系列】第二章:详解Gitlab环境及搭建

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 gitlab就不多说了&#xff0c;这个东西现在大多数公司内部都在使用&#xff0c;它分为社区和企业版本&#xff0c;社区版本ce是免费的&#xff0c;当然也可以选择gitee或github&#xff0c;但由于…

非零基础自学Golang 第8章 包管理 8.6 包的命名 8.7 依赖包管理

非零基础自学Golang 文章目录非零基础自学Golang第8章 包管理8.6 包的命名8.7 依赖包管理第8章 包管理 8.6 包的命名 每个包都有一个包名&#xff0c;包名一般是短小的名字&#xff0c;在包的声明处指定。 通常来说&#xff0c;默认的包名就是包导入路径名的最后一段&#x…

AD20和立创EDA设计(5)立创EDA导出3D模型放入AD20使用

&#xff08;1&#xff09;本文主要介绍如何将从立创EDA导出的3D模型&#xff0c;并且对3D模型进行处理。 &#xff08;2&#xff09;需提前观看&#xff1a;AD20和立创EDA设计&#xff08;4&#xff09;PCB设计&#xff1b; &#xff08;3&#xff09;本文需要使用到Fusion 36…

基于6自由度飞行器的EKF和INS融合算法的MATLAB仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 六自由度四轴飞行器,包括由四根杆组成的正四面体,所述正四面体的中心位置设有一个空心圆球,空心圆球上设有四根支杆分别与正四面体的四个顶点相连,所述空心圆球内设有电池和控制系统, INS/GPS的松…

nodejs+vue041家政管理系统

基本要求&#xff1a;要求此系统能较完善的实现服务人员及客户信息的管理等功能。 主界面&#xff1a;分为用户登陆和管理员登陆&#xff0c;用户登陆包含客户登录和服务人员登陆。 用户注册&#xff1a;注册时可选择身份&#xff08;客户或者服务人员&#xff09;。 后台管…

目前免费用可用的天气api接口及失效接口

网上关于免费天气api接口很多&#xff0c;本人总结了一下目前还可用的免费api接口和已失效的接口如下&#xff1a; 目前可用接口&#xff1a; 1、讯飞语音识别内置的墨迹天气API。链接&#xff1a; http://autodev.openspeech.cn/csp/api/v2.1/weather?openIdaiuicus&c…

【Javaweb-前端】CSS

1. Syntax Selector − A selector is an HTML tag at which a style will be applied. This could be any tag like or etc.Property − A property is a type of attribute of HTML tag. Put simply, all the HTML attributes are converted into CSS properties. They coul…

散热材料产业SWOT分析:5G建设带动市场需求 多元化散热方案将成行业主流

传统散热材料以石墨片和导热凝胶等TIM材料&#xff08;导热界面材料&#xff09;为主&#xff0c;石墨片存在导热系数相对较低、厚度相对较大等问题。目前热管和VC&#xff08;均热板&#xff09;开始从电脑、服务器等领域渗透到智能手机终端&#xff0c;石墨烯材料也开始应用。…

Docker笔记--容器转换为镜像、Dockerfile的使用

目录 1--使用 docker commit 将容器转换为镜像 1-1--容器转换为镜像 1-2--实例代码 1-3--注意事项&#xff1a; 2--Dockerfile的使用 2-1--常用关键字 2-2--利用 dockerfile 搭建 Centos:7 镜像 1--使用 docker commit 将容器转换为镜像 1-1--容器转换为镜像 # 将容器…

家电产品出口指南,RoHs法规详解

【家电产品出口指南&#xff0c;RoHs法规详解】 受疫情影响&#xff0c;我国家电出口创新高&#xff0c;据海关总署发布的数据统计&#xff0c;2021年&#xff0c;中国家用电器出口额987.2亿美元&#xff0c;同比增长22.3%&#xff0c;出口规模远超历史同期水平&#xff0c;创近…

新款Macbook Pro可以升级固态硬盘吗?

不知道有多少用户因为预算不足而选购了256GB固态硬盘版本的Mac呢&#xff1f;在购买Mac之前&#xff0c;总觉得“省省总会有的”。实际上&#xff0c;还是很多256G的用户都在后悔&#xff1a;“为什么当初没有加钱升级固态硬盘啊&#xff01;”小编在此也提醒大家&#xff0c;如…

让人恶心的多线程代码,性能怎么优化!

Java 中最烦人的&#xff0c;就是多线程&#xff0c;一不小心&#xff0c;代码写的比单线程还慢&#xff0c;这就让人非常尴尬。 通常情况下&#xff0c;我们会使用 ThreadLocal 实现线程封闭&#xff0c;比如避免 SimpleDateFormat 在并发环境下所引起的一些不一致情况。其实…