基本使用
关于镜像
查看现有镜像
输入docker image ls
或者docker images
查看本机现有镜像(这是本地已经有的)。
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
查看镜像信息
有些镜像的tag看起来信息也不是那么完整,所以还是能看到详细信息最好
docker inspect IMAGE_ID
# IMAGE_ID就是镜像列表中先是的镜像ID
# 例如:
docker inspect a6464e11be90
docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定,例如,获取镜像的Architecture信息:
$ sudo docker inspect -f {
{
".Architecture"}} 550
amd64
在指定镜像ID的时候,通常使用该ID的前若干个字符组成的可区分字串(上面的550
)来替代完整的 ID。
注意:这里的语法就是两对大括号,然后json每一项字段的key,需要加一个.
;来进行使用,比如:
sudo docker inspect -f {
{
".Config"}} 550
# 查看配置
搜索镜像
docker search yolov5
所以之前这个服务器上有的镜像其实也是下载的公共镜像。
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
关于这个自动构建,参考Docker自动化构建Automated Build实现过程图解
大意就是构建镜像的dockfile在github上的内容发生改变,这个镜像也会自动跟着改变,随时保持一致。
下载新的镜像
docker pull XXX(这个xxx就是NAME代表的某个内容)
运行镜像
docker run httpd(如果这个名称不明确,可以直接使用IMAGE ID,只要名字可以区分开,一般前五个字母就可以)
# 如果要进行交互式操作,在镜像里开一个bash
docker run -t -i ubuntu:15.10 /bin/bash
# 或者直接这样写 也可以
docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
以下图为例,实际在运行镜像时,也可以简单的
docker run -it a64
docker run -it a64 /bin/bash
# 这两个作用是一样的
然后就会进入到docker中的bash了
如果想要退出镜像,直接输入exit
就可以了
关于容器
容器和镜像最简单的命令区分就是:镜像的命令里基本都会带有IMAGE_ID,容器的没有
启动已经停止的镜像
docker ps -a
# 这个命令就是显示容器(容器=镜像+读写)
# 所以这里显示的每个容器ID一定会对应一个镜像ID(用前四位数表征的)
docker ps -a --no-trunc
# 显示完整输出,主要想看看 command这一列的内容
可以看出来,容器ID很长,调用的command也有很多。
命令的详细说明参考:菜鸟教程-Docker ps 命令
另外,这里的Up 3 weeks
意思就是持续运行了3周。
然后可以使用start
来运行已经停止的容器:
docker start b750bbbcfd88
> 运行上面的命令之后,会返回和start后面一样的容器ID,而不是直接进入容器/镜像中。
使用容器
在容器中进行操作的实现方式
问过了同事,同事说:通过镜像生成容器,所有的操作都是在容器中进行,尽量保证容器一直在后台运行状态(结合网上看到的说法:容器是出掉基础功能的linux系统,大概就明白了是什么意思)
参考:
重点是在pull了对应的镜像之后,如何创建容器,运行容器,
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
docker run 命令先是利用镜像创建了一个容器,然后运行这个容器。
有两个示例:
runoob@runoob:~/python$ docker run
-v $PWD/myapp:/usr/src/myapp
-w /usr/src/myapp
python:3.5 python helloworld.py
对上面这个命令的解释:
- -v $PWD/myapp:/usr/src/myapp: 将主机中当前目录下的 myapp 挂载到容器的 /usr/src/myapp。(实现本机和容器文件夹的一个对应,这样在容器中就可以访问主机的文件夹,重点是能让你找到)
- -w /usr/src/myapp: 指定容器的 /usr/src/myapp 目录为工作目录。
- python helloworld.py: 使用容器的 python 命令来执行工作目录中的 helloworld.py 文件。
docker run -it
-d
--gpus '"device=0"'
--ipc=host
-p 10008:22
-v /ws/xxx:/ws
--name "Order-Excution"
ultralytics/yolov5:latest # 镜像名称
bash -c "/etc/rc.local; /bin/bash" # 在容器内执行/bin/bash命令
- -d,docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec,使用这个指令,退出容器终端,不会导致容器的停止
- –gpus,运行指定GPU,参考:[docker]运行指定 GPU
- –ipc,这个参数是用来进行容器间通信的配置的。可以参考:docker容器间的IPC通信
- -p 10008:22 会分配宿主机的端口映射到虚拟机(进行这个映射是为了方便从外部访问docker容器,而不是只能通过在本地run来访问)。参考:外部访问docker容器(docker run -p/-P 指令)
docker指令: docker run -p ip:hostPort:containerPort redis
使用-p参数 会分配宿主机的端口映射到虚拟机。
IP表示主机的IP地址。(很多时候都不写ip这一项)
hostPort表示宿主机的端口。 (上面的10008)
containerPort表示虚拟机的端口。(上面的22)
也就是说访问被本地主机的10008端口就相当于访问虚拟机的22端口(本地主机的端口一般可以随便指定)最常见的就是:将本地主机的 49155 映射到容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面,访问本地49155就等于访问容器的5000
- –name:例如
--name="nginx-lb"
:为容器指定一个名称; - bash -c:通常使用shell去运行脚本,两种方法 bash xxx.sh,另外一种就是bash -c “cmd string”
docker run -it -d --gpus '"device=3"' --ipc=host -p 10035:22 -v
/ws/huangshan:/ws --name "OCR" ultralytics/yolov5:latest
bash -c "/etc/rc.local; /bin/bash"
建议创建一个.sh脚本,把这个命令写到脚本里,这样每次想用的话就去运行,会方便很多。
进阶:
镜像优化
参考:Docker镜像优化:如何从1.16GB优化到22.4MB
容器和镜像的区别
参考文章(其实是一篇,转来转去的,为了防止图片失效):
重点的一些内容:
容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。
另开了一个博客做记录。
参考
- 五分钟快速入门Docker
- (大牛分享建议收藏)PyCharm使用Docker镜像搭建Python开发环境:这个的意思就是配置pycharm可以直接连接服务器编程。
- 菜鸟教程:Docker教程