Docker 的基本使用
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache 2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现自动化地创建容器、发布、部署应用。
Docker 的安装
windows 安装 docker
# 1. 在官网中下载 docker-desktop:https://www.docker.com/products/docker-desktop/
# 2. 双击安装即可,安装完成后,需要设置一下 docker 的镜像存储路径,随着docker的镜像越来阅越多,是非常占用 c 盘磁盘空间的。
# 设置图标(setting) -> resources -> advanced -> disk image location: 点击 browser 按钮,选择一个路径即可
# 3. 设置 pull 镜像, 当设置了镜像之后,“最好不要在下载镜像的过程中开启代理了”。
# 设置图标(setting) -> docker engine -> 添加如下内容:
{
"registry-mirrors": [
"https://dockerpull.cn" // 目前网上很多镜像都是比较老了,不能用的。 最新的是这个
]
}
完整配置,对于只想设置 镜像的同学,设置只设置 registry-mirrors 即可,其它部分保持默认:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"insecure-registries": [
"docker.io"
],
"ipv6": false,
"registry-mirrors": [
"https://dockerpull.cn",
]
}
linux 安装 docker
1. 下载 docker
# 下载并执行 Docker 官方安装脚本
curl -fsSL https://get.docker.com | sudo sh
# 将当前用户加入 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限(或重新登录生效)
2. 下载docker-compose
# 下载最新稳定版(替换版本号为最新),版本号可以从:https://github.com/docker/compose/releases/ 地址中去找,打开此页面后,你看到第一个版本号就是最新的。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
Docker 容器技术具有如下特点:
轻量级:与虚拟机相比,Docker 容器更轻量级,因为它们共享主机的操作系统而不必为每个容器单独运行一个操作系统,这使得它们启动更快,占用资源更少。
标准化:容器标准化了应用的交付,同一套容器可以在开发、测试、生产等多个环境中无差别运行,减少了“在一台机器上可以运行,但其他机器上却不可以”的问题。
组件化:任何应用程序都可以被拆解为独立的、可替换的组件,便于维护和扩展。
版本控制:Docker 支持镜像的版本控制,可以轻松追踪应用的变更。
简单理解:当你在部署一个项目的时候,需要依赖很多库或者工具环境,如果一个一个安装的话,可能会影响到宿主机系统。docker 可以将你部署的项目与宿主机隔离,仅仅安装你项目需要的那些环境或工具,实现隔离。并且 宿主机还可以与 docker 进项 tcp 的通信。
Docker 基本用法
使用 Docker 镜像
拉取镜像:你可以从 Docker Hub(一个公共的镜像仓库)拉取镜像,命令如下:
docker pull <image name>
运行容器:使用指定的镜像启动一个容器,命令如下:
docker run -it <image name>
其中,
-it
参数表示以交互方式运行容器,可以去掉以后台方式运行。
构建自己的镜像
你可以通过 Dockerfile 文件来定义自己的镜像。“Dockerfile” 是一个文本文件,里面包含了构建 Docker 镜像所需的所有命令。创建好 Dockerfile 后,可以使用如下命令构建镜像:
docker build -t <image name> .
这里的
.
表示 Dockerfile 所在的当前位置。例如:一个项目根目录下,可以创建一个 “DockerFile” 的文件。这个文件就可以将当前的这个项目变成一个镜像。部署 docker 内。管理容器和镜像
什么是镜像,什么是容器
镜像:一个只读的模板,包含创建容器所需的全部文件和配置,类似操作系统的“安装光盘”或面向对象中的“类”。镜像本身不可修改(修改后会生成新镜像)
docker pull ubuntu:22.04 # 下载镜像 docker images # 查看本地镜像 docker rmi <image name> # 删除镜像
容器:镜像的运行实例,是一个隔离的进程环境,类似从“安装光盘”安装好的“操作系统”(正在运行的实例)多个容器可共享同一个镜像,启动速度快(秒级)。
docker run -it ubuntu:22.04 # 基于镜像启动容器 docker ps -a # 查看所有容器 docker start/stop <container id> # 启动/停止容器 docker rm <container id> # 删除容器
查看所有容器():
# 查看所有容器,包括运行中的和停止的 docker ps -a # 只查看正在运行的 docker 容器 docker ps
停止容器:
docker stop <container id>
删除容器:
docker rm <container id>
删除镜像:
docker rmi <container id> # 如果当前的容器正在运行且依赖当前的镜像,可以加上 -f 参数删除 docker rm -f <container id>
Docker 创建一个镜像与容器的基础示例
将自己的项目创建为一个镜像
在自己的项目中,创建一个名为:“Dockerfile” 的文件。内容如下:
# 声明当前项目在构建时的 node 环境
FROM node:20.11.1-alpine
# 指定当前项目在容器内的路径,容器内的环境一般是基于 linux 的,一般会将其放在 app 目录下
WORKDIR /app/xxxx
# 拷贝 依赖文件
COPY package.json .
COPY yarn.lock .
# 安装当前项目的依赖
RUN npm config set registry https://registry.npmmirror.com
RUN npm install --frozen-lockfile
# 将当前项目下的目录(宿主机项目目录)全部拷贝到docker中。也可以仅拷贝在生产环境中需要的目录
COPY . .
# 将当前项目进行打包,如果打包失败,则docker不会继续往下进行,会直接报错
RUN npm build
## 指定 docker 的启动端口,这个端口不是你想象的端口,你可以理解为给这个镜像起了个名字,一般来说,这个端口与你项目的启动端口保持一致接口。(因此,存静态的项目是不推荐使用docker来部署的。)
EXPOSE 3001
# 启动项目,在启动时,一定要使用 CMD 来启动,并且启动时,一定要启动一个服务,如果只是运行一个 js, 那么docker 在运行完成后就会结束。
CMD ["npm", "start"]
将这个镜像便成为一个容器。
在项目根目录下创建一个 “docker.compose.yaml” 的文件。这个文件可以理解为是一个安装文档,docker 根据这个文档将镜像安装到容器内。因此,它里面可以写多个镜像。(看到这里有没有想到,前面提到的 “简单理解”呢?,)
services:
# MongoDB 服务
mongodb:
image: mongo:latest
container_name: mongodb
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: xxx # 初始化管理员用户名(可选)
MONGO_INITDB_ROOT_PASSWORD: xxx # 初始化管理员密码(可选)
MONGO_INITDB_DATABASE: xxxx # 初始化数据库(可选)
volumes:
- mongodb_data:/data/db
ports:
- "27017:27017"
networks:
- network-docker
command: [--auth] # 启用连接认证。
# Redis 服务
redis:
image: redis:alpine
container_name: redis
restart: always
volumes:
- redis_data:/data
ports:
- "6379:6379"
networks:
- network-docker
server:
build:
context: ./server-dir # 假设docker-compose.yml在项目根目录
dockerfile: Dockerfile # 后端Dockerfile路径
container_name: server-name
restart: always
# 声明必须在 mongodb 以及 redis 启动成功之后,才会启动当前的服务。
# 在 server 中,如果需要访问 mongodb 以及 redis 时,需要采用域名的方式访问,或者本地的 ip,本地回环或者 localhost 是无法访问的。因为镜像内是隔离的。如:“mongodb:mongodb:xxxx”
depends_on:
- mongodb
- redis
ports:
- "3081:3081" # 暴露后端端口
volumes:
- ./server-dir:/app/xxx/server # 挂载代码(开发时有用)
- /app/xxx/server/node_modules # 防止覆盖容器内的node_modules
networks:
- network-docker
# 定义网络和数据卷
networks:
network-docker:
driver: bridge # 表示桥接宿主机
volumes:
mongodb_data:
redis_data:
Docker 镜像的调试
调试镜像
当 docker 容器启动成功后,发生错误时,可以使用如下命令查看日志
docker logs <container id>
当无法查看日志的,可以直接进入到 docker 容器内进项调试。
# 只能是在docker 正在运行的时候使用
docker exec -it <container id>
当 docker 发生了错误,正在无限重启,或者无法启动的,但是又想要调试的。
# 如果docker 正在无限重启,则允许下面的命令停止 docker
docker stop <container id>
# 最好用 /bin/sh, /bin/bash 有些镜像是不支持的。
docker run -it --rm --entrypoint=/bin/sh <image name>
# 连接成功后想退出调试,可以输入以下命令,不要带括号。
exit
项目发生了变动,需要更新镜像的。“以下命令在 docker.compose.yaml 的目录下执行。”
# 同步到docker内
git pull origin branch
# 2. 重建镜像(使用缓存优化)
docker-compose build <docker-compose.yaml 的镜像名称,对于上面示例:server、redis、mongodb>
# 3. 滚动重启
docker-compose up -d --no-deps web
# 4. 清理旧镜像
docker image prune -f
Dockerfile 文件发生了变动需要更新的。
# 停止容器但保留数据卷(volumes)和镜像
docker-compose down
# 停止单个镜像
docker stop <container id>
# 将这个镜像从容器内删除,但不删除镜像本身
docker rm <container id>
# 删除这个镜像,因为 Dockerfile 文件变了,因此需要重新构建镜像, 因此先删除
docker rmi <image id>
# 重新构建镜像
docker-compose up -d <docker-compose.yaml 的镜像名称,对于上面示例:server、redis、mongodb>,