一、Docker基本概念
1.镜像(Image)
- Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。
- docker的镜像是由 镜像名+版本 组成的。如果没有指定镜像名没有指定版本,默认是latest版本最新版本。
复制代码 2.容器(Container)
- 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。
复制代码 3.仓库(Repository)
- 镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
复制代码 4.卷(volume)
- 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
复制代码 5.网络(network)
- 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
复制代码 6.docker-compose
- Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。目前 Docker 官方用 GO 语言 重写 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2
- Compose 中有两个重要的概念:
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
复制代码 二、Docker 常用命令
2.1镜像命令
- 下载镜像
- docker pull nginx //下载镜像
- docker pull nginx:v1.4.14
- 运行镜像
- docker run -it nginx //运行镜像
- docker run -it --rm ubuntu:18.04 bash // 运行镜像并进入shell 退出后删除镜像
- docker run --name webserver -d -p 80:80 nginx // 运行镜像,--name 给镜像取一个名字 -d 后台运行模式 -p 镜像端口映射
- 镜像帮助信息
- docker image --help // 获取镜像操作的命令帮助
- 搜索镜像
- docker search nginx // 搜索nginx镜像
- 查看镜像历史信息
- docker image history nginx // 查看镜像历史
- 查看镜像详细信息
- docker image inspect nginx //查看镜像详细信息
- 列出镜像
- docker images //列出镜像
- docker image ls //列出镜像
- docker image ls -a //docker image ls 命令列表中只显示顶层镜像。-a 参数可以显示包括中间层在内的所有镜像
- docker image ls nginx //根据仓库名列出镜像
- docker image ls nginx:v2 //根据某个特定标签列出镜像
- docker image ls -f since=mongo:3.2 //mongo:3.2 之后建立的镜像 before 之前
- docker image ls -f label=dev //列出标签是dev的镜像
- docker images -q -f reference='eshop/*:dev' // 根据名称和标签匹配并只显示id
- docker image ls --format "{{.ID}}: {{.Repository}}" // 模板语法
- 查看镜像、容器、数据卷大小
- docker system df //查看镜像、容器、数据卷所占的空间大小
- 删除镜像
- docker image rm centos:v7 // 按照标签tag删除镜像,也可以根据image id删除
- //删除镜像的前提是该镜像没有运行成容器;docker image rm 等同docker rmi命令;如果需要强行删除已经运行为容器的镜像,可以使用-f选项来指定;
- docker image rm af34 //根据ID删除镜像,一般取前3个字符或以上就可以了
- docker image rm $(docker image ls -q nginx) //过滤删除命令。删除所有仓库名为 nginx 的镜像
- docker image rm $(docker image ls -q -f before=nginx:v2)
- docker image rm $(docker images -q -f reference='eshop/*:dev') //-f
- docker image prune //删除虚悬镜像
- 给镜像打tag
- docker tag centos centos:v6.7 //给镜像打标签 tag
复制代码 2.2容器命令
- 新建并启动容器
- docker run ... //新建并启动容器命令
- docker run centos:v7 /bin/echo 'Hello World' //输出一个 'Hello World'之后终止容器
- docker run -t -i centos:v7 /bin/bash // 启动一个bash端,允许用户进行交互,-t 让Docker分配一个伪终端(pesudo-tty)并绑定到容器的标准输入上,-i 让容器的标准输入保持打开
- docker run -d centos:v7 /bin/sh -c "while true;do echo 11;sleep 1; done" //-d 在后台运行
- //提示:可以用 docker logs 查看输出的结果
- 查看容器本身的信息
- docker container ls // 查看容器信息
- docker container ls -a
- 查看容器日志信息
- docker container logs //获取容器的log输出信息
- docker container logs [container ID or NAMES]
- 查看容器层改变
- docker diff name
- 终止和启动容器
- docker container stop // 终止一个运行中的容器
- docker container ls -a // 可以查看容器终止的状态信息
- docker container start //启动一个已经终止的容器
- docker container restart // 将一个运行态的容器终止,然后重新启动
- 进入容器 docker attach 或 docker exec
- docker run -dit centos
- docker container ls
- docker attach a12f // a12f 容器ID的前4个字符
- docker exec -it 34af bash // -i 这个参数没有分配伪终端但是保持了标准输出,-t 分配一个伪终端
- exec与attach两者区别:attach 不会启动新的进程,用exit退出容器跟着停止。exec启动新的进程,exit退出容器不会停止。
- 导出容器
- docker export r1dfdere112122 > centos.tar //r1dfdere112122 容器ID
- 导入容器快照
- cat centos.tar | docker import - test/centos:v1.0 //本地导入
- docker import URL //通过指定的url导入
- 从容器内拷贝文件到主机上 (注:如果是在容器内,需要exit先切换到宿主机上)
- docker cp 容器id:容器内路径 目的主机路径 (例如:docker cp 123123:/data/test.txt /data id为123123的容器,将/data/test.txt文件拷贝到宿主机/data目录下)
- 删除容器
- docker container rm 删除一个处于终止状态的容器
- docker container rm centos
- //提示:如果要删除一个运行中的容器,需要添加参数 -f 参数。 这时,docker 会发送 SIGKILL 信号给容器。
- 清理所有终止状态的容器
- docker container ls -a // 查看所有已经创建包括终止状态的容器
- docker container prune // 清除所有的容器
复制代码 2.3 仓库命令
- 你可以使用官方 registry 镜像来运行
- docker run -d -p 5000:5000 --restart=always --name registry registry
- 这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。
- docker run -d \
- -p 5000:5000 \
- -v /opt/data/registry:/var/lib/registry \
- registry
复制代码 2.4 数据卷命令
- 创建数据卷
- docker volume create first-volume
- 查看所有的数据卷
- docker volume ls
- 查看某一数据卷信息
- docker volume inspect first-volume
- 挂载数据卷的容器
- docker run -d -P \
- --name web \
- #-v first-volume:/webapp \ // -v 参数挂载
- --mount source=first-volumn, target=/webapp \
- training/webapp \
- python app.py
- //创建一个名为web的容器,并挂载数据卷到容器的 /webapp 目录
- 查看数据卷信息
- docker inspect web
- 删除数据卷
- docker volumn rm first-volumn
- 数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据库,也不存在垃圾回收机制处理没有任何容器引用的数据卷。
- 如果要在删除容器时候删除数据就,可以在删除容器时候使用 docker rm -v 这个命令
- 清除数据卷
- docker volume prune // 清除无主的数据卷
- --mount 可以挂载一个本地主机目录导容器中去
- docker run -d -P \
- --name web \
- --mount type=bind, source=/src/webapp, target=/opt/webapp \
- training/webapp \
- python app.py
- //上面的命令就是挂在主机的 /src/webapp 目录到容器的 /opt/webapp 目录。
复制代码 2.5网络命令
- 端口绑定 参数:
- -P(大写) :Docker会随机映射一个 49000-49900 的端口到内部容器开发的网络端口
- -p(小写) : 自定义端口映射
- 映射随机端口:
- docker run -d -P training/webapp python app.py
- docker container ls -l
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
- //本地主机的 49155 被映射到了容器的5000端口。此时访问本机的49155端口即可访问容器内web应用提供的界面
- 查看应用信息
- docker logs -f nostalgic_morse
- 自定义端口映射
- docker run -d -p 5000:5000 training/webapp python app.py
- // 默认把本机所有地址的映射到5000端口上
- 自定义指定地址的端口:
- docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
- 自定义地址的任意端口
- docker run -d -p 127.0.0.1::5000 training/webapp python app.py
- 指定udp端口
- docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
- 查看映射端口配置 docker port
- docker port nostalgic_morse 5000
- 绑定多个端口 -p
- docker run -d \
- -p 5000:5000 \
- -p 3000:80 \
- training/webapp \
- python app.py
- 容器互连
- 一般使用docker,会使用 --link 来使容器互连。
- 现在则可以使用 -d 参数来指定docker的网络类型。docker网络类型有 bridge,overlay。
- 创建新的docker网络
- docker network create -d bridge first-net
- 连接容器
- docker run -it --rm --name busybox1 --network first-net busybox sh
- // 打开新的终端,在运行一个容器并加入 first-net 网络
- docker run -it --rm --name busybox2 --network first-net busybox sh
- // 在打开一个终端查看容器信息
- docker container ls
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
- 8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1
- // 用ping命令证明容器busybox1和容器busybox2建立了互连关系
- // 进入 busybox1 容器,然后输入以下命令
- ping buxybox2
- PING busybox2 (172.19.0.3): 56 data bytes
- 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
- 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
复制代码 三、docker-compose 常用命令
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |