Docker

Docker快速通关
常见命令
命令 | 说明 |
---|---|
docker pull | 拉取镜像 |
docker push | 推送镜像到DockerRegistry |
docker images | 查看本地镜像 |
docker rmi | 删除本地镜像 |
docker run | 创建并运行容器(不能重复创建) |
docker stop | 停止指定容器 |
docker start | 启动指定容器 |
docker restart | 重新启动容器 |
docker rm | 删除指定容器 |
docker ps | 查看容器 |
docker logs | 查看容器运行日志 |
docker exec | 进入容器 |
docker save | 保存镜像到本地压缩文件 |
docker load | 加载本地压缩文件到镜像 |
docker inspect | 查看容器详细信息 |
1 | 查看运行中的容器 |
存储
两种方式,注意区分:
- 目录挂载:
-v /app/nghtml:/usr/share/nginx/html
(宿主机目录必须是存在的) - 卷映射:
-v ngconf:/etc/nginx
(Docker 会自动管理卷的创建)
两种存储方式如果宿主机的目录、卷中有数据,都是以宿主机的数据为主,覆盖容器中原有的数据。
数据卷的相关命令:
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 清除数据卷 |
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
Dockerfile
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
简单示例:
- 创建dockerfile文件
1 | # 基础镜像 |
- 构建镜像
1 | # 进入镜像目录 |
命令说明:
docker build
: 就是构建一个docker镜像-t docker-demo:1.0
:-t
参数是指定镜像的名称(repository和tag).
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录:# 直接指定Dockerfile目录 docker build -t docker-demo:1.0 /root/demo
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
结果:

### 网络
| **命令** | **说明** |
| :------------------------ | :----------------------- |
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
docker中运行的容器IP是不固定的,所以需要搭建到同一个网络中,使用容器名来互相访问,实现互联。
```Bash
# 1.首先通过命令创建一个网络
docker network create hmall
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 hmall bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了hmall以外,其它都是默认的网络
# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
总结:
- 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- 在同一个自定义网络中的容器,可以通过别名互相访问
DockerCompose
docker-compose.yml
文件是用来定义和配置多个 Docker 容器服务的一个文件,它是 Docker Compose 工具的核心部分。这个文件采用 YAML(YAML Ain’t Markup Language)语法,旨在提供一种清晰、简洁的方式来描述和管理容器服务。
下面我会通过一个基本的 docker-compose.yml
文件示例来讲解常见的语法和结构:
1. 版本号 (version
)
docker-compose.yml
文件的第一部分通常是指定 Compose 文件的版本。不同的版本支持不同的功能。常见的版本包括 2.x
和 3.x
系列,3.x
是最常用的版本。
示例:
1 | version: "3.8" |
version
字段是必需的,确保你的文件可以正确解析和使用。
2. 项目名 (name
)
docker-compose.yml
文件中的 name
属性是一个可选的顶级属性,用于指定 Docker Compose 项目的名称。这个项目名会作为生成的容器、网络和卷等资源的前缀,确保不同项目之间的资源不会发生冲突。
1 | name: my_custom_project # 自定义项目名称 |
3. 服务 (services
)
services
是 Compose 文件的核心部分。它定义了一个或多个容器服务,每个服务对应一个容器。你可以为每个服务配置具体的容器镜像、构建路径、端口映射、环境变量等。
基本格式:
1 | services: |
4. 常见的配置选项
下面是一些常见的配置选项,可以用于每个服务的定义中:
a. image (镜像)
- 使用指定的镜像来创建容器,通常可以指定版本(标签)。
1 | services: |
b. build (构建)
- 如果没有现成的镜像,您可以通过 Dockerfile 构建一个镜像。
context
指定构建上下文(通常是包含 Dockerfile 的目录)。
1 | services: |
c. ports (端口映射)
- 将容器内的端口映射到宿主机的端口。格式是
宿主机端口:容器端口
。
1 | services: |
这将容器的 80 端口映射到宿主机的 8080 端口。
d. volumes (卷挂载)
- 将宿主机的目录或文件挂载到容器中。
1 | services: |
这将宿主机的 ./data
目录挂载到容器的 /var/lib/postgresql/data
。
e. environment (环境变量)
- 设置环境变量,用于容器内的配置。
1 | services: |
f. depends_on (依赖服务)
- 指定服务启动顺序,确保某些服务在其他服务启动之前被启动。
1 | services: |
g. restart (自动重启策略)
- 设置容器的重启策略。
1 | services: |
restart
的值可以是:
no
(默认):容器停止后不自动重启。always
:容器停止时总是重启。on-failure
:仅在容器非正常退出时才重启。unless-stopped
:除非容器被手动停止,否则总是重启。
h. networks (网络)
- 定义容器使用的自定义网络。可以使容器之间的通信更加灵活。
1 | services: |
i. command (命令)
- 覆盖容器的默认启动命令。
1 | services: |
完整示例
下面是一个较为完整的 docker-compose.yml
文件,展示了如何使用这些配置选项来定义一个 Web 应用和数据库服务:
1 | version: "3.8" |
5. 其他常用功能
a. 多个服务定义
你可以在 docker-compose.yml
文件中定义多个服务。例如,你可以在同一个 Compose 文件中运行 Web 服务、数据库服务、缓存服务等。
b. 使用 extends
extends
可以帮助你重用现有的服务配置,继承或覆盖某些设置(这个功能在某些版本的 Docker Compose 中已不推荐使用)。
c. 配置多个 Compose 文件
Docker Compose 支持使用多个文件来定义服务配置,可以通过 -f
选项指定多个 yml
文件来覆盖或扩展某些配置。
6. 特性
增量更新:修改 Docker Compose 文件。重新启动应用。只会触发修改项的重新启动。
数据不删:默认就算down了容器,所有挂载的卷不会被移除。比较安全
7. 基本语法
1 | docker compose [OPTIONS] [COMMAND] |
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
- Title: Docker
- Author: Lu
- Created at : 2024-07-18 06:13:22
- Updated at : 2024-07-18 08:03:58
- Link: https://lusy.ink/2024/07/18/Docker/
- License: This work is licensed under CC BY-NC-SA 4.0.