Docker学习笔记

Docker学习笔记

Docker是容器化平台,可以构建、打包、部署和运行应用程序。

Docker可以将应用程序及依赖打包成一个轻量级的便于移植的容器,然后部署到支持Docker的平台。

安装

参照官网:https://www.docker.com/

基本概念

镜像(Image)

Docker镜像是一个只读的模板,包含了创建Docker容器的指令。

还可以基于一个镜像来创建另一个镜像并在此基础上添加一些自定义配置。

容器(Container)

Docker容器是一个独立的环境,它基于Docker镜像创建而来,Docker容器是镜像的实例,容器包含了应用程序及其运行时。

容器之间是相互隔离的,每个容器都有自己的文件系统。可以将容器看作是轻量的、便于移植的虚拟机。

Dockerfile

Dockerfile是一个文本文件,包含了一系列指令,他告诉Docker如何构建镜像。

Docker Volume

Docker Volume是Docker提供的持久化存储机制。

Docker Hub

Docker Hub是一个存储Docker镜像的公共仓库,可以上传或者下载镜像。

命令

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 查看docker版本
docker --version

# 拉取镜像
docker pull <image_name>
# 例如:拉取最新的Ubuntu镜像
docker pull ubuntu:latest

# 运行容器
docker run -it --name <container_name> <image_name>
# 例如:运行一个基于Ubuntu的容器
docker run -it --name my_ubuntu ubuntu:latest

# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 停止容器
docker stop <container_name>

# 启动容器
docker start <container_name>

# 进入运行中的容器
docker exec -it <container_name> /bin/bash

# 删除容器
docker rm <container_name>

# 删除镜像
docker rmi <image_name>

创建镜像

在项目目录下创建一个Dockerfile来创建镜像。

Dockerfile:

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用官方的Node.js镜像作为基础镜像
FROM node:18

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制项目文件
COPY . .

# 暴露应用程序的端口
EXPOSE 3000

# 启动应用
CMD ["node", "app.js"]

带有TypeScript编译阶段的Dockerfile:

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 构建阶段
FROM node:18 AS builder

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

# 假设项目使用 TypeScript,首先编译
RUN npm run build

# 生产阶段
FROM node:18-slim

WORKDIR /app

COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

EXPOSE 3000

CMD ["node", "dist/app.js"]

那么,上面的RUNCMD有什么区别?

RUN是在image文件的构建阶段执行的,CMD是在容器启动后执行的。
一个Dockerfile可以包含多个RUN,但是只能包含一个CMD。

构建镜像

bash
1
2
# .代表Dockerfile所在目录
docker build -t my-node-app .

运行容器

bash
1
2
# 将本地的3000端口映射到容器的3000端口
docker run -p 3000:3000 my-node-app

持久化

比如对于数据库容器,每次部署数据库容器都会删除原来的容器,故而容器内的数据也会被删除。

可以将数据库的数据目录挂载到主机的一个目录(或者说映射),这样就不会在部署新容器后丢失数据。

Docker Volume

使用Docker Volume

  1. 创建Docker Volume
bash
1
docker volume create mysql_data
  1. 启动MySQL并挂载Volume到容器内目录
bash
1
2
3
4
5
6
# 将mysql_data这个卷挂载到容器内的/var/lib/mysql,这个目录是MySQL数据库默认的存储位置
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v mysql_data:/var/lib/mysql \
mysql:latest

使用主机目录挂载

还可以直接将主机上的一个目录挂载到容器的MySQL数据存储目录。

  1. 创建主机目录
bash
1
mkdir -p /my/mysql_data
  1. 启动MySQL容器并挂载目录
bash
1
2
3
4
5
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /my/own/datadir:/var/lib/mysql \
mysql:latest

Docker Compose

Docker Compose是一个用于定义和管理多容器Docker应用的工具。也可以使用k8s管理Docker容器。

可以使用docker-compose.yml文件来定义应用的服务、网络和卷等。

docker-compose.yml
1
2
3
4
5
6
7
8
version: '3'
services:
app:
image: my-node-app
build:
context: .
ports:
- "3000:3000"

构建并启动docker-compose.yml中的所有服务:

bash
1
2
3
4
5
# 启动应用
docker-compose up

# 停止应用
docker-compose down

参考

  1. https://www.docker.com/
  2. https://www.runoob.com/docker/docker-tutorial.html

评论