docker 在打包环境方面可以说的上是很nice的一个工具了,而且现在很多大公司在训练深度学习模型方面都容器化了,所以记住docker的常用命令还是挺必要了,好记性不如烂笔头,走起。
Docker简介
docker 的生命周期分为三个阶段,docker file,docker image,docker container(ps 我觉得这张图可以又叫集装箱是怎么练成的)如下:
docker file:是一个文本文件,其内包含了一条条的指令(instruction),每条指令构建一层,因此每一条指令的内容就是描述该层应该如何构建。
docker image(镜像):是一个特殊的文件系统,提供容器运行时所需的程序,库,资源,配置等文件,它中间不包含任何动态数据,其内容是不可变的。
docker container(容器) 于 images来说,关系就像是实例和类,镜像是静态的定义,容器是镜像运行时的实体,在容器这层我们可以做很多操作。
file篇
下图便是一个docker file的构成,我们可以把file想象成一个千层饼,每一个指令都会建立一层,所以在写指令的时候一定要写的简洁。
将file build成一个image
docker build --tag <name> . # 注意:. 代表的是当前目录下的docker file文件
image篇
一般image_name 由两部分组成,[REPOSITORY[:TAG]]
,如linux/ubuntu:v1
。
$ docker images #查看镜像列表
$ docker pull [remote_image_name] #拉取远程镜像
$ docker search [image_name] #搜索镜像
$ docker save -o [save_name.tar] [image_name] #导出镜像
$ docker load < [export_image_file] #载入镜像
$ docker import [export_image_file] [image_name] #导入快照
$ docker rmi [image_name] #删除镜像
$ docker history [image_name] #查看镜像的历史命令
使用image创建container
docker run -dit -v [host dir]:[container dir] -p [host port]:[container port] --name [container_name] [image_id] /bin/bash #这个一般就是docker run的复杂形态了,包括了数据卷挂载和端口映射,以后台模式运行
container篇
$ docker ps (-a) #查看容器列表,加上-a参数就显示所有状态下的容器,不加只显示运行中的容器
$ docker stop [container_name] #停止容器
$ docker start [container_name] #开启容器
$ docker restart [container_name] #重启容器
$ docker rm [container_name] #删除容器
$ docker exec -it [container_name] /bin/bash #进入容器,退出后容器不会停止
$ docker attach [container_name] #进入容器,退出后导致容器停止
$ docker export -o [save_name.tar] [container_name] #导出容器快照,与save不同的是,快照只会保存容器当时的状态,所有元数据和历史记录会丢失
$ docker logs #查看容器日志
将container保存为镜像
docker commit -m '注释' [container_id] [image_name]
error篇
问题:
docker server gave HTTP response to HTTPS client
解决方法:
在/etc/docker下,创建daemon.json文件,写入:
{ "insecure-registries":["仓库地址"]}
问题:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方法:
$ systemctl daemon-reload
$ sudo service docker restart
$ sudo service docker status (should see active (running))
$ sudo docker run hello-world
问题:容器乱码
(太坑爹了,显示不了中文啊!这个一定要注意了!如果原始是镜像里面的就不支持中文。。。那还得下个语言包)
解决方法:
$ LANG=en_US.UTF-8
$ source /etc/profile
参考资料
- https://blog.youkuaiyun.com/qq_29303759/article/details/88135758
- https://www.runoob.com/docker/docker-tutorial.html