首页
About
友情链接
Search
1
RustDesk远程桌面工具自建服务器教程
3,067 阅读
2
V2ray配置文件翻译
1,779 阅读
3
draw.io(diagrams.net) - 免费开源全平台绘图软件
1,392 阅读
4
Android 11 中的软件包可见性
1,246 阅读
5
Windows常用软件
1,032 阅读
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
登录
Search
Leon
累计撰写
36
篇文章
累计收到
53
条评论
首页
栏目
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
页面
About
友情链接
搜索到
36
篇与
Leon
的结果
2021-08-23
Shell基础
Shell基础Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell.png简单入门--Hello World脚本格式 脚本以#!/bin/bash开头(指定解析器)helloworld.sh中输入如下内容#!/bin/bash echo "helloworld"脚本的常用执行方式 第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)多命令处理 在home/ts目录下新建ts.txt并写入I love ThunderSoft.#!/bin/bash cd /home/ts touch ts.txt echo "I love ThunderSoft." >>ts.txt变量变量默认为字符串类型不能进行数值运算。常用系统变量$HOME 当前用户home目录 $PWD 当前目录 $SHELL 默认解析器 $USER 当前用户自定义变量 A=1=两边不能有空格,若有空格需要引号。 unset 释放变量静态变量readonly B=1(不能unset)全局变量export B 可供其它shell使用。特殊变量$n 参数$# 获取输入的所有参数 $* 获取所有参数(看做整体) $@ 获取所有参数(分别获取) $? 获取最后一次执行的状态 0正确执行 !0错误执行 file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt ${file##*.}:删掉最后一个 . 及其左边的字符串:txt ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}:删掉第一个 / 及其右边的字符串:(空值) ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my运算符"$((运算式))"或"$[运算式]"expr + , - , \*, /, % 加,减,乘,除,取余 expr运算符间要有空格For Example:expr 2 + 3 expr `expr 2 + 3` \* 4条件判断基本语法[ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ ts ]返回true,[] 返回false。常用判断条件两个整数之间比较= 字符串比较-lt 小于(less than) -le 小于等于(less equal)-eq 等于(equal) -gt 大于(greater than)-ge 大于等于(greater equal) -ne 不等于(Not equal)按照文件权限进行判断-r 有读的权限(read) -w 有写的权限(write)-x 有执行的权限(execute)按照文件类型进行判断-f 文件存在并且是一个常规的文件(file)-e 文件存在(existence) -d 文件存在并是一个目录(directory)多条件判断&& 表示前一条命令执行成功时,才执行后一条命令|| 表示上一条命令执行失败后,才执行下一条命令流程控制if判断基本语法if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格(2)if后要有空格输入一个数字,如果是1,则输出1,如果是2,则输出2,如果是其它,什么也不输出。#!/bin/bash if [ $1 -eq "1" ] then echo "1" elif [ $1 -eq "2" ] then echo "2" ficase语句基本语法case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac注意事项:1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 1) 双分号“;;”表示命令序列结束,相当于java中的break。 1) 最后的“*)”表示默认模式,相当于java中的default。输入一个数字,如果是1,则输出1,如果是2,则输出2,如果是其它,输出0。#!/bin/bash case $1 in "1") echo "1" ;; "2") echo "2" ;; *) echo "0" ;; esacfor循环基本语法1for (( 初始值;循环控制条件;变量变化 )) do 程序 done从1加到100#!/bin/bash s=0 for((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s基本语法2for 变量 in 值1 值2 值3…do 程序 done打印输入的所有数字#!/bin/bash for i in $* do echo " $i " donewhile循环基本语法while [ 条件判断式 ] do 程序done从1加到100#!/bin/bashs=0i=1while [ $i -le 100 ]do=$[$s+$i]i=$[$i+1]doneecho $sread读取控制台输入基本语法read(选项)(参数)选项:-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)。参数变量:指定读取值的变量名#!/bin/bashread -t 7 -p "Please input you name." NAMEecho $NAME函数系统函数basename基本语法basename [string / pathname] [suffix] basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。dirname文件绝对路径自定义函数基本语法 [ function ] funname[()] { Action; [return int;] } funname 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255) 2. 计算输入两参数的和 #!/bin/bash function sum(){ s=0s=$[ $1 + $2 ] echo "$s"} read -p "Please input the number1: " n1; read -p "Please input the number2: " n2; sum $n1 $n2; #### Shell工具 1. cut cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。 基本用法 cut [选项参数] filename | 选项参数 | 功能 | | -------- | ---------------------------- | | -f | 列号,提取第几列 | | -d | 分隔符,按照指定分隔符分割列 | 切割ts.txt第一列 cut -d " " -f 1 ts.txt 切ts.txt第二、三列 cut -d " " -f 2,3 ts.txt 在ts.txt文件中切割出ts cat ts.txt | grep "ts" | cut -d " " -f 1 选取系统PATH变量值,第2个“:”开始后的所有路径: echo $PATH | cut -d: -f 2- 切割ifconfig 后打印的IP地址 ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f1 2. sed sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 基本用法 sed [选项参数] ‘command’ filename | 选项参数 | 功能 | | -------- | ------------------------------------- | | -e | 直接在指令列模式上进行sed的动作编辑。 | | 命令 | 功能描述 | | ---- | ------------------------------------- | | *a* | 新增,a的后面可以接字串,在下一行出现 | | d | 删除 | | s | 查找并替换 | 将“ts”这个单词插入到ts.txt第二行下,打印。 sed '2a' ts sed.txt 注意:文件并没有改变 删除ts.txt文件所有包含wo的行 sed '/wo/d' ts.txt 将sed.txt文件中wo替换为ni sed 's/wo/ni/g' ts.txt 注意:‘g’表示global,全部替换 将ts.txt文件中的第二行删除并将wo替换为ni sed -e '2d' -e 's/wo/ni/g' ts.txt 3. awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。 1. 基本用法 awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename pattern:表示AWK在数据中查找的内容,就是匹配模式 action:在找到匹配内容时所执行的一系列命令 2. 选项参数说明 | 选项参数 | 功能 | | -------- | -------------------- | | -F | 指定输入文件折分隔符 | | -v | 赋值一个用户定义变量 | 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。 awk -F: '/^root/{print $7}' passwd 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。 awk -F: '/^root/{print $1","$7}' passwd 注意:只有匹配了pattern的行才会执行action 只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"hi,/bin/ts"。 awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "hi,/bin/ts"}' /etc/passwd 注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。 将passwd文件中的用户id增加数值1并输出 awk -v i=1 -F: '{print $3+i}' /etc/passwd awk的内置变量 | 变量 | 说明 | | -------- | -------------------------------------- | | FILENAME | 文件名 | | NR | 已读的记录数 | | NF | 浏览记录的域的个数(切割后,列的个数) | 统计passwd文件名,每行的行号,每行的列数 awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' /etc/passwd 切割IP ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' 查询sed.txt中空行所在的行号 awk '/^$/{print NR}' sed.txt 4. sort sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。 基本语法 sort(选项)(参数) | 选项 | 说明 | | -------------------------- | ------------------------ | | -n | 依照数值的大小排序 | | -r | 以相反的顺序来排序 | | -t | 设置排序时所用的分隔字符 | | -k | 指定需要排序的列 | | 参数:指定待排序的文件列表 | | 按照“:”分割后的第三列倒序排序。 sort -t : -nrk 3 sort.sh 实例:什么时候下班。 实例地址:https://github.com/fuhailong1998/offWorkTime!/bin/bash@auther: Leonecho 请输入您的上班时间。read timehour=${time%%.*}min=${time##*.}echo 想要误餐补吗?(18块)1要0不要。read flagcase "$flag" in1) if [ $min -gt 30 ] then hour=`expr $hour + 11` if [ `expr $min - 30` -lt 10 ] then min=0`expr $min - 30` else min=`expr $min - 30` fi elif [ $min -eq 30 ] then hour=`expr $hour + 11` min=00 else hour=`expr $hour + 10` min=`expr $min + 30` fi echo 您需要$hour:$min下班。 ;; 0) hour=`expr $hour + 8` echo 您需要$hour:$min下班。 ;; *) echo 输入有误!请规范输入,如"8.3"代表“8:03”。 exit; esac 执行:leon@fxkxb:~/sda/offWorkTime-main$ chmod +x offWorkTime leon@fxkxb:~/sda/offWorkTime-main$ ./offWorkTime 请输入您的上班时间。8.48想要误餐补吗?(18块)1要0不要。1您需要19:18下班。
2021年08月23日
349 阅读
0 评论
0 点赞
2021-08-13
Android Studio单元测试的编码过程
Android Studio单元测试的编码过程前言本次单元测试过程中遇到了很多很多很多很多问题,技术更新迭代速度实在是太快了,网上搜到的很多东西都过时了,这里找到了一个五年前印度小哥的教学录屏[1]......本来英语不好的我听着蹩脚的印度英语,实在是折磨QAQ....不过总体上按照他的步骤是可行的,期间遇到的各种问题也用过搜索解决了,最终磕磕绊绊完成了简单的单元测试编写。于是有了这篇技术总结。设置测试环境在测试开始前,首先添加 AndroidX Test API[2],以及为项目配置 Android 测试依赖项。最终的在应用的顶级 build.gradle 文件中,依赖项如下:dependencies { androidTestImplementation "org.mockito:mockito-core:2.18.0" androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:rules:1.4.0' androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' }同时确保 defaultConfig { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }使用Android Studio生成测试类鼠标标记要生成的类,按Alt+Enter,选择第一个。在创建测试类窗口中,测试库我们选择JUnit4。类名可以自定义,建议不要改。父类不选,目标包就是项目包名,勾选setUp和tearDown。最后在要测试的方法前打勾。点击OK。随即弹出窗口提示我们选择测试类类型,我们选Android的测试类。由此我们得到了一个测试类,按Shift+Ctrl+T可在测试类与Activity间切换,这里创建rule并实例化。 @Rule public ActivityTestRule<FirstActivity> mainActivityActivityTestRule = new ActivityTestRule<FirstActivity>(FirstActivity.class); private FirstActivity firstActivity = null; @Before public void setUp() throws Exception { firstActivity = mainActivityActivityTestRule.getActivity(); }这样我们就可以通过实例化的rule来获取页面元素。a Simple Example: 测试文本是否为空。UT代码:TextView t = firstActivity.findViewById(R.id.textView10); assertNull(t.getText()); 2. 点击测试方法左边的绿三角即可开始测试。 ![image-20210813060836192.png][4] 以我的程序为例,来测试LED小灯的点亮功能。@Test public void light() { firstActivity.power = true; TextView[] leds = {firstActivity.findViewById(R.id.textView4), firstActivity.findViewById(R.id.textView6), firstActivity.findViewById(R.id.textView5), firstActivity.findViewById(R.id.textView7)}; int[] ledStatus = {1, 1, 0, 0}; final Drawable.ConstantState drawable = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable2 = leds[1].getBackground().getConstantState(); firstActivity.light(ledStatus,leds); final Drawable.ConstantState drawable1 = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable3 = leds[1].getBackground().getConstantState(); assertEquals(drawable,drawable1); assertNotEquals(drawable2,drawable3); } 我的Activity部分。 public void light(int[] b, TextView[] t) { for (int i = 0; i < 4; i++) { switch (i) { case 0: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightred); } } else if (b[i]==-1){ break; }else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 1: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightgreen); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 2: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightblue); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 3: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightup); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; default: break; } } }点击测试类左边的双绿三角可开始测试类中全部测试方法的测试。 我的测试结果:参考文献Android app development for beginners - 26 - Android - Unit test for Activity - Activity Test Rule: https://www.youtube.com/watch?v=_TR6QcRozAgSet up project for AndroidX Test: https://developer.android.com/training/testing/set-up-projectBuild instrumented unit tests: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests#javaAndroid单元测试(二):Mockito框架的使用: https://blog.csdn.net/qq_17766199/article/details/78450007Q&A on stackoverflow: https://stackoverflow.com/questions/13621407/getting-the-current-background-id-of-a-viewAndroid单元测试-对Activity的测试: https://blog.csdn.net/Double2hao/article/details/77160950
2021年08月13日
765 阅读
1 评论
0 点赞
2021-08-03
基于Django的内网互传服务器
https://github.com/fuhailong1998/djangoFileShareSite内网传输,千兆网速跑满。账号系统,安全保障。IP中间件屏蔽,进一步安全。 # !/usr/bin/env python3 # -*- coding:utf-8 -*- """ @file : middlewares.py @author : Leon(fxkxb.com) @date : 2021/8/3 03:21 @description : """ from django.shortcuts import render from django.utils.deprecation import MiddlewareMixin class IpMiddleware(MiddlewareMixin): def process_view(self, request, view_func, *view_args, **view_kwargs): EXCLUDE_IPS = ['*'] if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] if EXCLUDE_IPS[0] == '*': return if ip not in EXCLUDE_IPS: return render(request, 'sorry.html')
2021年08月03日
29 阅读
0 评论
0 点赞
2021-07-30
Docker
Docker简介Docker 采用Go语言编写,是一个开放源代码软件(源代码库:https://github.com/moby/moby),是一个用于开发应用、交付(shipping)应用、运行应用的开放平台。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。[1]| | Docker容器 | 虚拟机(VM) | | ---------- | ----------------------- | --------------------------- | | 操作系统 | 与宿主机共享OS | 宿主机OS上运行宿主机OS | | 存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk等) | | 运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu、内存消耗 | | 移植性 | 轻便、灵活、适用于Linux | 笨重、与虚拟化技术耦合度高 | | 硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |可使用Play with Docker https://labs.play-with-docker.com/来练习docker指令。Hello World使用docker运行hello world[2]docker run hello-worldHello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/简单使用目标:建立一个“Hi ThunderSoft”Nginx网页服务器镜像。拉取nginx基本镜像docker pull nginxUsing default tag: latest latest: Pulling from library/nginx 33847f680f63: Pull complete dbb907d5159d: Pull complete 8a268f30c42a: Pull complete b10cf527a02d: Pull complete c90b090c213b: Pull complete 1f41b2f2bf94: Pull complete Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest查看本地镜像docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 08b152afcfae 10 days ago 133MB运行镜像docker run -dp 80:80 nginx 运行后系统返回了一串sha256的容器id 查看容器 docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fc8162606fcf nginx "/docker-entrypoint.…" 34 seconds ago Up 33 seconds 0.0.0.0:80->80/tcp nifty_leavitt 同时暴露出80端口 ![image-20210801193628279.png][3] 点击(访问这个网址)即可看到nginx的默认页面。 # Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to [nginx.org](http://nginx.org/). Commercial support is available at [nginx.com](http://nginx.com/). *Thank you for using nginx.* 修改默认页面进入容器docker exec -it 容器名称或id(id前几位就行) /bin/bash root@fc8162606fcf:/# 2. 修改nginx默认文件内容 echo "<h1>Hi Thundersoft</h1>" > /usr/share/nginx/html/index.html 3. 刷新页面即可看到修改后的内容。 # Hi Thundersoft 从容器创建镜像commit -a "作者名" -m "说明" 容器名称或者id 镜像名称:镜像版本 成功则返回了一串sha256的镜像id 查看本地镜像 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ts latest 298133099b1e 37 seconds ago 133MB nginx latest 08b152afcfae 10 days ago 133MB保存镜像为tar归档文件docker save -o 压缩文件名 镜像名:标签 查看 $ ls -l total 134240 -rw------- 1 root root 137459712 Aug 1 11:49 ts.tar删除刚刚创建的镜像。$ docker rmi nginx:latest ts:latest [node1] (local) root@192.168.0.13 ~ $ docker rmi ts:latest Untagged: ts:latest Deleted: sha256:298133099b1ef66a0bd4ad0c04676118dcaef22e635928680692bcbf5cc56af5 Deleted: sha256:d111dc2677957b6e00fbb140fae7ac110d6d258a055d2bef33a88249ad9897f9 [node1] (local) root@192.168.0.13 ~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 08b152afcfae 10 days ago 133MBtar归档镜像的使用docker load < ts.tar ts已成功导入并且可以成功运行 bcf8600f8844: Loading layer [==================================================>] 14.85kB/14.85kB Loaded image: ts:latest [node1] (local) root@192.168.0.13 ~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ts latest 298133099b1e 7 minutes ago 133MB nginx latest 08b152afcfae 10 days ago 133MB [node1] (local) root@192.168.0.13 ~ $ docker run -dp 81:80 ts a4818859dc11a41f0a6d6f36cc130c7e0c8bfff317572114a88b6be037fc6915 ![image-20210801195619457.png][4] # Hi Thundersoft 远程镜像仓库的使用在docker hub注册https://hub.docker.com/signup终端登录docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: fuhailong1998 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded 3. 将自己的镜像改名 docker tag 镜像名或id docker hub用户名/镜像名:版本 For example: docker tag ts:latest fuhailong1998/ts:latest 4. 将镜像push到自己的远程库 docker push docker hub用户名/镜像名:版本 For example: docker push fuhailong1998/ts:latestThe push refers to repository [docker.io/fuhailong1998/ts] bcf8600f8844: Pushed e3135447ca3e: Mounted from library/nginx b85734705991: Mounted from library/nginx 988d9a3509bb: Mounted from library/nginx 59b01b87c9e7: Mounted from library/nginx 7c0b223167b9: Mounted from library/nginx 814bff734324: Mounted from library/nginx latest: digest: sha256:e538a178407d3cd1fe84ba48c84be1e4a59e7f16e19db2538f2e294fb0e3244b size: 1778 此时刷新自己的docker hub远程库即可看到自己的镜像。 ![image-20210801200636389.png][5] 5. 在另一台主机拉取镜像。 1. 在Play with Docker上新建节点(相当于新建一台主机)。 ![image-20210801200852986.png][6] 2. 此时这台新节点是没有任何镜像的 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 3. 拉取远程镜像 $ docker pull fuhailong1998/ts Using default tag: latest latest: Pulling from fuhailong1998/ts 33847f680f63: Pull complete dbb907d5159d: Pull complete 8a268f30c42a: Pull complete b10cf527a02d: Pull complete c90b090c213b: Pull complete 1f41b2f2bf94: Pull complete 1db4419f88f4: Pull complete Digest: sha256:e538a178407d3cd1fe84ba48c84be1e4a59e7f16e19db2538f2e294fb0e3244b Status: Downloaded newer image for fuhailong1998/ts:latest docker.io/fuhailong1998/ts:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE fuhailong1998/ts latest 298133099b1e 26 minutes ago 133MB 4. 将刚刚拉取的镜像运行为容器 $ docker run -dp 80:80 2981 703d229923940401f26a35ebf9b562305abe421460f14d6ddeeb06c2a3fe4c87 运行后此节点显示“80”,代表暴露了80端口。 ![image-20210801201436234.png][7] 点击访问就是刚刚在第一个节点创建的镜像。 # Hi Thundersoft 基本命令[3]##### 容器生命周期管理| 命令 | 说明 | | | :------------: | :------------------------------: | --------------------------------------- | | docker run | 创建一个新的容器并运行一个命令。 | | | docker start | 启动一个或多个已经被停止的容器。 | | | docker stop | 停止一个运行中的容器。 | | | docker restart | 重启容器docker。 | | | docker kill | 终止一个运行中的容器。 | | | docker rm | 删除容器。 | | | docker pause | 暂停容器中所有的进程。 | | | docker unpause | 恢复容器中所有的进程。 | | | docker create | 创建一个新的容器但不启动它。 | | | docker exec | 在运行的容器中执行命令。 | docker exec -i -t dockername /bin/bash |##### 容器操作| 命令 | 说明 | | | :------------: | :----------------------------------------------------------: | ------------------------------------------ | | docker ps | 查看容器。 | | | docker inspect | 获取容器/镜像的元数据。 | | | docker top | 查看容器中运行的进程信息,支持 ps 命令参数。 | | | docker attach | 连接到正在运行中的容器。 | docker attach --sig-proxy=false dockername | | docker events | 从服务器获取实时事件。 | | | docker logs | 获取容器的日志。 | | | docker wait | 阻塞运行直到容器停止,然后打印出它的退出代码。 | | | docker export | 将文件系统作为一个tar归档文件导出到输出流。 | | | docker port | 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。 | |##### 容器rootfs命令| 命令 | 说明 | | :------------: | :----------------------------: | | ddocker commit | 从容器创建一个新的镜像。 | | docker cp | 用于容器与主机之间的数据拷贝。 | | docker diff | 检查容器里文件结构的更改。 |##### 镜像仓库| 命令 | 说明 | | :-----------: | :----------------------------------------------------------: | | docker login | 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub | | docker logout | 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub | | docker pull | 从镜像仓库中拉取或者更新指定镜像。 | | docker push | 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。 | | docker search | 从Docker Hub查找镜像 |##### 本地镜像管理| 命令 | 说明 | | :------------: | :---------------------------------: | | docker images | 列出本地镜像。 | | docker rmi | 删除本地镜像。 | | docker tag | 标记本地镜像,将其归入某一仓库。 | | docker build | 使用 Dockerfile 创建镜像。 | | docker history | 查看镜像的创建历史。 | | docker save | 将指定镜像保存成 tar 归档文件。 | | docker load | 导入使用docker save命令导出的镜像。 | | docker import | 从归档文件中创建镜像。 |##### info|version命令说明docker info显示 Docker 系统信息,包括镜像和容器数。docker version显示 Docker 版本信息。参考文献
2021年07月30日
294 阅读
0 评论
0 点赞
2021-07-19
Docker安装
官方文档:https://docs.docker.com/engine/install/ubuntu/安装新版本前需要卸载旧版本。sudo apt-get remove docker docker-engine docker.io containerd runc允许apt使用https。 sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release导入GPG密钥。 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg添加docker源。echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null更新apt源,并安装docker。 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io(可选)使用阿里云的容器镜像服务-镜像加速器提升获取Docker官方镜像的速度。https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors通过修改daemon配置文件/etc/docker/daemon.json来使用加速器sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://每个人的阿里云账号不同.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker运行docker的hello-worldsudo docker run hello-worldUnable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
2021年07月19日
276 阅读
0 评论
0 点赞
1
...
5
6
7
8