Docker

Docker


■容器工具:打包容器| Docker Desktop |

■容器应用:Linux | LNMP | PostgreSQL | VSCode |

■容器管理:Dockerfile | docker-compose | k8s介绍


遥感容器|■AI容器■数模容器:


常用命令
查看镜像:docker images
查看运行的容器:docker ps,查看所有容器(包括没有运行的容器):docker ps -a
启动容器:docker start [容器ID] (不需要输入完整的ID号,极端的只需要输入ID的第一个字符即可,只要ID不重复冲突
连接容器方法1:docker attach [容器ID] (同样不需要输入完整的ID号,exit退出容器的时候,该容器会自动关闭)
连接容器方法2:docker exec -it [容器ID] bash (同样不需要输入完整的ID号,exit退出容器的时候,该容器依然运行)

创建容器命令

docker run的参数

docker run是创建新的容器的命令:

docker run [OPTIONS] IMAGE [COMMADN] [ARG...]


例如:搭建conda深度学习环境,支持GPU加速:

docker run -i -t -v /home/disk1/guopu/:/home/guopu:rw --gpus all --shm-size 16G -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all continuumio/anaconda3  /bin/bash


-v:映射目录。同时可以设置权限,例如:rw,即可读可写;

--gpus all:支持GPU,默认是不使用GPU的。可以使用环境变量设置:
--gpus all  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all

--shm-size:设置内存。默认内存很小,训练模型不够用,可以人为增加内存;

其它参数说明:
-m :设置容器使用内存最大值;
-i:表示运行容器;-t:表示容器创建后进入其命令行。i和t两个参数,以交互模式运行容器,表示容器创建就能登陆进去,即分配一个伪终端;
-v:表示目录映射关系,前面放宿主机目录,后面是容器目录,表示挂载宿主机目录到容器中。可以使用多个-v做多个目录或文件映射,最好是在宿主机做修改然后共享到容器中:-v /home/byp:/home/byp。为了时容器时间与宿主机同步,避免算法训练中断、文件时间错误等问题,加上:-v /etc/localtime:/etc/localtime:ro
-w:表示指定容器的工作目录:-w /home/byp
-d:表示创建一个守护式容器在后台运行,并返回容器ID。如果只加it两个参数创建容器后就直接进入;
-p:表示端口映射,前面是宿主机端口,后面放容器内的映射端口,可以使用多个-p端口映射:-p 8080:8080;
-e:表示设置环境变量;
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-h "mars": 指定容器的hostname;
--gpus all:表示使用GPU(docker19.03及以上版本,安装nvdia -container-toolkit);
--name:表示为创建容器命名:--name="nginx-lb"
--ipc=host:表示共享宿主机的内存,算法训练时为了避免镜像默认内存较小,最好加上该参数;
--net:表示指定容器的网络连接类型,支持bridge/host/none/container四种类型:--net="bridge"
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--env-file=[]: 从指定文件读入环境变量;
--entrypoint:表示自启动命令:--entrypoint /bin/bash
--volume , -v: 绑定一个卷;


例如:创建一个数据库容器:

docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hqx -v /root/docker/mariadb/data:/var/lib/mysql -d mariadb
docker run -itd -p 8080:80 -e TZ=Asia/Shanghai --restart=always --privileged=true -v /share/users_root/byp:/home/wwwroot/byp -v /share/users_root/byp:/home/wwwroot/byp --name centos centos:7

几个常用环境变量:

TZ=Asia/Shanghai :设置时区;
--restart=always :重启docker时,自动启动相关容器;
--privileged=true:使用该参数,容器内的root拥有真正的root权限;

例如:创建conda环境

docker run -itd --name MiniConda_byp -e TZ=Asia/Shanghai --restart=always --privileged=true -v /share/users_root/hqx_bai/byp/web/systems/Docker:/home/byp continuumio/miniconda3:latest


docker-io, docker-ce, docker-ee


docker-ce 是 docker 官方维护的
docker.io 是 Debian 团队维护的


docker.io 采用 apt 的方式管理依赖
docker-ce 用 go 的方式管理依赖,会自己管理所有的依赖。


docker-io, docker-engin 是以前早期的版本,版本号是 1.*,默认centos7 安装的是docker-io,最新版是 1.13。
docker-ce 是社区版本,适用于刚刚开始docker 和开发基于docker研发的应用开发者或者小型团队。Ubuntu默认安装的是docker-ce,以下是官方描述:
Docker Community Edition (CE) is ideal for developers and small teams looking to get started with Docker and experimenting with container-based apps. Docker CE has three types of update channels, stable, test, and nightly:

Stable gives you latest releases for general availability.
Test gives pre-releases that are ready for testing before general availability.
Nightly gives you latest builds of work in progress for the next major release.
For more information about Docker CE, see Docker Community Edition.
docker-ee 是docker的企业版,适用于企业级开发,同样也适用于开发、分发和运行商务级别的应用的IT 团队。

Docker版本现在基于YY.MM
使用基于月份的发行版本,17.03 的第一版就指向17.03.0,如果有bug/安全修复需要发布,那么将会指向17.03.1等等。
"Edge"与"Stable"两个版本发行
Edge版本每月发布,提供一个月支持。
Stable版本每季度发布,提供4个月支持。
你可以通过Docker EE订阅 延长Stable版本支持以及补丁修复。


■ 添加用户(user1)到dockers用户组

sudo usermod -aG docker user1或sudo gpasswd -a user1 docker

■ 重启docker

sudo service docker restart

■ 打包容器为镜像问题

如果直接使用docker commit将容器打包为镜像,即使没有任何变化,容量也会增加,而使用dockerfile打包镜像,不会出现容量增加现象。

■ 镜像加速器

阿里云镜像加速器:https://cr.console.aliyun.com

删除指定容器和镜像
docker rm -f(可以是容器ID,也可以是容器的NAME)
docker image rm 或者用缩写:docker rmi

删除容器前,最好先关闭容器,否则不能删除。可以用命令kill强行关闭容器:
docker kill ccb2149d8fa1
然后再删除容器:
docker rm ccb2149d8fa1
也可以加参数-f强制删除正在运行的容器:
docker rm -f ccb2149d8fa1

打包一个镜像
docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

打包一个容器

docker export b1c4277f3170>centos7_byp.tar (使用容器ID)
docker export mariadb>mariadb_byp.tar  (使用容器NAME)



导入容器的时候会提示:

C:Program FilesDockerDocker>docker run -itd --name dbb mariadb_surface_byp:v1

docker: Error response from daemon: No command specified.
See 'docker run --help'.
需要进入原来的,输入命令:


docker ps  --no-trunc

CONTAINER ID    IMAGE     COMMAND          CREATED             STATUS              PORTS                    NAMES
4a110623...   mariadb                    "docker-entrypoint.sh mariadbd"    8 days ago          Up 8 days           0.0.0.0:3306->3306/tcp   mariadb


docker run --name mariadb_s -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hqx  -d mariadb_surface_byp:v1 docker-entrypoint.sh mariadbd



Docker Desktop

Docker桌面版就是在windows系统使用docker的可视化docker管理系统。安装后,就可以在windows中,使用软件提供的窗口查看管理docker(容器、镜像),也可以在命令行模式下手动输入docker的命令管理docker(但是要打开桌面版,并且出现下图的绿色条幅才行,不然提示出错)。

不打开Docker Desktop并且正常运行(左下角绿色),会出现以下错误提示:

error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.



docker export docker save

docker export 保存的是容器(container),docker save 保存的是镜像(image)。docker export 比 docker save 保存的包要小,原因是 save 保存的是一个分层的文件系统,export 导出的只是一层文件系统。

docker export 导出的镜像是不带镜像构建历史的(不同于客户端操作记录[history],客户端操作记录不会自动删除)如果原本的镜像有 3 层,export 之后会有 4 层,最后一层为镜像运行到 export 之间对文件系统的操作,不会显示在构建历史中。

1、导出容器:

docker export -o xxx.tar 容器ID/容器Name
docker export 容器ID/容器Name > xxx.tar
参数-o,表示导出到文件

例如以下命令效果一样:

docker export -o db02.tar mariadb
docker export mariadb >db01.tar

2、导出镜像:

docker save -o xxx.tar ${imageID/imageName}:tag

例如:docker save -o db_image01.tar docker.io/mariadb:latest

save保存的镜像明显比export保存的容器体量要小:

docker importdocker load

docker import、load 载入的时候,两者都会恢复为镜像。docker import 可以对镜像指定新名称及版本号,docker load 无法对镜像重命名。

导入容器快照到本地镜像库(docker import 或 docker image import)
docker import xxx.tar imageName:tag

导入镜像(docker load 或 docker image load):

docker load -i xxx.tar 或
docker load < xxx.tar

docker commit

把容器快照直接生成镜像(docker commit 或 docker container commit)
docker commit ${容器 ID/容器 Name} imageName:tag
选项说明:
-a :  提交的镜像作者;
-m : 提交时的说明文字;
-p :  在commit时,将容器暂停;
使用场景:容器系统配置和安装常用软件后,制作为基础镜像。像是 docker export 和 docker import 命令的复合体。
例如:docker commit mariadb db_commit01:v01

查看镜像:

将commit的镜像导出:
docker save -o db_commit_image.tar db_commit01:v01

可见其大小是与其它方式导出的容量不同:


以下操作是将保存的容器下载导入windows电脑:

一、导入export的镜像

1、先将刚才保存的容器下载到电脑目录;

2、启动Docker Desktop。如果不启动,会出现报错:

error during connect: This error may indicate that the docker daemon is not running......

3、导入成镜像

docker import db02.tar db02:v02

如果没有输入镜像的tag和命令都会出错(见下图)

docker: Error response from daemon: No command specified. 这个提示需要回到服务器找回command!使用命令:
docker run --name con_db02 -e MYSQL_ROOT_PASSWORD=hqx -d db02:v02 docker-entrypoint.sh mariadbd

虽然生成了容器,不过进去后,发现其实数据库并不存在!

二、导入commit的镜像

同样使用命令:

1、使用import导入

docker import db_commit_image.tar db_commit:v02

从上图可见,该镜像的大小也不同。

如果使用:

docker run --name con_db_commit -e MYSQL_ROOT_PASSWORD=hqx -d db_commit:v02

依然会报错:No command specified.

因此,还是需要加上command:

docker run --name con_db_commit -e MYSQL_ROOT_PASSWORD=hqx -d db_commit:v02 docker-entrypoint.sh mariadbd

但是报错:unable to start container process: exec: "docker-entrypoint.sh": executable file not found in $PATH: unknown.

2、使用load导入

docker load -i db_commit_image.tar

如果使用:

docker run --name con_db_commit_load -e MYSQL_ROOT_PASSWORD=hqx -d db_commit01:v01

注意没有使用command,反而不报错,但是导入数据库还是失败的:

加上command依然无效:

docker commit 后镜像没有数据的问题

同事TZF(20230224)从百度知道找到了处理方法:

按照这个介绍,进入mariadb的容器内,1、新建工作目录;2、复制cp文件进去;3、修改配置文件:使用vim增加了一个工作目录的设置(原配置文件里面是没有的,见下图);4、退出容器,我没有重启。

1、使用commit导出出错

使用commit保存容器成镜像:docker commit mariadb db_commit02:v02

使用命令将镜像保存为压缩文件:

docker save -o db_commit_image02.tar db_commit02:v02

从上面的镜像、压缩文件的大小来看,比之前那些没有改数据库工作文件之前的都要大!

然后将压缩包下载到本地电脑,启动docker desktop,进入命令行模式,使用命令导入镜像;
docker import db_commit_image02.tar db03:v03

接着使用docker run的时候就会出错:

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "docker-entrypoint.sh": executable file not found in $PATH: unknown.

我还分别用了import和load两种方式导入,均提示同样的错误!

docker import db_commit_image02.tar db03:v03
docker run --name con_db03 -e MYSQL_ROOT_PASSWORD=hqx -d db03:v03 docker-entrypoint.sh mariadbd

docker load -i db_commit_image02.tar
docker run --name con_db_commit_image02_load -e MYSQL_ROOT_PASSWORD=hqx -d db03:v03 docker-entrypoint.sh mariadbd

2、使用export导出容器,成功

docker export -o db04.tar mariadb

然后下载到本地电脑,

docker import db04.tar db04:v04
docker run --name con_db_04 -e MYSQL_ROOT_PASSWORD=hqx -d db04:v04 docker-entrypoint.sh mariadbd
成功!



在byp阿里云上

root@BaiYiPing:/home/BypSoftware# uname -a
Linux BaiYiPing 4.4.0-154-generic #181-Ubuntu SMP Tue Jun 25 05:30:11 UTC 2019 i686 i686 i686 GNU/Linux

由于我的空间没有安装docker,需要安装:apt install docker.io

不过没有安装成功,系统提醒要:apt-get update

于是升级后,成功安装docker!

更新apt-get

不过同样是导入容器失败

使用刚才export出来的文件,然后上传到阿里云服务器,同样使用命令:

docker import db04.tar db04:v04
docker run --name con_db_04 -e MYSQL_ROOT_PASSWORD=hqx -d db04:v04 docker-entrypoint.sh mariadbd
虽然没有报错,但是容器其实没有启动!




Docker in HQX HPC


20230514|


Docker仓库(Repository)

Docker官方的仓库: 服务器在国外,所以下载速度较慢;
道客网络Daocloud仓库: 感觉资源不太多;
网易云镜像中心|阿里云:还可以,阿里云需要注册自己的个人账号获取独立链接;
微软云|腾讯云:已经生效;
中科大docker已经失效,但是镜像还在。
测试docker连接速度的项目(GitCode|docker_mirror.py


Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
Docker容器数据卷,容器和宿主机实现数据共享
40 张图 详解 Docker 容器监控
Docker监控的三种方式
Docker 容器监控
Docker安全入门与实战
三种docker可视化工具(全网最详细)
将容器打包成镜像、镜像分层机制详解
docker打包容器、载入容器、启动容器
docker的版本,你真的搞清楚了吗
Docker中选择CentOS还是Ubuntu/Debian?



BypInformation