Post

Docker使用教程

Docker使用教程

1 Docker 是什么?

软件开发最大的麻烦事之一,就是环境配置。换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。但是,这个方案有几个缺点:

  • 资源占用多
  • 冗余步骤多
  • 启动慢

因此,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有很多优势:

  • 启动快
  • 资源占用少
  • 体积小

Docker 容器 是一个轻量级、可移植、自给自足的软件环境,用于运行应用程序。Docker 容器将应用程序及其所有依赖项(包括库、配置文件、系统工具等)封装在一个标准化的包中,使得应用能够在任何地方一致地运行。容器是操作系统级别的虚拟化,不需要运行完整的操作系统,启动和运行更为高效。

镜像与容器的关系:

  • 镜像(Image):容器的静态模板,包含了应用程序运行所需的所有依赖和文件。镜像是不可变的。
  • 容器(Container):镜像的一个运行实例,具有自己的文件系统、进程、网络等,且是动态的。容器从镜像启动,并在运行时保持可变。

2 Docker 的使用

可以通过脚本执行docker run,并添加相应参数,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# startcontainer.sh
docker run \
    --gpus all \
    --cap-add SYS_ADMIN \
    --network=host \
    --cap-add=IPC_LOCK \
    --ipc=host \
    --ulimit memlock=-1 \
    --privileged \
    --device /dev/infiniband/rdma_cm \
    -v /home:/home \
    -w /workspace \
    --entrypoint="/bin/bash" \
    --name my_container \									# 生成的容器名
    -itd my_image:latest									# 使用的镜像名:版本

然后通过 sh startcontainer.sh 就可以起容器。

常用的 Docker 客户端命令:

命令功能
docker run启动一个新的容器并运行命令
docker ps列出当前正在运行的容器
docker ps -a列出所有容器(包括已停止的容器)
docker build使用 Dockerfile 构建镜像
docker images列出本地存储的所有镜像
docker exec在运行的容器中执行命令
docker stop <容器ID>停止一个或多个容器
docker start <容器ID>启动已停止的容器
docker restart <容器ID>重启一个容器
docker rm <容器ID>删除一个或多个容器
docker logs查看容器的日志
docker <容器ID> cp [containID]:[/path/to/file] .从容器中拷贝文件到宿主机
docker version显示 Docker 客户端和守护进程的版本信息

3 通过 vscode 连接容器

可以通过ssh命令连接本地和宿主机/容器,也可以通过vscode连接。ssh命令:

1
2
ssh User@HostName	# 连接宿主机
ssh -p port root@127.0.0.1	# 在宿主机中连接容器

3.1 通过 vscode 连接宿主机

打开本地的.ssh目录(Windows一般是 C:\User\.ssh ),里面有个 id_rsa.pub 文件,用记事本的格式打开这个文件,并复制里面的所有内容,即ssh公钥。

接着在远程服务器终端,打开 .ssh目录,里面有个 authorized_keys 文件,将刚刚复制的公钥粘贴到 authorized_keys 里面(从文件内容最后开始粘贴)。

再打开vscode,进行远程连接(这里需要在vscode上安装远程资源管理器,即remote ssh)。点击远程资源管理器的设置按钮,在配置文件中添加host、hostname、user。host可以自己随便取,hostname是远程服务器的ip地址,user是远程服务器的用户名。

3.2 通过 vscode 连接容器

同样可以在vscode中连接本地和容器,只需要修改配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
# 宿主机
Host my_server
  HostName x.x.x.x
  User root	# 自己的用户名
  Port 22	# 默认端口
  
# 容器
Host my_container
    HostName 127.0.0.1 # 对跳板机而言,容器就在 127.0.0.1:port
    User root
    Port xxxx # 自己起容器的时候设置的端口
    ProxyCommand ssh -W %h:%p x.x.x.x  # 关键:先连宿主机,与上述宿主机的config的名字相同,再让它转发到 127.0.0.1:port

参考资料

This post is licensed under CC BY 4.0 by the author.