Docker

此为docker/singularity(apptainer)使用方法的一些笔记,个人记录使用。

docker三要素

  • 仓库:镜像仓库,镜像的存储库。
  • 镜像:系统镜像等,封装了应用的环境、信息,相当于容器(实例)的类。
  • 容器:由系统镜像(静态配置)生成的应用,可以直接运行镜像中的应用或者使用交互式(类似虚拟机,但占用资源更少)。

docker常见误区

docker并非虚拟机,其本质相当与宿主机的一个进程。在使用docker容器的时候,我们一般一次只运行一个程序,docker执行的程序相当于其第一个进程,当这个进程结束的时候。docker容器也就随之停止。

因此运行docker容器时一定要注意第一个运行的程序一结束,容器便会停止,比如/bin/sh -c command,此时/bin/sh是第一个程序,当此程序运作完毕时,容器也会停止。

docker常用指令

1
docker run 镜像名:tagname 指令1 && [指令2 && [指令3......]]

从指定镜像运行一个容器,若本地没有则从docker hub下载制定镜像,
同时运行容器后的指令,可以通过&&连接符运行多个指令

1
2
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname

也可以通过cli方式从本地推送自制的镜像至docker hub(类似于git仓库,可以设置公共仓库和私有仓库)。
不过因为类似一个云端存储,免费版docker用户公共镜像只能有一个

1
docker login

此命令可以登录至docker hub,
之后可以通过docker push发布自己的镜像不过镜像名字必须为用户名/镜像名:标签名

1
docker run -it 指定镜像 /bin/bash 

交互式形式在指定镜像上生成容器并在容器内与容器进行交互。

/bin/bash指定使用的解释器。

1
docker exec -it 容器名 /bin/bash

以交互式形式在指定容器上重新运行指定的解释器。

1
docker search 镜像名

在docker hub上查找有无公开的镜像

1
docker pull 镜像地址

从docker hub上拉取公开的镜像

1
2
3
docker pull
docker commit - 可以提交一个正在运行的容器,通过该容器生成一个我们已经配置好环境的镜像
docker push

这意味着我们可以像使用git一样使用docker处理、更新镜像、容器

docker同时为我们提供了dockerfile,类似一个脚本,在脚本内填入创建镜像需要的指令,docker会自动帮助我们构建所需镜像。

自动构建脚本,相当于自动处理脚本内容在容器内处理,我们再通过容器id提交一个我们自己的镜像(配置了我们的环境)

push 用户名/docker镜像名:tag

其中docker commit可以帮助我们从一个容器中构建出我们自己的镜像,
例如docker commit containerName imageName可以帮助我们使用制定的容器生成自定义的镜像

1
docker build -t [父镜像名]:[镜像的tag] [Dockerfile所在的文件路径]

docker可以从dockerfile(自动构建,描述了使用的镜像还有构建环境需要的目录)中自动构建出一个配置了我们所需要环境的镜像。

--no-cache参数可以指定不使用缓存构建容器

1
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

从本地文件系统(本地系统镜像导入到docker镜像)

1
2
docker images
docker ps / docker ps -a

images列出当前所有镜像列表包括其id
ps列出当前实例化的容器以及其id,有助于我们构建自己的镜像

1
docker container ls -a

列出当前所拥有的容器

需要注意,当我们在交互模式的容器中使用exit或者是ctrl+d退出时,容器会立即终止。
此时我们可以通过docker container start container_id/container_name的方式来重新运行这个容器(之前终端已经退出,之前终端内运行的服务也已被终止)。

docker container restart container_id/container_name重新运行一个容器

1
docker rm container_id/container_name

删除指定的容器

1
docker rmi image_id/image_name

删除指定的镜像

1
docker run -P image

运行一个镜像,随机映射端口

使用docker run -p host_port:container_port image可以指定分配端口,
即我们可以将容器的端口映射至宿主机的端口,通过访问宿主机端口访问容器指定的端口

docker run -d,d参数可以使容器在后台运行

1
docker inspect container_id/container_name

此命令可以获取容器的具体信息

若搭配管道符和文本处理工具可以高效地获取我们需要的信息,
比如docker inspect container_id/container_name | grep IPAddress可以获取容器在宿主机中被分配的id

1
docker run -v host_path/container_path [ -v /other/path:/other/container_path... ]

通过这个命令将宿主机的目录与容器的指定目录进行连接,相当于进行挂载,有助于数据的保存,可以通过这个命令来在宿主机中保存我们需要的日志信息等。多次挂载需要多次进行声明。

1
docker save -o < target_image_name.tar > < current_image_name >

以压缩包保存已经拉取的镜像

1
docker load -i < target_image_name.tar >

加载本地镜像(压缩包形式)

命令行使用

docker cli 的使用前需要先启动docker的守护进程

1
2
sudo systemctl start docker
sudo systemctl enable docker

使用systemctl启动docker和启用docker服务开机自启

细节

很多时候我们不用root账户来运行docker的相关服务,因为安全性很难得到保证。
因此我们需要使用普通用户来使用docker的服务。

在linux中,我们可以这么做:

  1. sudo gpasswd -a username docker
  2. newgrp docker

即将用户添加至docker组,这样可以免去使用sudo,通过root账户运行docker

在使用docker容器的时候,我们一些时候需要在交互模式下跑应用然后退出至我们的宿主机,很多时候我们并不想退出的时候关闭容器,因此我们可以使用快捷键Ctrl+p+q返回宿主机并保证容器能正常运行。

singularity

和docker类似,singularity也提供了类似docker一样的容器服务,也有自己的容器仓库

不过singularity没有镜像的概念,我们运行的都是一个一个容器(容器和镜像不再单独分开)

singularity容器有两种模式(只读、沙盒)

sif文件:压缩后的只读的singularity镜像文件,生产使用主要形式
sandbox:可写的容器,常用于开发或者创建自己的容器

singularity目前常用于高性能计算中,其容器名后缀名.sif。

singularity常用指令

从外部源下载容器

*docker 为docker的镜像仓库 library 为singularity的容器仓库

1
2
singularity -d build 容器名.sif 容器地址
singularity pull 容器名.sif 容器地址

构建沙盒容器

1
2
3
singularity build --sandbox 容器名 容器地址
singularity shell -w[--writeable] 容器名
singularity build 容器名.sif 容器本地地址/

通过Definition文件制作容器

文件名.def

1
singularity build 容器名.sif def文件名.def

运行容器

1
2
singularity exec 容器名.sif/simg bash -c "指令"
singularity shell 容器名.sif - 交互式运行

参考

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信