Docker
Docker 基础
Docker 容器与镜像的概念
容器 (Container)
- 容器是一种可执行的虚拟化环境,它包含了应用程序以及运行此应用程序所需的所有依赖项(包括软件、库、配置等)。容器只存在于主机操作系统的内存中,不占用独立的系统资源,因此可以实现更高效的资源利用和更快速的启动和停止。
镜像 (Image)
- 镜像是一个只读的静态文件,其中包含了容器运行所需的所有文件系统结构、配置、依赖项等元素。镜像构建时会从一个基础镜像开始,通过一系列指令生成一个新的镜像。每个镜像都有一个唯一的标识符(Image ID),并且可以基于其它镜像进行创建和修改。
简而言之,容器是运行中的应用程序,镜像则是容器的模板或原型,可以用来创建和管理容器。在使用 Docker 时,我们通常会先创建一个镜像,并通过这个镜像来生成并管理多个容器,它们共享同一份镜像文件。因此,在理解如何使用 Docker 时,对容器和镜像的理解是非常重要的。
Docker 应用的组成和架构
Docker 应用通常由以下三个组件构成:
-
Docker 客户端
Docker 客户端是我们使用的命令行工具,通过它我们可以管理、创建、启动和停止容器、镜像等各类 Docker 资源。Docker 客户端会发送操作指令给 Docker 引擎(Daemon),并接收和显示执行结果。
-
Docker 引擎 (Daemon)
Docker 引擎是 Docker 的核心组件,负责运行和管理容器和镜像。当 Docker 客户端发送指令时,Docker 引擎会将其解释并进行相应的操作。在 Linux 系统中,Docker 引擎会以一个后台进程的方式运行,并监听实例配置的套接字,接收来自客户端的命令请求。
-
Docker Registry
Docker Registry 是存储和共享 Docker 镜像的中央仓库。类似于 Git 或 SVN 中的版本控制中心,Docker Registry 提供了集中式的镜像管理和分发服务。 Docker 客户端可以从本地或远程的 Docker Registry 中拉取所需的镜像,也可以将本地的镜像推送到 Registry 中进行共享和备份。
综上所述,Docker 应用的架构包括 Docker 客户端、Docker 引擎和 Docker Registry 三部分,它们协同工作,使得 Docker 可以方便地创建、管理和分发应用所需要的镜像和容器。
Docker 安装与配置
二进制包安装
# 1、下载二进制
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.8.tgz
# 2、解压
tar -zxv docker-20.10.8.tgz /usr/bin/docker
# 3、创建service文件
cat > /etc/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false -H unix://
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
# 4、启动docker
service docker start
rpm包安装
# 1、安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2、添加软件源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3、更新并安装 Docker-CE
yum makecache fast
yum -y install docker-ce
# 4、开启docker服务
service docker start
Docker 命令行工具的使用
Docker 提供了一系列命令行工具,例如 Docker CLI、docker-compose 和 docker-machine 等工具,用于管理容器、镜像和 Docker 应用的其它组件。以下是 Docker 命令行工具的使用方法:
-
Docker CLI
Docker CLI 是 Docker 的核心命令行工具,在终端中通过 docker
命令调用。它支持一系列子命令,包括:
-
docker run
:创建并启动一个新的容器。
-
docker build
:构建新的 Docker 镜像,可以基于从 Dockerfile 文件中定义的指令进行操作。
-
docker ps
:列出正在运行的所有容器。
-
docker images
:列出本地缓存的所有 Docker 镜像。
-
docker exec
:进入到正在运行的容器中,并在其中执行一些命令。
-
docker-compose
Docker Compose 提供了一种方便的方式来定义和运行多个关联的 Docker 容器。通过编写一个 YAML 配置文件,我们可以定义每个容器要使用的镜像、挂载点、网络协议等信息。然后,使用 docker-compose up
命令即可启动整个应用程序。
-
docker-machine
Docker Machine 允许用户在不同的主机上快速安装 Docker 工具平台。通过这个工具,我们可以在远程主机或云服务器上自动部署和配置 Docker 环境,而无需手动执行一些繁琐的步骤。
总之,在实际使用 Docker 时,通过熟练掌握上述命令和工具,可以更加方便和高效地管理和使用 Docker 平台。
Docker Hub 和 Docker Registry
Docker Hub 和 Docker Registry 都是用于存储和共享 Docker 镜像的平台,它们之间有以下几个区别:
-
Docker Hub
Docker Hub 是 Docker 公司维护的官方镜像仓库,其中包括大量常见的基础镜像,例如 Ubuntu、Debian、CentOS 等。Docker Hub 不仅提供了对这些官方镜像的免费访问,同时也是社区成员分享和发布 Docker 镜像的主要平台之一。用户可以上传、分享和搜索公开的 Docker 镜像,也可以在 Docker Hub 中创建私有仓库来进行团队内部协作。
# docker 客户端登录
docker login # 需要有一个docker中心的用户,没有的话要去注册
# 从仓库拉取镜像
docker pull httpd # 如果你的本地镜像(docker images)里没有这个镜像,docke会自动从 docker hub 仓库里拉取镜像
-
Docker Registry
Docker Registry 是一个轻量级且可扩展的开源工具,用于构建和管理自己的 Docker 镜像仓库。与 Docker Hub 不同,Docker Registry 可以在本地或公共云中部署,从而更好地满足企业或组织内部需求。Docker Registry 支持多种后端存储驱动方式,如 Amazon S3、Google Cloud Storage 和 Microsoft Azure Blob Storage,同时也支持加密控制、身份认证等多种高级功能。
综上所述,Docker Hub 和 Docker Registry 都是用于存储和共享 Docker 镜像的平台,前者是一个免费且广泛使用的公共镜像仓库,而后者则提供了更加灵活、可定制和安全的镜像管理方案。
Docker 镜像管理
列出和搜索镜像
在 Docker 中,可以使用 docker image
命令来列出和搜索本地或远程镜像。具体的命令如下:
# 列出列出所有本地镜像
docker images && docker images ls
# 远程搜素镜像
docker search <image-name>
创建和修改镜像
在 Docker 中,可以使用名为 “Dockerfile” 的文件来创建和配置 Docker 镜像,并使用 docker image build
命令来从 Dockerfile 构建镜像。具体步骤如下:
-
编写 Dockerfile 文件
创建一个名为 “Dockerfile” 的新文件,该文件应包含构建所需的所有指令和配置:
# 设置基础镜像
FROM ubuntu:latest
# 运行命令更新软件包列表
RUN apt-get update \
&& apt-get upgrade -y
# 安装 Nginx 服务器
RUN apt-get install -y nginx
# 将本地文件拷贝到镜像内部目录中
copy index.html /usr/share/nginx/html/
# 将容器监听的端口暴露出去
EXPOSE 80
# 启动 Nginx 服务
cmd ["nginx", "-g", "daemon off;"]
-
执行构建命令
使用以下命令来执行构建,并根据名称和标签创建和保存新的 Docker 镜像:
docker image build -t my-nginx-image:v1 .
其中 -t
参数用于指定镜像名称和标签,.
表示 Dockerfile 所在的当前目录。
-
使用新建的镜像
使用以下命令来验证新的 Docker 镜像已经创建成功,并启动新的容器:
docker run -p 8080:80 my-nginx-image:v1
端口映射 -p
参数将容器内的 80 端口映射到本地的 8080 端口,因此您可以在浏览器上访问 http://localhost:8080 查看 Nginx 服务器。
除了以上命令,还可以使用其他 Docker 命令来管理和修改现有镜像,例如:
-
docker image pull
:从远程获取镜像。
-
docker image tag
:为现有的本地镜像打标签。
-
docker image push
:将本地镜像推送到远程仓库。
-
docker image rm
:删除本地镜像等。
Dockerfile 的编写和使用
Dockerfile 是一种用于定义 Docker 镜像的文本文件。编写 Dockerfile 的目的是为了构建标准化、可重复使用、可自动构建和半自动化部署的镜像。以下是一个简单 Dockerfile 文件示例:
# 基础镜像
FROM ubuntu:latest
# 作者信息
LABEL maintainer="Your Name <your.name@example.com>"
# 安装所需软件包
RUN apt-get update \
&& apt-get install -y software-properties-common \
python3.8 \
python3-pip \
git \
&& rm -rf /var/lib/apt/lists/*
# 工作目录
WORKDIR /app
# 拷贝文件到容器中
COPY . .
# 安装 Python 依赖包
RUN pip3 install --no-cache-dir -r requirements.txt
# 对外暴露端口
EXPOSE 8000
# 启动命令
CMD [ "python3", "manage.py", "runserver", "0.0.0.0:8000" ]
上述 Dockerfile 中,我们首先指定基础镜像为最新版本的 Ubuntu 镜像,然后安装所需的软件包,并将工作目录设为 /app,接着拷贝应用代码到镜像内部,并安装依赖包,对外暴露 8000 端口并设置启动命令。
在使用 Dockerfile 构建镜像时,请确保在 Dockerfile 所在目录运行以下命令:
docker build -t image-name:tag .
其中,-t
用于指定镜像的名称和标签;.
表示 Dockerfile 文件所在目录。
构建完成后,可以使用 docker run
命令启动容器并验证镜像是否按预期运行。如果需要修改 Dockerfile,请重新运行构建命令以更新镜像。
导出和导入镜像
在 Docker 中,可以使用 docker save
命令将一个或多个镜像打包为 tar 文件(通常称为 Docker 镜像存档文件),然后使用 docker load
命令将该文件导入到本地 Docker 服务器中。以下是 docker save
和 docker load
命令的示例用法:
导出镜像
docker save myimage:latest -o myimage.tar
上述命令将名为 “myimage” 并标记为 “latest” 的 Docker 镜像保存至名为 “myimage.tar” 的 tar 文件中。
导入镜像
在执行以下命令导入 Docker 镜像之前,需确保镜像存档文件已位于相应位置:
docker load -i myimage.tar
上述命令将从名为 “myimage.tar” 的 tar 文件中读取 Docker 镜像,并在本地 Docker 服务器中创建与该镜像对应的镜像。
除了 docker save
和 docker load
命令外,还可以使用以下 Docker 命令来管理和操作 Docker 镜像:
-
docker images
:列出所有本地镜像。
-
docker tag
:为现有的本地镜像打标签。
-
docker push
:将本地镜像推送到远程仓库。
-
docker rmi
:删除本地镜像等。
需要注意的是,在使用导出和导入镜像的方法时,镜像内的信息和状态都会一同导出或导入,包括容器中从运行到关闭的所有内容。因此不推荐将大型镜像和实例导出为文件,并通过文件共享方式进行传递,除非使用者意识到该问题并有充分准备处理相关问题。
Docker 容器管理
启动、停止和删除容器
在 Docker 中,容器是可运行的镜像实例。可以使用 docker run
命令在 Docker 上启动新的容器(不同的容器名称和 ID 是唯一的)。以下是如何启动、停止和删除 Docker 容器的示例:
启动容器
docker run --name myws nginx:latest
上述命令将基于名为 “myws” 并标记为 “latest” 的 Docker 镜像启动一个名为 “nginx” 的容器。
停止容器
docker stop myws
上述命令将停止名为 “myws” 的容器。
删除容器
docker rm myws
上述命令将删除名为 “myws” 的容器。请注意,如果容器处于运行状态,则需要先停止该容器,然后才能进行删除操作。
除了上述命令之外,还有一些其他有用的 Docker 命令,如下所示:
-
docker ps
:列出所有正在运行的容器。
-
docker logs
:查看容器日志。
-
docker inspect
:查看容器的详细信息。
-
docker exec
:在正在运行的容器中执行命令。
需要注意的是,在删除容器时,容器内部的存储数据也将被删除。要保留这些数据,请使用数据卷来挂载宿主机上的目录,以便在容器删除时保存数据。
管理容器网络和存储
在 Docker 中,网络和存储都是容器的重要组成部分。可以使用以下 Docker 命令来管理容器网络和存储:
管理容器网络
Docker 提供了多种方式来管理容器之间的网络连接,包括桥接网络、主机网络和用户自定义网络。以下是一些常用的 Docker 命令来管理容器网络:
-
docker network create
:创建一个新的自定义网络。
-
docker network connect
:将一个容器连接到一个现有的网络。
-
docker network disconnect
:将一个容器从一个网络中断开连接。
-
docker network ls
:列出所有 Docker 网络。
管理容器存储
在 Docker 中,容器通常需要访问某些共享存储,如数据库或其它存储服务。也可以挂载数据卷来共享容器内外部的文件系统目录。以下是一些常用的 Docker 命令来管理容器存储:
-
docker volume create
:创建一个新的存储卷。
-
docker volume ls
:列出所有 Docker 存储卷。
-
docker volume rm
:删除一个或多个存储卷。
-
docker run -v
:挂载一个存储卷,使得卷的内容可以由宿主机或其他容器共享(采用 -v
开关)。
需要注意的是,在使用容器网络和存储时,请确保将其配置为安全或适应需求的设置。例如,当使用 Docker 桥接网络时,容器之间可以自由通信,因此确保运行在此网络上的容器都来自可靠来源是重要的。在有些情况下,需要跨多个容器使用数据卷并且需要对卷进行访问控制,这就需要更仔细的分析和管理。
常见运行选项和参数
在 Docker 中,使用 docker run
命令来启动一个新的容器。下面列举一些常见的运行选项和参数:
指定镜像和标签
使用 -i
选项以交互方式运行容器,并使用默认 ENTRYPOINT
或设置的命令进行操作。
使用 -t
选项来分配一个伪终端(Pseudo-Terminal),通常与 -i
选项结合使用。
使用 --name
选项来指定容器名称。
使用 -d
选项以后台模式运行容器(Daemonized Mode)。
使用 --rm
选项在容器停止时是否自动删除容器。
例如,以下命令启动基于名为 “myimage” 标记为 “latest” 的 Docker 镜像的容器,并将其命名为 “mycontainer”:
docker run -it --name mycontainer myimage:latest
映射端口和挂载卷
使用 -p
选项将宿主机上的端口映射到容器内部运行的端口上,形式为 <host_port>:<container_port>
。例如,以下命令将宿主机的 8080 端口映射到容器内部的 80 端口:
docker run -p 8080:80 myimage:latest
使用 -v
选项将宿主机或其他容器内的存储卷挂载到容器内的文件系统目录上,形式为 <host_path>:<container_path>
。例如,以下命令将宿主机上的 /path/on/host
目录挂载到容器内部的 /path/on/container
目录上:
docker run -v /path/on/host:/path/on/container myimage:latest
环境变量和启动命令
使用 -e
选项设置环境变量。
使用 --entrypoint
选项可以覆盖 Dockerfile 中指定的默认 ENTRYPOINT 命令。例如,以下命令将在 Docker 容器中运行指定的命令而不是 Dockerfile 中定义的 ENTRYPOINT 命令:
docker run --entrypoint "/bin/bash" myimage:latest
更多的 Docker 运行选项和参数可以在 Docker 官方文档中查找。
进入容器交互终端
在 Docker 中可以使用 docker exec
命令进入正在运行的容器交互终端。以下是如何使用 docker exec
命令进入容器的示例:
查看正在运行的容器列表
首先使用 docker ps
命令列出正在运行的容器列表。查找目标容器并记下其名称或 ID。
docker ps
示例输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f3c9b9fa1b0 ubuntu:latest "bash" 3 minutes ago Up About a minute admiring_brattain
e63a66d01ab7 nginx:latest "/docker-entrypoint.…" 7 days ago Up About an hour 0.0.0.0:80->80/tcp nginx
进入容器
使用 docker exec -it
命令加上容器的名称或 ID 并指定要进入的 shell,其中 -i
和 -t
选项启用了交互式会话和伪终端。例如:
docker exec -it myws bash
执行该命令后将进入正在运行的容器的 Bash 环境中。现在你可以在容器中运行任何命令,操作文件系统等等。
需要注意的是,只有在容器内安装了所需的 shell(如 Bash、Zsh、Fish)时,才能使用相应的 shell。如果没有安装,则需要先在容器内执行该 shell 的安装命令。例如,在 Ubuntu 容器中,可以通过以下命令安装 Bash:
apt-get update
apt-get install bash
现在你就可以使用 docker exec
命令进入正在运行的容器并在 Bash 环境中运行任何命令了。