Docker入门
Docker
概述
- Docker是开发、部署、发布和运行应用服务的开放平台。
- 部署、测试、开发应用更快快捷。
- Docker提供了打包和运行服务的独立的环境——Container.
- Container是轻量级的,且包含运行应用服务的所有依赖。因此,可在不同机器上保持一致性。
优势:
- 快速的,一致的应用服务交付:容器利于持续集成和持续交付工作流程。(continuous integration and continuous delivery (CI/CD))
- 敏捷部署和扩展。(高可移植性,轻量级)
- 同样硬件下提供更多的负载。
体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YMiNa4F-1655775416318)(…/…/image/article/docker/docker_architecture.svg)]
Docker使用的是client-server架构。client 与Docker守护进程间(daemon)进行通信,完成编译、运行、分配Docker容器。客户端可在本地运行,也可以远程链接至服务端的守护进程。客户端与服务端通过基于Unix的Socker或网络接口的 REST API完成通信。Docker Compose 是一个客户端,允许使用由一组容器组成的应用程序。例如常用的:docker-compose up , docker-compose down。
The Docker daemon
Docker守护进程监听Docker API请求。包括,镜像、容器、网络、卷等。守护进程间也可通信。
The Docker client
大多数Docker用户使用Docker的主要方式。例如, docker run
Docker Desktop
面向Mac和Windows环境的应用,提供构建和分享容器化应用和微服务。包含Docker守护进程、客户端、Docker Compose、K8s、证书帮助等。
Docker Registries
一个关于Docker 镜像、容器、网络、卷、插件以及其他对象的概要说明。docker pull, docker push, docker run等命令与此相关。
Docker对象
Images 镜像
镜像是一个只读模板,用于创建Docker容器。通常,一个镜像依赖与另一个镜像。通过创建Dockerfile、定义创建镜像的一些步骤,完成创建。Dockerfile中的每一个指令都会在镜像中创建一层(layer)。当修改Dockerfile并重建镜像时,只有那想相关的层(layer)会被重建。这事镜像轻量化、更快捷。
Containers 容器
容器是镜像的一个可执行实例。同时可基于容器当前状态创建一个新的镜像。
Docker 下载
入门教程
- 编译和运行一个镜像至容器;
- 通过Docker Hub分享镜像
- 多容器应用间的依赖
- 通过Docker compose运行应用
开始
- 运行getting-started镜像。若本地无该镜像,docker会自动运行docker pull命令进行下载。
docker run -d -p 80:80 docker/getting-started
-d : 使用detached模型运行,即后台运行
-p 80:80 : 将host的80端口映射到容器的80端口
本地打开127.0.0.1:80 可看到Getting Started网页。
- Docker Dashboard
Windows Docker Dashboard stopping 问题解决:https://blog.csdn.net/qq_39611230/article/details/108625840
需要更新WSL 组件
Docker Dashboard在Windows下安装后,暂时无法管理linux服务器上的远程Docker容器。Ubuntu中需要22.04版本以上才可安装Docker Dashboard。因此,暂不整理Docker Dashboard相关内容。
- 什么是容器
容器就是运行在主机上的一个与其他进程相互独立的沙盒进程。其原理是利用linux的核命名空间和控制组,Docker使这些能力与方法使用的更便捷。
- 是镜像的一个可执行实例
- 能够在本地机器、虚拟机、或云端运行
- 可移植
- 什么是容器镜像
当运行一个容器的时候,容器具有独立的文件系统。这个文件系统是由容器镜像提供的。容器镜像包含运行容器的所有内容。
示例应用
编译一个应用的容器镜像
需要创建一个Dockerfile.Dockerfile是一个基于文本的指令脚本,用于创建容器镜像。
- 在项目文件夹下创建一个Dockerfile,与packages.json在同一个文件夹下。
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
- 使用docker build命令编译镜像。注意,后面有URL路径,此为Dockerfile路径,下述命令值为当前路径。
docker build -t getting-started .
build过程:发送编译上下文至Docker daemon;执行Dockerfile中的指令;拉取所需镜像;添加apk;设置工作路径;yarn安装package.json中的包;运行前端。
执行过程中下来了很多曾,这是因为从node:12-alpine镜像开始。因为本地无该镜像,所以下载。下载完成后通过yarn安装依赖。通过CMD命令运行特殊的命令。
Dockerfile中 RUN 与 CMD 的区别:RUN是docker在创建镜像时执行的指令,每个RUN命令会创建镜像的新层,便于后续回滚。一个Dockerfile最多只会有一个CMD,该命令也会运行指令,但不会创建新曾。因此常用CMD执行一个脚本文件(例如sh文件),用于执行多条指令。
- 开始运行应用容器
一般通过docker run指令。首先使用docker run指令利用先前的容器名称 getting-started启动刚刚创建的镜像;其中-d表示后台运行;-p表示将容器端口映射到主机。其中左侧为主机端口,右侧为容器中的服务端口,下述:3000是容器中的服务端口,3001是映射到主机的端口。
docker run -dp 3001:3000 getting-started
更新应用
在修改完代码后不可直接用docker run 编译镜像。因为此时已有在运行中的同名称镜像容器。需要先删除老容器后,再编译新镜像容器。
删除容器
- docker ps 查看容器id
- docker stop container-id
- docker rm container-id
重新编译运行
- docker build -t getting-started
- docker run -dp 3000:3000 getting-started
分享应用
通过Docker Hub的服务可以上传和下载镜像。
创建仓库
- 登录Docker Hub
- 进入Repositories模块,点击Create Repossitory
- 输入名称及其他配置。
上传镜像
- 使用docker login -u YOUR_USER_NAME登录
- 使用的 docker tag为镜像添加tag
docker tag getting-started YOUR_USER_NAME/getting-started:v1.0
- 使用docker push YOUR_USER_NAME/getting-started:v1.0 上传镜像。
持久化存储
容器运行期间对容器内部的存储内容修改,并不会保存下来。为了持久化保存,需要使用容器卷支持。卷提供了容器访问本地文件系统的能力。
命名卷
docker自行管理命名卷的物理位置,使用时只需记住卷的名称。
- 通过 docker volume create 创建
docker volumne create todo-db
- 删除todo应用的容器(未挂载)
- 启动容器,并添加-v标签,挂在一个特殊的卷。利用上面创建的命名卷,挂在到/etc/todos路径,这样该路径下的所有文件就会保存在命名卷中。下次启动后仍然保留。