部分内容参考自:这可能是最为详细的Docker入门吐血总结
Docker 是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包环境到一个可移植的容器中,然后一并发布到任何操作系统的机器上。
LXC:Linux Container 容器是一种内核虚拟化技术。与宿主机使用同一个内核。
Docker 利用LXC来实现类似传统虚拟机如 VMware的功能。同VM的方式不同,LXC 并不是硬件虚拟化,而是一个操作系统级虚拟化方法。设计之初也不是VM替代品。相较于VM,LXC与宿主机使用同一个内核,性能损耗小。docker 启动快速属于秒级别。VM通常需要几分钟去启动。
Docker在本质上是一个附加系统。 可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
Docker实例是无状态的。这意味着它们不应该承载任何数据,所有数据应该保存在数据库服务器中。
Docker 有什么
Docker 中包括三个基本的概念:
- Image(镜像)
- Container(容器)
- Repository(仓库)
Docker Image 可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。就是一堆只读层(read-only layer)。
Docker Container 镜像运行起来就是容器,可以理解是镜像的实例。是静态的镜像文件在宿主机上动态运行的进程。
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。镜像是文件,容器是进程。
容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit)成为新的镜像。
Docker Repository 是集中存放镜像文件的仓库。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 架构
- DockerClient 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- DockerContainer 容器
Docker daemon 一般在宿主主机后台运行,作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker 安装
Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费), EE 即企业版(付费)。
Docker CE 的安装请参考官方文档:
MacOS:https://docs.docker.com/docker-for-mac/install/
Windows:https://docs.docker.com/docker-for-windows/install/
Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/
CentOS:https://docs.docker.com/install/linux/docker-ce/centos/
其他 Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/
以 CentOS7 作为本文的演示。
卸载掉旧版本的 Docker
$ yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装依赖包
$ yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
安装Docker
Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。所以可以直接使用yum 命令安装最新版本
$ yum install docker
如果安装指定版本:
- 查看所有版本
# 查看可用版本
yum list docker-ce --showduplicates | sort -r
Installed Packages
docker-ce.x86_64 3:24.0.7-1.el7 docker-ce-stable
docker-ce.x86_64 3:24.0.6-1.el7 docker-ce-stable
#docker-ce.x86_64 3:{版本号}-1.el7 docker-ce-stable
- 选择一个版本并安装:yum install docker-ce-{版本号}
yum -y install docker-ce-24.0.6
验证是否安装成功
docker version
# or
docker info
启动Docker-CE
$ systemctl enable docker
$ systemctl start docker
Docker拉取镜像
搜索 仓库中 image 文件
docker search mysql
抓取 image 文件
# 示例
# docker pull library/hello-world
# mysql
docker pull mysql:5.7
docker pull 是抓取 image 文件。
library/hello-world 是 image 文件在仓库里面的位置,其中 library 是 image 文件所在的组, hello-world 是 image 文件的名字。
mysql:5.7 是mysql 在docker仓库中的位置,mysql是文件名,:5.7是一个可选tag,如上述hello-world没有tag则默认latest。
查看本机 image 文件
docker images
删除某个镜像
docker rmi image_name
Docker创建容器
运行 hello-world 这个 image 文件。运行后就会创建出对应的容器。
# 示例
# docker run hello-world
# mysql
docker run --name mysql \ # mysql5.7在docker中的别名mysql
-p 23306:3306 \ # 映射到docker的23306端口,由docker所在主机:23306提供mysql读写
-v /dockerdir/mysql/conf:/etc/mysql/conf.d \
-v /dockerdir/mysql/logs:/logs \
-v /dockerdir/mysql/data:/var/lib/mysql \ # 数据目录映射到docker的目录
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7 # 镜像
# 如启动pdf工具 [https://github.com/Stirling-Tools/Stirling-PDF?tab=readme-ov-file]
docker run -d \
-p 8080:8080 \
-v /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata \
-v /location/of/extraConfigs:/configs \
-v /location/of/logs:/logs \
-e DOCKER_ENABLE_SECURITY=false \
--name stirling-pdf \
frooodle/s-pdf:latest
# 参数说明
-d 后台方式运行 java常用的nohup
-it 使用交互方式运行,方便进入容器查看内容
--name "name" 容器名字 tomcat01、tomcat02, 用来区分同镜像创建不同容器
-p 指定容器的端口 如:-p 8080:8080
-p ip:主机端口:容器端口
-p 宿主机端口:容器端口(常用)
-p 容器端口
查看当前有哪些容器
docker ps -a
-a 是查看当前所有的容器,包括未运行的。
对一个现有的容器进行启动,重启和停止。
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id
进入到这个容器中
docker attach container_name/container_id
删除指定镜像。由于 image 被某个 container 引用(正在被运行),如果不将这个引用的 container 销毁,那 image 肯定是不能被删除。
1先去停止这个容器
docker stop container_name/container_id
2删除这个容器
docker rm container_name/container_id
3删除这个镜像
docker rmi image_name
容器命令总结
# 容器命令
docker run 镜像id #新建容器并启动
docker ps # 列出所有运行的容器 docker container list
docker rm 容器id # 删除指定容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
Dockerfile 是什么
Dockerfile由一行行命令语句组成,指令集;Dockerfile 中的命令非常类似于 linux 下的 .sh 、windows下的.bat
镜像迁移时,到了Docker容器需要执行一些固定的命令,如提前安装一些依赖,如yum install gcc,提前创建一些文件夹,最后才是启动目标镜像,这些步骤都是一条条命令,就可以将这些命令都打包到dockerfile中,就是一份清楚罗列了从操作系统到目标程序的命令清单。
Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile 构建一个镜像。
语法:
docker build -t ImageName:TagName dir
-t − 给镜像加一个Tag
ImageName − 给镜像起的名称
TagName − 给镜像的Tag名
Dir − Dockerfile所在目录
举例:
[root@localhost ~]# docker build -t myimg:0.1 .
myimg - 是镜像名
0.1 - 是tag
. - 表示当前目录,即Dockerfile所在目录
下面这个简单的Dockerfile的例子:
FROM python:2.7
MAINTAINER Angel_Kitty <666@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]
分析一下上面这个过程:
1、从 Docker Hub 上 pull 下 python 2.7 的基础镜像
2、显示维护者的信息
3、copy 当前目录到容器中的 /app 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
4、指定工作路径为 /app
5、安装依赖包
6、暴露 5000 端口
7、启动 app
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
Docker compose是什么
某些项目的搭建,需要多个镜像,构成一整套服务,且这些镜像有固定先后顺序的运行要求,我们可以将命令一条条一次执行,但更好的方式是,通过一个docker-compose.yml文件准备好这些命令,使用docker compose up命令解析,实现一套服务的一键部署。
-
docker-compose up -d
docker-compose up -d命令用于启动已定义在docker-compose.yml文件中的服务容器,并以守护进程的方式在后台运行。- docker-compose: 是一个用于定义和运行多个容器应用的工具。
- up: 用于创建并启动容器。
- -d或–detach: 表示以守护进程的方式运行容器,即在后台运行,不会阻塞终端。
- docker-compose.yml: 是一个YAML格式的文件,用于定义多个容器的服务配置,包括容器的镜像、端口映射、环境变量、数据卷等。
通过docker-compose up -d命令启动的容器会在后台持续运行,直到显式停止或使用docker-compose down命令停止容器。
-
docker-compose up --build
docker-compose up --build命令用于重新构建并启动服务容器。重新构建就是包括下载依赖、安装软件、配置环境等步骤。- docker-compose: 是一个用于定义和运行多个容器应用的工具。
- up: 用于创建并启动容器。
- –build: 表示重新构建容器的镜像。
docker-compose up --build 命令用于重新构建服务容器。如果服务容器已经存在,该命令会先停止并移除现有的容器,然后重新构建并启动容器。如果服务容器不存在,则会直接构建并启动容器。
docker-compose up --build 可以确保容器的代码、配置等内容是最新的,以便在启动容器时使用最新的版本。这对于应用程序的更新、配置的更改或者依赖的更新非常有用。
docker-compose up --build 命令可能会比较耗时,特别是在首次构建容器或者容器配置发生变化时。如果只是需要启动已经存在的容器,可以使用docker-compose up -d命令以快速启动容器。
Docker swarm
docker 解决的是单个容器的部署;
docker compose 解决的是多个容器组成的一套服务的部署;
docker swarm 要解决的是:这一整套服务在多台服务器上集群部署。如服务集群故障迁移,弹性缩扩容。
Docker 和Kubernetes
k8s:容器编排引擎。 在多台Node上调度Pod 进行部署和扩缩容。每个Pod上可以含有多个container。
docker swarm 与 k8s 是很相似的:
docker | k8s |
---|---|
docker 容器 | 容器 container |
docker compose 部署的一套服务 | Pod |
docker swarm 管理一套服务 | k8s 调度Pod |