docker教程

First Post:

Last Update:

Word Count:
2.9k

Read Time:
11 min

本教程是在 Windows 11 的 WSL2 上安装和配置 Docker ,如果不知道如何配置可以参照以下教程:WSL的安装与使用|Zenith

安装 Docker Desktop for Windows

1、下载 Docker Desktop

2、安装 Docker Desktop

  • 双击安装包,按向导完成安装。
  • 安装时勾选 “Use WSL 2 instead of Hyper-V”。
  • 新版 Docker Desktop 会自动化判断你的系统是否启用 WSL 2 并进行对应的安装
  • 安装完成会自动重启电脑,注意文件保存

3、启动 Docker Desktop

  • 安装完成后启动 Docker Desktop。可以先不登录
  • 在设置(Settings) > General 中确认勾选:(新版 Docker Desktop 默认强制勾选可以不做配置)
    • Use the WSL 2 based engine

4、检查确认 Docker 是否使用了 WSL 2

  • 在 PowerShell 中运行:

    1
    wsl -l -v

    如果看到 docker-desktop ,且版本为 2,则证明 Docker 正在使用 WSL 2。

  • 打开 WSL 2 终端(Ubuntu),运行:

    1
    docker --version

    如果看到输出版本信息,说明 Docker 已成功运行在 WSL 2 中。

直接在 ubuntu 中安装 Docker

1、更新系统包索引

1
sudo apt update

2、安装必要的包以允许apt通过HTTPS使用仓库

1
2
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 用于设置系统,准备安装来自安全(HTTPS)存储库的软件,并确保下载的软件是经过验证和可信的

3、添加 Docker 的官方 GPG 密钥

1
2
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 用于验证从远程仓库下载的文件或软件包在传输过程中没有被篡改,确保包没有被篡改或损坏

4、添加 Docker 的稳定仓库

1
2
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 在系统中添加 Docker 官方软件仓库,以便后续通过 apt 安装 Docker 及其更新

5、再次更新系统包索引

1
sudo apt update

6、安装Docker CE(社区版)

1
2
sudo apt install docker-ce
# Docker Community Edition 简称 Docker CE

7、验证Docker是否安装成功

1
sudo docker run hello-world

下载镜像

在 Docker Desktop 中下载镜像

Docker Hub 是一个公共的 Docker 镜像仓库,其中包含了大量的镜像,用户可以从中拉取镜像到本地使用

例如,要拉取一个名为 Nginx 的镜像,可以进行如下操作:

  1. 启动 Docker Desktop 进入 Images
  2. 搜索 Nginx pull 第一个镜像文件
  3. 启动 Nginx 镜像
    • 配置名字(例如:nginxweb)
    • 配置端口映射(例如:80)
    • 选择将容器中的文件存储在主机中的位置(可选)(例如:D:\nginxweb-storage)
    • 选择挂载到容器中的位置,实现容器与主机的文件共享(可选)(例如:/nginxweb)
    • 运行

在 ubuntu 中下载镜像

也可以在ubuntu中使用命令行完成:

例如,要拉取一个名为 opengauss 的镜像,可以进行如下操作:

使用以下命令拉取镜像

1
docker pull opengauss/opengauss

可以通过 docker images 命令查看当前已下载的镜像

设置 Docker 镜像源

在旧版本下设置 Docker 镜像源

由于某些不可描述的问题,Docker 官方镜像经常会拉不下来,常用方式是通过设置镜像源的方式解决(但是大部分源都已经挂了),其他方式可以自行 bing 搜索

在旧版本下 Docker Desktop 会自动创建两个 WSL2 发行版:

  • docker-desktop:运行 Docker Engine(守护进程)。
  • docker-desktop-data:存储镜像和容器数据。

进入 docker-desktop 发行版:

1
wsl -d docker-desktop

首先修改 /etc/docker/daemon.json 文件为如下格式

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
]
}

上述镜像源只是一个示例,可以自行寻找或搭建其他源

然后重启 Docker:service docker restart

可以通过 docker info 命令查看配置是否生效

在新版本下设置 Docker 镜像源

在新版本 Docker Desktop 中进行了存储优化,Docker 团队合并了 docker-desktopdocker-desktop-data 的功能:**仅保留 docker-desktop**,数据和引擎合并到一个 WSL 2 发行版。

在新版本中要通过 Docker Desktop 的 GUI 或 API 动态管理配置。

进入 Settings > Docker Engine

直接编辑 JSON 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
]
}

点击 Apply & Restart,Docker 会自动重启并应用新配置

在终端运行以下命令,检查镜像源是否已加载:

1
docker info | grep -A 10 "Registry Mirrors"

输出应包含你添加的镜像地址:

1
2
3
4
5
Registry Mirrors:
https://docker.xuanyuan.me/
https://docker.mirrors.ustc.edu.cn/
https://mirror.ccs.tencentyun.com/
https://registry.docker-cn.com/

上述镜像源只是一个示例,可以自行寻找或搭建其他源

使用容器

1、启动容器

拉取镜像成功后就可以启动容器了

或者也可以不拉取镜像直接启动容器,docker会自动下载对应的镜像文件

1
2
3
4
5
6
7
8
9
docker run -d \
--name opengauss_container \
-p 5432:5432 opengauss/opengauss
docker run --name opengauss_container \
--privileged=true \
-d \
-e GS_PASSWORD=your_password \
-e GS_USERNAME=your_username \
-p 5432:5432 opengauss/opengauss
  • --privileged:赋予容器内的进程几乎相同的权限,容器内的进程可以访问宿主机的所有设备
  • --name opengauss_container:给容器指定一个名称,这里是 opengauss_container
  • -d:表示在后台运行容器
  • -e:传递参数
  • GS_PASSWORD=your_password -e GS_USERNAME=your_username:自定义数据库账号密码
  • -p 5432:5432:将容器的 5432 端口映射到本机的 5432 端口

如果你仅仅是想创建一个容器,暂时并不想启动他,可以使用 docker create 命令

docker run 命令几乎一致,只是少了 -p 参数。使用 docker create 创建的容器,在用 docker start 启动时,默认总是以后台(detached)方式运行,不管有没有加 -d 参数

2、查看容器状态

docker ps -a 命令可以查看所有容器的状态

docker start <容器名>/<容器id>docker stop <容器名>/<容器id> 可以启动 / 停止已有容器

  • 使用 docker start 启动的容器是不需要添加参数的,会保留使用 docker run 创建时使用的参数

docker inspect <容器名>/<容器id> 可以查看容器的所有信息,其中就包括了创建时使用的参数

docker logs <容器名>/<容器id> 可以查看容器日志

  • 但是这种方式只能查看现有日志,不能刷新,可以在后面加 -f 参数使其滚动刷新追踪输出:docker logs <容器名>/<容器id> -f

3、使用容器

上面以 opengauss 数据库为例,所以接下来我们可以使用 gsql 或数据库管理工具来连接数据库。如果是其他项目,通过端口使用即可

每个 Docker 容器都是一个独立的运行环境,每个容器内部表现的都像一个独立的 Linux 系统,可以使用 docker exec <容器名>/<容器id> <想要执行的命令> 在容器内部执行命令

但是这样会非常的麻烦,可以通过 docker exec -it <容器名>/<容器id> /bin/sh 命令进入容器内部,获得一个交互式的命令行,之后可以用 exec 命令或者使用 Ctrl + D 快捷键退出到宿主机

额外介绍:Dockerfile

Dockerfile 是一个文件,用于描述镜像是如何制作的,之前用 docker pull 命令拉取的镜像就是用 Dockerfile 制作的

可以看菜鸟教程 Docker Dockerfile-菜鸟教程

额外介绍:Docker 网络

Docker 容器不光环境和宿主机隔离,网络也和宿主机隔离

Docker 主要有四种网络模式:Bridge、Host、Container、None。其中桥接模式(Bridge)和直连模式(Host)是最常用的,其余两种可以自行 bing 搜索

桥接模式

桥接模式是 Docker 的默认网路模式。所有容器都在一个子网内,通过网桥与宿主机连接,每个容器都分配了一个内部 ip 地址,容器网络与宿主机网络隔离,通过端口映射访问

可以通过 docker network create <子网名> 创建新的子网,默认创建的子网也是桥接模式,可以将指定容器加入指定的子网,子网间也是相互隔离的。并且 Docker 子网内部有 DNS 机制,可以将容器名转换为子网 ip 地址

直连模式

直接使用宿主机的 ip 地址,通过宿主机端口可以直接访问容器,无需建立端口映射。可以通过这个命令启动一个直连模式的容器:

1
docker run -d network host mysql-server

使用 docker network list 可以展示出 Docker 所有的网络

使用 docker network rm <网络id> 可以删除一个子网

额外介绍:Docker Compose

如果我们要用 Docker 部署一个完整的包含前端、后端、中间件、数据库的项目,一种容易想到的方式是分别拉取不同镜像,分别创建容器,但是这样会有三个问题

  1. 比较繁琐 复杂
  2. 项目中可能存在容器互相依赖的情况
  3. 容器的网络可能会有特殊要求

可能这时候会想到,我把所有的项目都打包到一起,跑在一个巨大的容器里。这样也会有三个问题

  1. 镜像太大
  2. 如果有一个模块挂壁了,整个项目都直接挂壁了
  3. 不方便扩容

这时候就需要 Docker Compose 出场了

Docker Compose 是一个容器编排技术,使用 yaml 文件管理多个容器,里面描述了容器之间是如何创建以及如何协同工作的,比如在启动后端项目前,需要先启动一个 MySQL 容器:

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
version: '3.8'

services:
mysql-server:
image: mysql:8.4.5
container_name: mysql-server
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql

backend:
build: ./backend
container_name: backend
depends_on:
- mysql-server
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql-server:3306/mydb
SPRING_DATASOURCE_USERNAME: myuser
SPRING_DATASOURCE_PASSWORD: mypassword
ports:
- "8080:8080"
restart: unless-stopped

volumes:
mysql_data:

这个 depends_on 字段就可以规定容器的启动顺序

在写好了 docker-compose.yaml 文件后,就可以用 docker compose up -d 一键启动了,与 docker compose 相关的还有其他命令

  • docker compose stop: 停止所有容器
  • docker compose down: 停止并删除所有容器
  • docker compose start: 启动所有容器

注意 docker compose up -d 只能识别名为 docker-compose.yaml 的文件,改个名字就无法识别了。如果要识别其他名字的 yaml 文件可以使用 -f 参数:

1
docker compose -f <文件路径> up -d

Docker Compose 只适合简单项目启动,不适合大型项目启动。对于企业级大规模服务器集群的容器编排需求,通常会使用 Kubernetes

🌧️

上述内容参考自:

高冷博学猫娘 AI

Docker 常见命令与操作 | 你不定积分没加CのBlog

使用 Docker 进行项目快速部署 | 你不定积分没加CのBlog

10分钟掌握Docker Desktop安装及使用

改变软件行业的技术!程序员、软件爱好者必须掌握的Docker,到底是什么?