本文记录 Linux 的学习过程,内容为管道、环境变量与 Docker。
Docker 官网:Docker Hub。
1. 管道
(1)概念
管道类似于文件重定向,可以将前一个命令的 stdout
重定向到下一个命令的 stdin
。
(2)要点
- 管道命令仅处理
stdout
,会忽略stderr
。 - 管道右边的命令必须能接受
stdin
。 - 多个管道命令可以串联。
(3)与文件重定向的区别
- 文件重定向左边为命令,右边为文件。
- 管道左右两边均为命令,左边有
stdout
,右边有stdin
。
(4)举例
统计当前目录下所有 Python 文件的总行数,其中 find
、xargs
、wc
等命令可以参考:Linux学习笔记-命令、Tmux与Vim。
1 | find . -name '*.py' | xargs cat | wc -l |
2. 环境变量
(1)概念
Linux 系统中会用很多环境变量来记录配置信息。
环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。
(2)查看
列出当前环境下的所有环境变量:
1 | env # 显示当前用户的变量 |
输出某个环境变量的值:
1 | echo $PATH |
(3)修改
环境变量的定义、修改、删除操作可以参考Linux学习笔记-Shell这一节的内容。
为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到 ~/.bashrc
文件中。修改完 ~/.bashrc
文件后,需要执行 source ~/.bashrc
,来将修改应用到当前的 bash
环境下。
为何将修改命令放到 ~/.bashrc
,就可以确保修改会影响未来所有的环境呢?
- 每次启动
bash
,都会先执行~/.bashrc
。 - 每次
ssh
登陆远程服务器,都会启动一个bash
命令行给我们。 - 每次
tmux
新开一个pane
,都会启动一个bash
命令行给我们。 - 所以未来所有新开的环境都会加载我们修改的内容。
(4)常见环境变量
HOME
:用户的家目录。PATH
:可执行文件(命令)的存储路径。路径与路径之间用:
分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。LD_LIBRARY_PATH
:用于指定动态链接库(.so
文件)的路径,其内容是以冒号分隔的路径列表。C_INCLUDE_PATH
:C 语言的头文件路径,内容是以冒号分隔的路径列表。CPLUS_INCLUDE_PATH
:CPP 的头文件路径,内容是以冒号分隔的路径列表。PYTHONPATH
:Python 导入包的路径,内容是以冒号分隔的路径列表。JAVA_HOME
:JDK 的安装目录。CLASSPATH
:存放 Java 导入类的路径,内容是以冒号分隔的路径列表。
3. Docker
3.1 Docker安装
Ubuntu 系统 Docker 官网安装教程:Docker Install Docs。
本文安装 Docker 所使用的 OS 版本为:Ubuntu 22.04 (LTS)。依次执行以下命令安装 Docker:
(1)更新 apt
:
1 | sudo apt-get update |
(2)允许 apt
通过 HTTPS 使用存储库:
1 | sudo apt-get install ca-certificates curl |
(3)添加 Docker 的官方 GPG 密钥:
1 | sudo install -m 0755 -d /etc/apt/keyrings |
(4)设置 repository
:
1 | echo \ |
(5)安装 Docker Engine,首先更新 apt
:
1 | sudo apt-get update |
(6)安装 Docker Engine
、containerd
、Docker Compose
:
1 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
(7)检查版本:
1 | docker -v |
3.2 Docker教程
(1)将当前用户添加到 docker
用户组
为了避免每次使用 docker
命令都需要加上 sudo
权限,可以将当前用户加入安装中自动创建的 docker
用户组(可以参考官方文档):
1 | sudo usermod -aG docker $USER |
执行完此操作后,需要退出服务器(即关闭系统),再重新登录回来,才可以省去 sudo
权限。
重启 Docker 服务命令如下:
1 | service docker restart |
查看 Docker 运行状态:
1 | service docker status |
(2)镜像(images)
一个 Docker 中可以有很多镜像,镜像就相当于模板,每个镜像中又可以有很多容器。
用相同镜像生成的容器环境都一样,如果 Docker 安装在云服务器上,那么每个容器也就相当于是一个独立的云服务器。
迁移项目的时候即将容器先生成一个镜像,然后把镜像传到远程服务器上。
docker pull ubuntu:20.04
或docker pull ubuntu:latest
:拉取一个镜像。docker images
:列出本地所有镜像。docker save -o ubuntu_latest.tar ubuntu:latest
:将镜像ubuntu:latest
导出到本地文件ubuntu_latest.tar
中,导出后记得给文件加上可读权限:chmod +r ubuntu_latest.tar
。docker image rm ubuntu:latest
或docker rmi ubuntu:latest
:删除镜像ubuntu:latest
。docker [container] commit CONTAINER IMAGE_NAME:TAG
:创建某个container
的镜像,[]
表示container
为可选字段。docker load -i ubuntu_latest.tar
:将镜像ubuntu:latest
从本地文件ubuntu_latest.tar
中加载出来。
(3)容器(container)
docker [container] create -it ubuntu:latest
:利用镜像ubuntu:latest
创建一个容器。docker ps -a
:查看本地的所有容器,docker ps
为查看运行中的容器。docker [container] start CONTAINER
:启动容器,CONTAINER
可以是 ID 或 NAMES。docker [container] stop CONTAINER
:停止容器。docker [container] restart CONTAINER
:重启容器。docker [contaienr] run -itd ubuntu:latest
:创建并启动一个容器,可以加上参数-p 20000:22
表示将容器的22端口映射到本地的20000端口,因为本地的22端口已经被占用了,且如果是在云服务器安装 Docker 还需要修改云服务器安全组配置,把20000端口放行。docker [container] attach CONTAINER
:进入容器。- 先按
Ctrl+p
,再按Ctrl+q
可以挂起容器,即退出但不关闭容器。 - 按
Ctrl+d
可以退出并关闭容器。
- 先按
docker [container] exec CONTAINER COMMAND
:在容器中执行COMMAND
命令。docker [container] rm CONTAINER
:删除容器。docker container prune
:删除所有已停止的容器。docker export -o xxx.tar CONTAINER
:将容器导出到本地文件xxx.tar
中。docker import xxx.tar image_name:tag
:将本地文件xxx.tar
导入成镜像,并将镜像命名为image_name:tag
。docker export/import
与docker save/load
的区别:export/import
会丢弃历史记录和元数据信息,仅保存容器当时的快照状态。save/load
会保存完整记录,体积更大。
docker top CONTAINER
:查看某个容器内的所有进程。docker stats
:查看所有容器的统计信息,包括 CPU、内存、存储、网络等信息。docker cp xxx CONTAINER:xxx
或docker cp CONTAINER:xxx xxx
:在本地和容器间复制文件。docker rename NAMES1 NAMES2
:将NAMES1
容器重命名为NAMES2
。docker update CONTAINER --memory 500MB
:修改容器限制,更多修改内容可以在官网查找。- 进入容器后输入
passwd
可以设置root
密码。
(4)云服务器配置示例
首先在 AC Terminal 中操作:
1 | scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar server_name: # 将镜像上传到自己租的云端服务器 |
然后去云平台控制台中修改安全组配置,放行端口:20000。
返回 AC Terminal,即可通过 SSH 登录自己的 Docker 容器:
1 | ssh root@xxx.xxx.xxx.xxx -p 20000 # 将xxx.xxx.xxx.xxx替换成自己租的服务器的IP地址 |
创建 acs
用户:
1 | adduser acs # 创建用户acs |
最后可以配置 Docker 容器的别名和免密登录。
Tips:如果 apt-get
下载软件速度较慢,可以参考清华大学开源软件镜像站中的内容,修改软件源。
(5)数据迁移
如果想保留 Docker 数据库里的数据,需要用 save
和 laod
迁移。
首先将容器打包成镜像:
1 | docker commit --author AsanoSaki --message "Create the <Image name> by AsanoSaki" <Container name> <Image name>:<tag> |
导出镜像:
1 | docker save -o <Image name>.tar <Image name>:<tag> |
将导出的镜像文件传到目标主机上,然后导入镜像:
1 | docker load -i <Image name>.tar |
查看镜像:
1 | docker images |
生成一个新的容器:
1 | docker run -d --name <Container name> -p 20000:22 <Image name>:<tag> |
3.3 Docker的代理地址是什么?
在 Docker 中,代理地址是用于帮助 Docker 服务和容器访问网络的服务器地址。如果你的网络环境需要通过代理服务器来访问互联网,那么你需要为 Docker 配置代理服务器的地址。这个地址通常由你的网络管理员或者互联网服务提供商提供。
Docker 的代理配置主要有以下几种情况:
- 为 Docker Daemon 配置代理:这主要是为了支持
docker pull
等需要访问公网的 Docker 命令。你可以在 Docker 的守护进程的环境变量中设置代理。 - 为 Docker 容器配置代理:这主要是为了让运行在 Docker 容器中的应用能够通过代理访问网络。你可以在启动容器时,通过
docker run
命令的-e
参数来设置代理。 - 为 Docker Build 配置代理:这主要是为了在构建 Docker 镜像时,让
docker build
命令能够通过代理下载依赖的文件。你可以在执行docker build
命令时,通过--build-arg
参数来设置代理。
具体的代理地址和如何获取,需要咨询你的网络管理员或者互联网服务提供商。如果你是在公司或者学校的网络环境下,可能需要通过内部的代理服务器来访问互联网。如果你是在家庭网络环境下,一般来说不需要配置代理,除非你的互联网服务提供商要求你这么做。如果你在中国大陆地区,由于网络封锁的原因,你可能需要配置代理服务器才能访问一些国外的网站。
上一章:Linux学习笔记-Thrift。
下一章:无。