docker总结大全
简介
Docker是一种容器化平台,用于在虚拟化的操作系统上创建、部署和运行应用程序。通过Docker,开发人员可以打包应用程序及其依赖项,并在容器中运行它们,从而实现了应用程序的可移植性和可重复性。
Docker容器提供了一种轻量级的虚拟化方式,每个容器都是一个独立的运行环境,拥有自己的文件系统、网络和进程空间。这使得Docker容器可以更快地启动和停止,并且需要更少的资源来运行。
使用Docker,开发人员可以构建、测试和部署应用程序,同时保持环境的一致性。这使得Docker成为一个流行的解决方案,用于构建和运行现代化的分布式应用程序。
一些外链:
三大概念
Docker 包括三个基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
它们之间的关系分别是: 仓库保存镜像、容器启动镜像、镜像保存环境
镜像(Image)
在Docker中,镜像是一种轻量级、可移植的打包方式,用于打包应用程序及其所有依赖项,包括操作系统、库文件和其他必要的组件。镜像可以用来创建Docker容器,从而在容器中运行应用程序。
Docker镜像是只读的,一旦创建就不能更改。镜像是通过Dockerfile定义的,Dockerfile是一个文本文件,其中包含了用于构建镜像的指令和配置信息。通过Dockerfile,开发人员可以指定基础镜像、安装软件包、设置环境变量和运行命令等操作,最终生成一个新的镜像。
Docker镜像是通过Docker Hub或其他Docker仓库进行共享和分发的。Docker Hub是一个公共的Docker镜像仓库,其中包含了大量的镜像,用户可以从中获取所需的镜像,也可以将自己创建的镜像上传到Docker Hub上进行共享。同时,也可以在私有的Docker仓库中存储和管理自己的镜像,以便在内部使用或私下共享。
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container)
在Docker中,容器是一个独立的运行环境,包含了应用程序及其依赖项,可以在任何支持Docker的平台上运行。Docker容器是基于Docker镜像创建的,每个容器都是一个相互隔离的运行环境,拥有自己的文件系统、网络和进程空间,与主机操作系统和其他容器完全隔离。
容器是轻量级的,启动速度快,所需的资源也较少。使用Docker,开发人员可以快速地创建、启动和停止容器,并在容器中运行应用程序,从而实现了应用程序的可移植性和可重复性。
Docker容器可以通过Docker命令行工具进行管理,例如启动、停止、重启、删除等操作。同时,Docker还提供了一系列的命令行工具和API,可以对容器进行监控、调试和管理。
使用Docker容器,开发人员可以更轻松地构建和部署现代化的分布式应用程序,从而实现了应用程序的可移植性和可重复性。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository)
在Docker中,仓库是用于存储和管理Docker镜像的中心化服务。Docker仓库是一个中央集中的存储库,用于存储和管理Docker镜像,同时还提供了镜像的标签和元数据等信息。
Docker Hub是最流行的公共Docker仓库,其中包含了数以万计的Docker镜像,开发人员可以从Docker Hub获取所需的镜像。同时,Docker Hub也是一个社区,用户可以将自己的镜像上传到Docker Hub上进行共享和分发。
除了Docker Hub外,Docker还支持私有Docker仓库,开发人员可以在内部搭建私有的Docker仓库,用于存储和管理自己的Docker镜像。私有Docker仓库可以提供更高的安全性和可控性,同时也可以加速应用程序的构建和部署过程。
Docker仓库可以通过Docker命令行工具进行管理,例如搜索、拉取、推送和删除镜像等操作。同时,Docker还提供了一些工具和API,用于管理和监控Docker仓库的状态和性能。
仓库可看成一个代码控制中心,用来保存镜像。
安装
Windows
官方安装网址:Docker Desktop release notes | Docker Docs
下载后按提示安装即可,注意需要将windows中的hyper-V打开(若没打开,docker的安装程序会自动打开)
Ubuntu
更新apt包索引
sudo apt update
安装一些必要的软件包,这些软件包允许apt通过HTTPS使用仓库
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加Docker仓库到apt源中。在终端中输入以下命令(注意:这里的$(lsb_release -cs)
会自动获取你的Ubuntu版本信息)
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新apt包索引
sudo apt update
安装Docker
sudo apt install docker-ce docker-ce-cli containerd.io
安装完成后,启动并加入开机启动Docker
sudo systemctl start docker
sudo systemctl enable docker
验证docker是否安装成功
docker -v
如果需要安装docker compose,则可以使用如下命令进行安装:
sudo apt install docker-compose
HelloWorld
为了更加好得理解docker,这里用docker的一个小案例来帮助读者更快速入门docker。这里就用ubuntu的docker镜像来作为案例。
搜索镜像
首先我们需要搜索仓库中的镜像,使用docker search ubuntu
来搜索有关ubuntu的镜像。结果如下:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 15791 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 293 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 99 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 84
open-liberty Open Liberty multi-architecture images based… 59 [OK]
ubuntu/apache2 Apache, a secure & extensible open-source HT… 57
ubuntu/squid Squid is a caching proxy for the Web. Long-t… 54
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 50 [OK]
ubuntu/bind9 BIND 9 is a very flexible, full-featured DNS… 49
ubuntu/mysql MySQL open source fast, stable, multi-thread… 44
ubuntu/prometheus Prometheus is a systems and service monitori… 40
ubuntu/kafka Apache Kafka, a distributed event streaming … 28
ubuntu/postgres PostgreSQL is an open source object-relation… 27
ubuntu/redis Redis, an open source key-value store. Long-… 17
ubuntu/grafana Grafana, a feature rich metrics dashboard & … 9
ubuntu/prometheus-alertmanager Alertmanager handles client alerts from Prom… 8
ubuntu/dotnet-deps Chiselled Ubuntu for self-contained .NET & A… 7
ubuntu/zookeeper ZooKeeper maintains configuration informatio… 5
ubuntu/memcached Memcached, in-memory keyvalue store for smal… 5
ubuntu/dotnet-runtime Chiselled Ubuntu runtime image for .NET apps… 5
ubuntu/dotnet-aspnet Chiselled Ubuntu runtime image for ASP.NET a… 4
ubuntu/telegraf Telegraf collects, processes, aggregates & w… 4
ubuntu/cortex Cortex provides storage for Prometheus. Long… 3
ubuntu/cassandra Cassandra, an open source NoSQL distributed … 2
这里我们选择ubuntu
作为我们的镜像(15791个stars,第一个)
下载镜像
使用如下命令从仓库拉取镜像
docker pull ubuntu
完成后,可以使用docker images
查看本地镜像,查看到下载的镜像为成功
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 08d22c0ceb15 3 weeks ago 77.8MB
创建容器
为了启动镜像,我们需要创建一个容器。使用如下命令创建一个容器
docker run -i -t -d --name hello ubuntu
这个命令为,创建一个可对话(伪终端)、后台持续部署的容器,并命名为hello。其中ubuntu为刚刚pull下来的镜像
使用docker ps -a
查看所有容器的状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
428b0a1935fb ubuntu "/bin/bash" About a minute ago Up About a minute hello
这里可以看到在不到一分钟前已经启动了容器,若docker有很多容器,可以使用docker ps
查看启动容器的当前状态
操作容器
我们开启了伪终端的功能,那么我们可以进入该容器,以终端的形式操作这个容器。
docker exec -it hello /bin/bash
后面的/bin/bash
在docker ps
命令中COMMAND
列可看到。进入容器终端后,可以看到:
root@428b0a1935fb:/#
@后面的数字就是容器的ID。之后就可以随意操作了。如果想退出容器,输入exit
命令即可。
停止并启动容器
我们结束容器的操作后,可以停止容器启动。使用如下命令停止容器:
docker stop hello
如果想开启,则输入docker start hello
开启容器。并且用docker ps
查看容器的开启状态
删除容器与镜像
如果不需要容器了,可以删除容器。使用如下命令删除容器:
docker rm -f hello
如果镜像也不需要了,可以删除镜像。使用如下命令删除镜像:
docker rmi ubuntu
使用docker ps -a
和docker images
查看是否删除成功
镜像操作
在Docker中,可以使用命令行工具或者图形用户界面来管理和操作镜像。
搜索镜像
可以使用docker search
命令搜索Docker Hub上的镜像。例如:
docker search nginx
拉取镜像
可以使用docker pull
命令从Docker仓库中拉取一个镜像。
docker pull ubuntu
查看本地镜像列表
可以使用如下命令查看本地系统中的镜像列表。
docker images
删除镜像
可以使用docker rmi
命令删除一个本地系统中的镜像。
docker rmi ubuntu
查看镜像详情
可以使用docker inspect
命令查看镜像的详细信息。
docker inspect hello
构建镜像
可以使用Dockerfile来构建一个新的镜像,并使用docker build
命令来执行构建。
首先创建一个Dockerfile,其中包含一组指令来告诉 Docker 如何构建我们的镜像。Dockerfile的内容如下:
FROM ubuntu
RUN apt-get update && apt-get install -y nginx
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后执行以下命令来构建镜像:
docker build -t my-nginx-image .
-t
: 指定要创建的目标镜像名.
: Dockerfile文件所在目录,可以指定Dockerfile的绝对路径
容器操作
在Docker中,可以使用命令行工具或者图形用户界面来管理和操作容器。
创建容器
可以使用docker run
命令来创建一个新的容器,并在其中运行一个命令或应用程序。以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
docker run -i -t -d --name hello ubuntu /bin/bash
参数说明:
-i
: 交互式操作。-t
: 终端。-d
: 后台部署。--name
: 指定容器名字。hello
: 自定义容器名字。ubuntu
: ubuntu 镜像。/bin/bash
: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
创建完成后,会自动进入容器终端,可以使用exit
推出容器终端。
启动容器
可以使用docker start
命令来启动一个已经停止的容器。例如:
# 启动容器,hello可以是容器的id和容器名
docker start hello
# 后台启动容器,hello可以是容器的id和容器名
docker start -d hello
停止容器
可以使用docker stop
命令来停止正在运行的容器。例如:
docker stop hello
重启容器
可以使用docker restart
命令来重启一个正在运行的容器。例如:
docker restart hello
删除容器
可以使用docker rm
命令来删除一个已经停止的容器。例如:
docker rm hello
若想强制删除一个容器,可以加-f
指令。例如:
docker rm -f hello
查看容器日志
可以使用docker logs
命令来查看容器的日志输出。例如:
docker logs hello
# 标准化输出
docker logs -f hello
查看容器启动状态与信息
# 查看正在运行中的容器
docker ps
# 查看本地所有的容器
docker ps -a
进入容器
可以使用docker exec
命令在运行的容器中执行命令。
docker exec -it hello /bin/bash
进入容器后,如果想退出容器,则使用exit
退出。docker exec
命令在退出容器后不会停止容器的运行。
也可以用如下方式进入一个正在运行的容器:
docker attach 容器id
docker exec
在进入容器后开启一个新的终端,可以在里面操作。docker attach
会进入容器并打开正在执行的终端。
导出容器
可以使用docker export
命令将容器导出为一个tar归档文件。例如:
docker export hello > hello.tar
导入容器
在Docker中,可以使用docker import
命令将一个tar归档文件导入为一个新的镜像。该镜像是一个新的、不包含任何历史记录或元数据的镜像,因此需要为其指定名称和标签。
以下命令将hello.tar文件导入为一个名为hello的镜像,并为其添加一个标签v1.0:
docker import hello.tar hello/hello:v1.0
查看容器内部进程
可以使用docker top
来查看容器内部运行的进程。例如:
docker top hello
查看容器的底层信息
使用docker inspect
来查看容器的底层信息。它会返回一个JSON
文件记录着Docker容器的配置和状态信息。
docker inspect hello
Web应用容器
我们可以指定端口,创建一个web应用容器
docker run -i -t -d -P --name training_web training/webapp python app.py
-p
指令将容器内部使用的网络端口随机映射到我们使用的主机上。也可以指定映射的端口,例如:
docker run -i -t -d -P 8112:80 --name training_web training/webapp python app.py
以上指令将容器内部的8112端口映射到我们本地主机的80端口上。若想访问容器中的web,只需要输入ip:8112
即可。
查看Web容器的端口映射
使用docker ps
查看容器,可以发现容器信息多了端口信息。
PORTS
0.0.0.0:8112->80/tcp
也可以使用docker port
查看容器的端口信息
docker port hello
文件管理
docker类似于虚拟机,假设需要用docker去运行某些代码,我们需要将物理机上的文件传输到docker里面。
docker提供了对应的文件传输命令,那就是cp(copy)指令,cp是基础的指令,可以用于容器和外界物理机之间拷贝文件,命令的主要形式如下:
docker cp 容器ID或名称: 容器文件目录 物理机文件目录
docker cp 物理机文件目录 容器ID或名称: 容器目录
第一条为将容器内的文件复制到物理机上,第二条则是将物理机上的文件复制到容器里
比如想将物理机的/home/user/file
目录文件复制到容器ID为a2730e327321
的/home/file
目录下,那么就运行:
docker cp /home/user/file a2730e327321:/home/file/
反过来,我们想将容器ID为a2730e327321
的/home/file
目录下的文件复制到物理机的/home/user/file
目录下,那么就运行:
docker cp a2730e327321:/home/file /home/user/file/
注意:
如果源路径是个文件,且目标路径是以
/
结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下(如果不存在则自动创建)。如果目标文件是个存在的文件,会被源文件覆盖,文件名则为目标文件名。
docker commit
docker commit
是Docker命令行工具中的一个命令,用于将运行中的容器的当前状态保存为一个新的镜像。当你对容器内的文件系统或配置做了更改,并希望将这些更改永久保存下来以供后续使用时,可以使用这个命令。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS:可选参数,例如:
-a|--author
:指定提交者的姓名和邮箱。-m|--message
:提供提交信息(即镜像版本注释)。-p|--pause
:在提交之前暂停容器(默认行为,确保提交的是一个稳定的容器状态)。
CONTAINER:你要提交的正在运行或已停止的容器的ID或名称。
REPOSITORY[:TAG]:新镜像要保存的位置和标签,默认情况下如果没有指定仓库名和标签,则会创建一个没有仓库名、仅包含短ID作为标签的新镜像。
示例:
# 提交名为my_container的容器到本地仓库,并标记为new_image:latest
docker commit -m "Added custom configuration" hello new_image:latest
# 或者只提交容器而不指定仓库和标签,将会生成一个带有随机字符串标签的本地镜像
docker commit hello
# 查看容器提交的镜像
docker images
数据卷
Docker数据卷(Data Volumes)是用于持久化存储容器内数据的机制,它们在容器之间提供了一种持久和可共享的数据存储方式。Docker容器的数据,可以同步到本地中,若不想容器产生的数据(如数据库的数据)删除后丢失,可以使用数据卷来保证数据的持久性。
数据卷可以将容器内的目录,挂载到本地机上面。为了将容器的数据卷挂载到本地机上,我们可以在 docker run
命令中使用 -v
或 --volume
参数。
docker run -it -d -v 主机目录:容器内目录 镜像ID /bin/bash
除此之外,也可以使用docker volume
命令对数据卷进行一系列操作,具体如下:
创建新的数据卷:
docker volume create [volume_name]
查看已存在的数据卷:
docker volume ls
删除数据卷:
docker volume rm [volume_name]
检查数据卷详细信息:
docker volume inspect [volume_name]
具名与匿名挂载
匿名挂载是指在创建和使用数据卷时,不为其指定特定名称,而是由Docker自动为数据卷生成一个唯一的、难以预测的哈希值作为其标识。
docker run -v /host/path:/container/path ...
具名挂载则是指在创建数据卷时明确地为其指定一个易于识别的名字,这样可以方便管理和复用该数据卷。
docker run -v named_volume:/container/path ...
或
docker run -v volume_name:/container/path ...
具名挂载提供了更高的可读性和可控性,因为它允许用户通过名称来管理数据卷,而匿名挂载则更为简单快捷,但可能不利于后期维护和追踪。
容器数据卷
数据卷不仅仅可以挂载在本地机上,也可以挂载在容器里。在修改挂载目录下的文件后,容器之间的挂载目录内的文件会自动同步起来。这就实现了容器间的数据共享
使用--volumes-from
对目录进行挂载
docker run -it --name docker01 --volumes-from docker02 hello/ubuntu:latest
DockerFile
Dockerfile 是一个文本文件,用于定义如何构建一个新的 Docker 镜像。它是Docker镜像创建过程的蓝图,包含了用户需要运行应用程序及其依赖的所有命令和配置信息。
在Dockerfile中,你可以指定基础镜像、添加文件、设置环境变量、安装软件包、执行自定义脚本等一系列操作。当Docker客户端通过 docker build
命令解析并执行Dockerfile中的指令后,会生成一个新的定制化镜像。
DockerFile命令
Dockerfile中的每个命令都是一层一层的,它有特定的语法和一系列基本指令。这些指令必须全部大写,并且在Dockerfile中按照特定的顺序编写。
Dockerfile的基本指令如下:
FROM
:指定制作镜像时依据的基础镜像(这个镜像的妈妈是谁)。
LABEL
:用于给镜像添加元数据的指令。元数据以键值对的形式存在,可以用来描述镜像的各种属性,比如版本号、描述信息、维护者信息等。这些信息对于镜像的管理、搜索和分类非常有用。
RUN
:在制作镜像时需要执行的命令(你想让它干啥)。
COPY
:将文件系统中的文件复制到Docker镜像中,通常用于将应用程序代码或配置文件复制到镜像中。
ADD
:将文件系统中的文件复制到Docker镜像中,通常用于将应用程序代码或配置文件复制到镜像中。这个指令类似于COPY
指令,但功能更强大,因为它还支持自动解压缩和远程URL获取
WORKDIR
:设置工作目录(我是cd
,今天化了妆)。
VOLUME
:设置容器与外界映射的目录,通常用于数据持久化等操作(给它一个存放行李的地方)。
EXPOSE
:设置向外暴露的端口,这样外部可以访问容器内部运行的服务(它要打开的门是啥)。
CMD
:指定容器启动时要执行的命令,但只有最后一个CMD会生效。如果Docker容器在启动时被指定了运行的命令,则会覆盖CMD指定的命令。
ENTRYPOINT
:指定容器启动时要执行的命令,与CMD不同的是,ENTRYPOINT指定的命令不会被docker run命令中给出的参数覆盖,而是将其作为固定部分一直存在于容器中。如果指定了ENTRYPOINT,则CMD的内容将作为参数传给ENTRYPOINT。
ENV
:设置环境变量,这些环境变量可以在后续的指令中使用。
以下是一个简单的Dockerfile示例:
# 指定基础镜像
FROM alpine:latest
# 设置维护者信息和其他元数据
LABEL maintainer="Your Name <your.email@example.com>"
LABEL version="1.0"
LABEL description="A simple Nginx container based on Alpine Linux with a custom HTML page."
# 设置环境变量
ENV NGINX_VERSION 1.21.3
ENV NGINX_HOME /etc/nginx
# 安装Nginx
RUN apk add --no-cache nginx=${NGINX_VERSION}
# 设置工作目录
WORKDIR ${NGINX_HOME}
# 将自定义的HTML文件复制到Nginx的默认网页目录下
COPY index.html /usr/share/nginx/html/
# 暴露80端口
EXPOSE 80
# 设置容器启动时要执行的命令
CMD ["nginx", "-g", "daemon off;"]
构建镜像
为了使用这个Dockerfile构建镜像,我们可以使用docker build
去构建,docker build
是 Docker 的命令,用于从 Dockerfile 构建一个新的 Docker 镜像。这个命令会根据你提供的 Dockerfile 中的指令,创建一个分层的镜像,该镜像可以作为运行容器的基础。
基本语法如下:
docker build [选项] [--build-arg <参数名>=<值>] [-t <镜像名>:<标签>] [-f <Dockerfile路径>] [<上下文路径或URL>]
各部分含义:
--build-arg <参数名>=<值>
:用于在构建过程中传递变量给 Dockerfile 中的ARG
指令。-t <镜像名>:<标签>
:指定新镜像的名称和可选标签,默认标签是 "latest",如果不指定标签,则会使用 "latest"。-f <Dockerfile路径>
:指定要使用的 Dockerfile 的路径(如果当前目录下没有默认的 Dockerfile 文件)。[<上下文路径或URL>]
:这是构建镜像时使用的上下文路径,Docker 将会发送此路径下的所有内容到 Docker daemon 进行构建。如果省略,则默认为当前目录。
例如,一个简单的构建命令如下所示:
docker build -t myimage:v1.0 -f /home/dockerfile