前言:公司开发中时常用到docker,简单进行整理和学习,方便自己查询。

一、Docker的概念

1. 基本认识

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

2. 重要概念

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

二、镜像使用

1. 加载镜像

如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像

docker pull ubuntu

2. 查找镜像

docker search httpd

3. 删除镜像

docker rmi hello-world

4. 创建镜像

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

创建容器,容器内使用

apt-get update

然后,输入exit退出容器

通过命令 docker commit 来提交容器副本

4.2 使用 Dockerfile 指令来创建一个新的镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

其中:

-t:指定要创建的目标镜像名

. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

docker build -t runoob/centos:6.7 .

例如,Dockerfile的内容如下(Docker Dockerfile | 菜鸟教程):

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

5. 提交镜像(从容器的ID提交为镜像)

各个参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

6. 设置镜像标签

使用 docker tag 命令,为镜像添加一个新的标签。

docker tag 860c279d2fec runoob/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

多余Tag的删除(由于多个Tag共享相同的id,所以不能直接用id删除),注意一定要指定tag

docker rmi -f <REPOSITORY:tag>

三、容器使用

1.  运行镜像创建容器

-i:交互式操作

-t:终端

-v:挂载到本地目录

-d:进入后台

/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

exit:退出终端

docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash

带内存和GPU设置启动GPU

sudo docker run --shm-size 16g --gpus all -it -v /home/gongyan6/car_docker:/workspace yolov5_car bash

2.  查看容器的运行

docker ps -a    # 查看所有容器
docker ps       # 查看运行的容器

3.  启动容器

docker start b750bbbcfd88

停止的容器可以通过 docker restart 重启:

docker restart <容器 ID>

4.  暂停容器

docker stop container_name

5. 删除容器

docker rm container_name

6. 进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入

docker attach:退出容器,容器停止

docker exec:退出容器,容器继续(推荐)

docker attach 1e560fca3906
docker exec -it 243c32535da7 /bin/bash

7. 导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

docker export 1e560fca3906 > ubuntu.tar

8. 导入容器

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

cat docker/ubuntu.tar | docker import - test/ubuntu:v1

此外,也可以通过指定 URL 或者某个目录来导入,例如:

docker import http://example.com/exampleimage.tgz example/imagerepo

注意:

1. 挂载本地路径

docker不挂载本地目录,stop后就会丢失数据,一定要挂载本地目录。

docker支持把一个宿主机上的目录挂载到镜像里。通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。

docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash