您的位置:首页 > 运维架构 > Docker

Docker学习(一):Ubuntu下Docker的一些基本指令和注意事项

2017-03-06 10:16 615 查看
转载自:http://blog.csdn.net/tina_ttl

最近发现极客学院docker教程,还不错,可以参考

1.Dockerhub下载镜像

注:Dockerhub地址

有两种方式可以获得新的镜像
直接从dockerhub下载编译好的image(该编译过程在docker hub的云端完成)(见3.1)
下载docekrfile文件,在本机进行build


直接在dockerhub上pull pre-built image

在terminal中输入如下命令:

sudo Docker pull
tingtinglu/docker


注: 

① tingtinglu/docker是dockerhub上的pre-built image的名字 

② 如何获取pre-built image的名字?需要在dockerhub上搜索自己需要的image


下载dockerfile文件,在本机进行build

详细介绍见docker的官方文档:build your own image,介绍来如何利用dockerfile编译自己的镜像

(1)获取dockerfile(即下载名称为dockerfile的文件,内容为构造docker的一些命令)

(2)利用terminal的cd命令进入到dockerfile所在的文件夹

(3)在名称为“dockerfile”的文件所在的文件夹下(即terminal cd到该文件夹),执行如下命令
docker build -t ImageName .
1
1

注1:ImageName是利用dockerfile生成的image的name(自行设置) 

注2:不要忘记ImageName后面的点“.”


利用Dockerfile文件对已存在的image做某些更改

有时候,已经得到了一个image,但需要往该image中做新的更改,例如,想要在docker的opt路径下添加一个新的路径workspace,此时,可以通过dockerfile进行,方法如下:

① 新建一个dockerfile,添加如下内容
RUN mkdir /opt/workspace
1
1

② 利用terminal进入该dockerfile所在路径,然后,built该dockerfile,即执行如下命令:
docker build -t ImageNameOld
1
1

一定要注意,这里的ImageNameOld是你想要添加该变化的那个image的名字

2.利用下载的镜像生成容器

在命令行中输入类似如下的命令:
sudo docker run -it --rm -p 8888:8888 -v `pwd`/workspace:/opt/workspace-v `pwd`/data:/root/data tingtinglu/deepdock
1
1

下面对该条命令进行剖析

(1)
-p 8888:8888
 

将docker中的jupyter的8888接口与本机的8888接口关联

(2)
-v `pwd`/workspace:/opt/workspace
 

将当前路径下(由`pwd`)的workspaace文件夹映射到docker中的opt路径下的的workspace文件夹,这样,docker下的opt/workspace就指向来本机的`pwd`/workspace文件夹;

要实现该目的,还有一个办法:利用terminel进入到本机的workspace路径下,然后: 
-v ¨$(pwd):/opt/workspace¨


具体的图示如下:



此时,再进入docker后,docker的/opt/workspace/中的内容就变为的本机的workspace中的内容; 

可以认为,无论原来docker的/opt/workspace中是否由内容,现在该workspace的内容都被本机的workspace覆盖来,即docker的opt/workspace此时不再指向daocker中的opt/workspace,而只是指向本机的workspace文件夹

(3)有时,docker可能不能上网,那么,可以加入
--net=host
,即完整的命令如下:
sudo docker run -it --rm -p 8888:8888 --net=host -v `pwd`/workspace:/opt/workspace-v `pwd`/data:/root/data tingtinglu/deepdock
1
2
1
2

(4)如果是windows系统,那么,文件夹映射需要绝对路径 

即需要如下命令:
sudo docker run -it --rm -p 8888:8888 --net=host -v `pwd`/workspace:/root/opt/workspace -v `pwd`/data:/root/data tingtinglu/deepdock
1
2
1
2

并且,windows目前只支持C盘!一定要注意!

注:docker的指令模式是:标示+参数,即:[sudo] docker [flags] [command] [arguments] 

eg.: docker run -i -t ubuntu /bin/bash


3.查看本机的docker images

sudo docker images
1
1

会得到本机的所有images的信息



第一列是docker image的名称
第二列是该image的tag(同一个image有时需要进行多次更改,为了区分不同版本image的区别,为image赋予了一个tag)
第三列是docker image的ID
第四列是该docekr image的创建时间
第五列是该docker image的大小


4. 查看正在运行的container

sudo docker ps
1
1

显示的信息如下:
Container IdIMAGEcommandCreatedstatusportsnames
container的ID生成该container的image的名称 生成该container的时间该container的状态 ContainerName(自动分配)


5. 以bash模式进入正在运行的docker

sudo docker exec -it containerName bash
1
1

图例: 



(1)
ls
 

列出docker Container下的文件夹 



可以看到,在container的ls文件夹下,有两个文件夹,分别为caffe和workspace

(2) 
cd..
 

返回到当前文件夹opt的上一级文件夹 

并且列出该文件夹下的所有文件
ls
 



可以看到该container的所有文件夹

(3)这里应该注意:
由于前面的命令:
-v `pwd`/workspace:/opt/workspace
1
1

使得本机的当前路径`pwd`下(`pwd`为生成docker container时所在的路径)下的workspace文件夹与docker container中的opt文件夹下的workspace发生映射关系 



由于前面的命令:
-v `pwd`/data:/root/data
1
1

使得本机的当前路径`pwd`下的data文件夹与docker container中的root文件夹下的data发生映射关系 



6. 将一个容器保存为image

如果对docker的做了一些更改,并且,这些更改不是安装了jupyter这样的软件,而只是安装了一些package,那么,保存新的镜像只需要:
sudo docker commit containerID newImageName
1
1

containerID为要保存的容器的ID,newImageName为新image的名字 

例如:ting/caffe:version1这样的名字,其中,version1为新容器的flag,可以用来标识新image的版本信息


7. 从已经创建的容器中更新镜像,并且提交这个镜像

在容器中进行相应的更改 

例如:apt-get install wget
将容器保存为新的镜像 

sudo docker commit containerID newImageName:tag

8. 删除/停止等命令

从主机中移除镜像 
sudo docker rmi 镜像名称


停止正在运行的container 
sudo docker stop containerName


移除某个container 
sudo docker rm containerID


注:输入ID时,不必须输入完整的ID,一般输入前几个字符便可以识别出

各种错误记录

Error response from daemon: conflict: unable to delete 40787553f761 (must be forced) - image is being used by stopped container 8a1faaf9d24b

该问题的原因是:由image-40787553f761生成的container(ID:8a1faaf9d24b)仍旧存在
但利用sudo docker ps,却无法显示container-8a1faaf9d24b,因为该container-8a1faaf9d24b虽然没有在运行,但它仍然存在,所以必须将其移除
解决办法:利用
docker rm <containerid>
8a1faaf9d24b
将该container移除

Cannot connect to the Docker daemon. Is the docker daemon running on 

this host?

需要用到sudo

其他注意事项

1.最近发现,自己本机的镜像有许多是none,经过查询发现原因可能是:

重复pull同一个tag的镜像,并且,在pull新的镜像时(与本机已有的旧镜像具有相同的tag),旧镜像已经被容器占用,那么,在pull新镜像后,之前被占用的旧镜像就会变为none

2.在本机书写dockerfile,该dockerfile用到了本机的镜像A(From A),利用该dockerfile build 镜像B,那么,镜像B被称为镜像A的child




0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: