赞
踩
Docker服务的启动和关闭指令:
#启动
sudo systemctl start docker
#守护进程重启,Daemon是Docker的守护进程,
#Docker Client通过命令行与Docker Damon通信,完成Docker相关操作
sudo systemctl daemon-reload
#重启docker服务
sudo systemctl restart docker
sudo service docker restart
#关闭docker服务
sudp systemctl stop docker
sudo service docker stop
Docker镜像库:(Docker hub).
Docker拉取镜像有两种方式:
docker pull 镜像名
利用Dockerfile创建镜像
上面两种方式都可以创建镜像,但是利用Dockerfile创建镜像有一个好处,Dockerfile在创建镜像的同时,可以添加一些依赖包。
指令格式:
docker pull 镜像名
如,拉取一个conda镜像
docker pull conda/concourse-rsync-resource
用Dockerfile创建docker需要准备以下三个文件
#FROM(指定基础image),有两种格式, FROM <image> or FROM <image>:<tag> FROM python:3.7.10-slim-stretch #MAINTAINER(用来指定镜像创建者信息,可省略) #构建指令,用于将image的制作者相关的信息写入到image中 #当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息 MAINTAINER <name> #WORKDIR(镜像里设置工作目录,即进入容器时,所处路径) WORKDIR /mydir #COPY(将当前目录下的文件拷贝到容器指定目录) COPY . /mydir #RUN(安装任何需要的安装包,软件包列表可以写在requirements.txt中) RUN pip install --trusted-host pypi.python.org -r ./requirements.txt RUN apt update #RUN后面按照指令的正常使用方法操作,需要-y表示确定 RUN apt install libgl1-mesa-glx -y #EXPOSE(指定容器需要映射到宿主机器的端口) #Make port 80 available to the world outside this container EXPOSE 80 #CMD(设置容器启东时执行操作,注意:指令只能在文件中存在一次,如果有多个,则只执行最后一条) CMD ["python", "./demo.py"] CMD python ./demo.py
-f
指定目录;.
,代表当前路径;-t
,对镜像命名,格式为 <image>:<tag>
;如下面代码块中,创建好的镜像名为python3:Test
# docker build
docker build -t python3:Test -f Dockerfile .
Docker镜像创建好之后,可以通过如下指令查看/删除镜像,及查看镜像详细信息
#查看镜像
docker images
#删除镜像
docker rmi <镜像名>
docker rmi <镜像ID>
#通过 docker inspect 命令,可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等
docker inspect python3:Test
docker run -v $PWD:/mydir --net=host --privileged=true --shm-size=64G --name MyContainer --gpus all -it python3:Test bash
#指令的顺序很重要
其中,
-v
:进行目录映射,$PWD表示本机当前目录(linux下使用,Windows下使用绝对路径),mydir表示容器中需要映射的目录,若没有,则在映射过程中创建。可以使用多个-v
进行目录映射。
--net
:使用--net=host
这句话后,就不需要对容器进行端口映射了;另外,加了net=host后会使得创建的容器进入命令行好名称显示为主机的名称而不是一串id.,比如显示root@my:/#而不是root@3b8e647e5f79:/#;若不加的话,容器端口映射指令为-p -p 8088:80
,选择宿主机具体的8088端口映射到容器内部的80端口上了
--privileged
:使用该参数,container内的root拥有真正的root权限;否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备
--name
:容器命名
--gpus
:使用gpu
-it
:交互式容器,退出容器后,容器自动关闭。t:分配一个伪终端;-id
,与之对应,守护式容器,退出容器后容器不会自动关闭
--shm-size
:这个很重要,是容器的共享内存;容器的默认shm-size为64m,远远不够;可以通过df -h | grep shm
查看共享内存大小。若是在创建容器是未指定共享内存大小,参考shm-size修改方法
容器创建成功后,可执行如下操作
#查看正在运行的容器 docker ps #查看所有容器 docker ps -a #启动容器 docker start <容器名> docker start <容器ID> #停止容器 docker stop <容器名> docker stop <容器ID> #删除容器,注意删除容器前,需要将容器停止 docker rm <容器名> docker rm <容器ID> #进入容器 docker exec -it <容器名> bash #退出容器,下面这个退出容器后,将容器关闭 exit ctrl+p+q #查看容器信息 docker inspect <容器名> docker inspect <容器ID> #由宿主机向容器复制文件,其中d:\Shanghai为宿主机文件路径, #<YOUR_COINTAINER_NAME>:/usr/share/zoneinfo/Asia/Shanghai为容器文件保存路径 docker cp d:\Shanghai <YOUR_COINTAINER_NAME>:/usr/share/zoneinfo/Asia/Shanghai
容器的导入与导出一共有两种放回,export/import可以将容器导出程镜像,但是只保存容器中的文件系统,以及容器里包含的文件;而save/load将镜像导出为镜像,能够保存操作系统,但是容器中创建的文件未保存;在某些情况下,如服务器不能联网,需要在本地构建好基础镜像不会包含程序运行的所有依赖,而通过Dockerfile构建镜像时,有些依赖安装速度会很缓慢(比如,需要conda安装的一些包),因此,这个时候可以通过commit指令来重构建镜像。具体可参考:docker:export/save/commit谁才是你心中那个她
上面export/import(save/load)实现了容器(镜像)的打包与传输,而commit实现了容器到镜像的转换
具体可以参考:docker容器的迁移
#导出容器为镜像,使用 docker export 命令根据容器 ID 将镜像导出成一个文件
docker export f299f501774c > hangger_server.tar
#导入镜像
docker import - new_hangger_server < hangger_server.tar
#-o代表输出到文件
docker save -o images.tar postgres:9.6 mongo:3.4
#打包之后的images.tar包含postgres:9.6和mongo:3.4这两个镜像
docker load < images.tar#(<表示stdin可以用-i代表)
#docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit 39eaa5aa7332 python3.6.4-dev
生成的镜像文件太大,传输不方便,可以通过拆分文件解决:
linux下
#拆分文件,
cat filename | split -b 3G - filename
#合并文件命令
cat small_files* > large_file
cat Safety_Helmet_Detection.tar | split -b 2G - Safety_Helmet_Detection.tar#(拆分)
cat Safety_Helmet_Detection.tar.a* > Safety_Helmet_Detection.tar#(合并)
cat Safety_Helmet_Detection.tar.a*|tar xzv #(直接解压多个命令)
Windows下
#1.打开cmd,进入sz下载拆分文件所在目录。
#2
copy /B filename.zip.001 + filename.zip.002 + filename.zip.003 newFileName.zip
#3.注:注意/B,/B 指二进制文件,不产生终止符
第一次连接镜像库时,需要在本机配置hosts
及daemon.json
hosts
Windows/System32/drivers/etc
中etc
中hosts
里添加:daemon.json
{
"registry-mirrors":[
"https://docker.hub.com"
]
}
登录指令如下:
[root@123]docker login https://docker.hub.com
Username:dockerhub
Password:
Login Succeeded
#打包镜像
#docker tag source_image new_image:tag
docker tag my_test:process process:v1.0
#上传镜像
#docker push harboraddress/project/new_image:tag
docker push https://docker.hub.com/test/process:v1.0
#下载镜像
#docker pull harboraddress/project/new_image:tag
docker push https://docker.hub.com/test/process:v1.0
容器默认的shm-size大小为64M,跑深度学习算法这个大小远远不够,会报如下错误:
RuntimeError: DataLoader worker (pid XXX) is killed by signal: Bus error
百度发现,是因为容器的共享内存太小。在不重新创建容器的情况下,修改容器的共享内存方法如下:
1B(字节) = 8b (8个位) 1KB = 1024B 1MB = 1024KB 1GB = 1024MB
a.使用docker ps -a命令找到要修改容器的CONTAINER ID
b.运行docker inspect <CONTAINER ID> | grep Id 命令,找到容器所在目录
c.执行cd /var/lib/docker/containers命令,找到与Id相同的目录,找到其中的hostconfig.json文件
d.进入对应Id所在目录后,修改hostconfig.json中,ShmSize大小
具体可参考:RuntimeError: DataLoader worker (pid XXX) is killed by signal: Bus error 两种解决方案
#查看容器中的时间
date
#Windows下
GET-DATE
需要从另一台电脑中拷贝与Docker系统匹配的时区文件,放入Docker容器中,并将设置软连接起来。
#容器中没有对应时区的文件夹,可以根据拷贝路径,自行创建
mkdir -p /usr/share/zoneinfo/Asia
#由宿主机复制到容器中
docker cp d:\Shanghai <YOUR_COINTAINER_NAME>:/usr/share/zoneinfo/Asia/Shanghai
#建立软连接
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
具体可参考:Docker修改容器中的时间
容器创建时一般会添加目录映射,然而,做项目的时候,发现添加的目录映射不够用,因此需要在添加目录映射,步骤如下:
a.使用docker ps -a命令找到要修改容器的CONTAINER ID
b.运行docker inspect <CONTAINER ID> | grep Id 命令,找到容器所在目录
c.执行cd /var/lib/docker/containers命令,找到与Id相同的目录,找到其中的hostconfig.json文件
d.进入对应Id所在目录后,修改hostconfig.json中,修改"Binds":{"/宿主机目录:/容器目录}
e.修改config.v2.json,添加MountPoints,格式如下: "MountPoints":{ "/容器目录":{ "Source":"/宿主机目录", "Destination":"/容器目录", "RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate", "Spec":{"Type":"bind", "Source":"/宿主机目录","Target":"/容器目录"},"SkipMountpointCreation":false}}}
具体可参考:docker给已经启动容器添加挂载目录
这里放的是,可能遇到过的问题,但已经忘记了,还有一些是给了很大启发的链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。