03.Docker 入门
1. 安装 Docker
Linux 安装(Ubuntu/Debian)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
|
Linux 安装(CentOS/RHEL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker sudo systemctl enable docker
sudo usermod -aG docker $USER
|
Windows 安装
- 确保已启用 WSL 2
- 下载并安装 Docker Desktop for Windows
- 在设置中启用 WSL 2 集成
验证安装
1 2 3 4 5 6 7 8 9
| docker --version
docker info
docker run hello-world
|
2. 第一个容器
让我们运行第一个容器:
发生了什么?
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
| ┌─────────────────────────────────────────────────────────────┐ │ docker run hello-world 执行流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. Docker 客户端发送命令给 Docker Daemon │ │ │ │ │ ▼ │ │ 2. Docker Daemon 检查本地是否有 hello-world 镜像 │ │ │ │ │ ┌───────┴───────┐ │ │ │ 本地有镜像? │ │ │ └───────┬───────┘ │ │ No │ Yes │ │ │ └────────────────┐ │ │ ▼ │ │ │ 3. 从 Docker Hub 拉取镜像 │ │ │ │ │ │ │ └────────────────────────┤ │ │ ▼ │ │ 4. 基于镜像创建容器 │ │ │ │ │ ▼ │ │ 5. 运行容器,输出 Hello from Docker! │ │ │ │ │ ▼ │ │ 6. 容器执行完毕,自动停止 │ │ │ └─────────────────────────────────────────────────────────────┘
|
3. 镜像操作
常用命令速查表
| 命令 |
说明 |
示例 |
docker images |
列出本地镜像 |
docker images |
docker pull |
拉取镜像 |
docker pull nginx:latest |
docker search |
搜索镜像 |
docker search mysql |
docker rmi |
删除镜像 |
docker rmi nginx:latest |
docker tag |
给镜像打标签 |
docker tag nginx:latest myrepo/nginx:v1 |
docker build |
构建镜像 |
docker build -t myapp:v1 . |
docker push |
推送镜像 |
docker push myrepo/myapp:v1 |
[!NOTE]
删除全部镜像:docker rmi $(docker images -q)
实战示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker search nginx
docker pull nginx:latest
docker images
docker inspect nginx:latest
docker history nginx:latest
docker rmi nginx:latest
|
4. 容器操作
常用命令速查表
| 命令 |
说明 |
示例 |
docker run |
创建并启动容器 |
docker run -d nginx |
docker ps |
列出运行中的容器 |
docker ps |
docker ps -a |
列出所有容器 |
docker ps -a |
docker start |
启动已停止的容器 |
docker start container_id |
docker stop |
停止容器 |
docker stop container_id |
docker restart |
重启容器 |
docker restart container_id |
docker rm |
删除容器 |
docker rm container_id |
docker exec |
在容器中执行命令 |
docker exec -it container_id bash |
docker logs |
查看容器日志 |
docker logs -f container_id |
实战示例
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
|
docker run -d -p 8080:80 --name my-nginx nginx
docker ps
docker logs my-nginx
docker logs -f my-nginx
docker exec -it my-nginx bash
docker exec my-nginx cat /etc/nginx/nginx.conf
docker stop my-nginx
docker start my-nginx
docker stop my-nginx && docker rm my-nginx
docker rm -f my-nginx
|
docker run 常用参数
1 2 3 4 5 6 7 8 9 10 11 12
| docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach -p, --publish -v, --volume -e, --env --name --restart --network -it --rm
|
5. 数据持久化
容器默认是无状态的,容器删除后数据就丢失了。Docker 提供两种数据持久化方式:
数据卷(Volume)
由 Docker 管理的持久化存储,推荐使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker volume create my-data
docker volume ls
docker run -d \ --name mysql-db \ -v my-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0
docker volume inspect my-data
docker volume rm my-data
docker volume prune
|
挂载目录(Bind Mount)
将宿主机目录挂载到容器中。
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run -d \ --name nginx-web \ -p 8080:80 \ -v $(pwd)/html:/usr/share/nginx/html \ nginx
docker run -d \ --name nginx-web \ -p 8080:80 \ -v $(pwd)/html:/usr/share/nginx/html:ro \ nginx
|
数据卷 vs 挂载目录
| 特性 |
数据卷 (Volume) |
挂载目录 (Bind Mount) |
| 管理方式 |
Docker 管理 |
用户管理 |
| 存储位置 |
Docker 目录下 |
任意宿主机目录 |
| 可移植性 |
高 |
依赖宿主机路径 |
| 适用场景 |
数据持久化 |
配置文件、代码共享 |
6. 网络配置
Docker 提供多种网络模式:
网络模式
| 模式 |
说明 |
| bridge |
默认模式,容器通过虚拟网桥连接 |
| host |
容器直接使用宿主机网络 |
| none |
禁用网络 |
| container |
与其他容器共享网络 |
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker network ls
docker network create my-network
docker run -d --name app --network my-network nginx
docker network connect my-network container_name
docker network inspect my-network
docker network rm my-network
|
容器间通信
在同一网络中的容器可以通过容器名互相访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker network create app-network
docker run -d \ --name mysql \ --network app-network \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0
docker run -d \ --name app \ --network app-network \ -e DATABASE_HOST=mysql \ my-app
|