Linux学习笔记-管道、环境变量与Docker

  1. 1. 管道
  2. 2. 环境变量
  3. 3. Docker
    1. 3.1 Docker安装
    2. 3.2 Docker教程
    3. 3.3 Docker的代理地址是什么?

本文记录 Linux 的学习过程,内容为管道、环境变量与 Docker。
Docker 官网:Docker Hub

1. 管道

(1)概念

管道类似于文件重定向,可以将前一个命令的 stdout 重定向到下一个命令的 stdin

(2)要点

  • 管道命令仅处理 stdout,会忽略 stderr
  • 管道右边的命令必须能接受 stdin
  • 多个管道命令可以串联。

(3)与文件重定向的区别

  • 文件重定向左边为命令,右边为文件。
  • 管道左右两边均为命令,左边有 stdout,右边有 stdin

(4)举例

统计当前目录下所有 Python 文件的总行数,其中 findxargswc 等命令可以参考:Linux学习笔记-命令、Tmux与Vim

1
find . -name '*.py' | xargs cat | wc -l

2. 环境变量

(1)概念

Linux 系统中会用很多环境变量来记录配置信息
环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。

(2)查看

列出当前环境下的所有环境变量:

1
2
3
env  # 显示当前用户的变量
set # 显示当前shell的变量,包括当前用户的变量
export # 显示当前导出成用户变量的shell变量

输出某个环境变量的值:

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
2
3
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

(4)设置 repository

1
2
3
4
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

(5)安装 Docker Engine,首先更新 apt

1
sudo apt-get update

(6)安装 Docker EnginecontainerdDocker Compose

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

(7)检查版本:

1
2
docker -v
docker --version

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.04docker 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:latestdocker 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/importdocker save/load 的区别:
    • export/import 会丢弃历史记录和元数据信息,仅保存容器当时的快照状态。
    • save/load 会保存完整记录,体积更大。
  • docker top CONTAINER:查看某个容器内的所有进程。
  • docker stats:查看所有容器的统计信息,包括 CPU、内存、存储、网络等信息。
  • docker cp xxx CONTAINER:xxxdocker cp CONTAINER:xxx xxx:在本地和容器间复制文件。
  • docker rename NAMES1 NAMES2:将 NAMES1 容器重命名为 NAMES2
  • docker update CONTAINER --memory 500MB:修改容器限制,更多修改内容可以在官网查找。
  • 进入容器后输入 passwd 可以设置 root 密码。

(4)云服务器配置示例

首先在 AC Terminal 中操作:

1
2
3
4
5
6
7
8
scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar server_name:  # 将镜像上传到自己租的云端服务器
ssh server_name # 登录自己的云端服务器

docker load -i docker_lesson_1_0.tar # 将镜像加载到本地
docker run -p 20000:22 --name my_docker_server -itd docker_lesson:1.0 # 创建并运行docker_lesson:1.0镜像的容器

docker attach my_docker_server # 进入创建的docker容器
passwd # 设置root密码

然后去云平台控制台中修改安全组配置,放行端口:20000。

返回 AC Terminal,即可通过 SSH 登录自己的 Docker 容器:

1
ssh root@xxx.xxx.xxx.xxx -p 20000  # 将xxx.xxx.xxx.xxx替换成自己租的服务器的IP地址

创建 acs 用户:

1
2
adduser acs  # 创建用户acs
usermod -aG sudo acs # 给用户acs分配sudo权限

最后可以配置 Docker 容器的别名和免密登录。

Tips:如果 apt-get 下载软件速度较慢,可以参考清华大学开源软件镜像站中的内容,修改软件源。

(5)数据迁移

如果想保留 Docker 数据库里的数据,需要用 savelaod 迁移。

首先将容器打包成镜像:

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

下一章:无。