Docker
Docker
■容器工具:打包容器| Docker Desktop |
■容器应用:Linux | LNMP | PostgreSQL | VSCode |
■容器管理:Dockerfile | docker-compose | k8s介绍
■遥感容器|■AI容器■数模容器:
创建容器命令
docker run的参数
docker run是创建新的容器的命令:
docker run [OPTIONS] IMAGE [COMMADN] [ARG...]
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-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.
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桌面版就是在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 import与 docker 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
成功!
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仓库(Repository)
Docker官方的仓库: 服务器在国外,所以下载速度较慢;
道客网络Daocloud仓库: 感觉资源不太多;
网易云镜像中心|阿里云:还可以,阿里云需要注册自己的个人账号获取独立链接;
微软云|腾讯云:已经生效;
中科大docker已经失效,但是镜像还在。
测试docker连接速度的项目(GitCode|docker_mirror.py)