Docker

Lu Lv3

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查看容器详细信息

image-20250226215805065

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
56
57
58
59
#查看运行中的容器
docker ps
#查看所有容器
docker ps -a
#搜索镜像
docker search nginx
#下载镜像
docker pull nginx
#下载指定版本镜像
docker pull nginx:1.26.0
#查看所有镜像
docker images
#删除指定id的镜像
docker rmi e784f4560448
#查看所有容器id
docker ps -aq
#删除所有容器/镜像
docker rm/rmi ${docker ps -aq}


#运行一个新容器
docker run nginx
#停止容器
docker stop keen_blackwell
#启动容器
docker start 592
#重启容器
docker restart 592
#查看容器资源占用情况
docker stats 592
#查看容器日志
docker logs 592
#删除指定容器
docker rm 592
#强制删除指定容器
docker rm -f 592
# 后台启动容器
docker run -d --name mynginx nginx
# 后台启动并暴露端口
docker run -d --name mynginx -p 80:80 nginx
# 进入容器内部
docker exec -it mynginx /bin/bash

# 提交容器变化打成一个新的镜像
docker commit -m "update index.html" mynginx mynginx:v1.0
# 保存镜像为指定文件
docker save -o mynginx.tar mynginx:v1.0
# 删除多个镜像
docker rmi bde7d154a67f 94543a6c1aef e784f4560448
# 加载镜像
docker load -i mynginx.tar


# 登录 docker hub
docker login
# 重新给镜像打标签
docker tag mynginx:v1.0 leifengyang/mynginx:v1.0
# 推送镜像
docker push leifengyang/mynginx:v1.0

存储

两种方式,注意区分:

  • 目录挂载: -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
2
3
4
5
6
7
8
9
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 构建镜像

image-20250226221050351

1
2
3
4
# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

命令说明:

  • 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

      结果:

      ![img](https://gitee.com/lusy37/typora/raw/master/202502262211623.png)

      ### 网络

      | **命令** | **说明** |
      | :------------------------ | :----------------------- |
      | 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.x3.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
2
3
4
5
6
7
8
9
10
11
12
13
services:
service_name:
image: image_name:tag
build:
context: ./path/to/Dockerfile
ports:
- "80:80"
volumes:
- ./host_path:/container_path
environment:
- VAR_NAME=value
networks:
- network_name

4. 常见的配置选项

下面是一些常见的配置选项,可以用于每个服务的定义中:

a. image (镜像)

  • 使用指定的镜像来创建容器,通常可以指定版本(标签)。
1
2
3
services:
web:
image: nginx:latest

b. build (构建)

  • 如果没有现成的镜像,您可以通过 Dockerfile 构建一个镜像。
  • context 指定构建上下文(通常是包含 Dockerfile 的目录)。
1
2
3
4
services:
app:
build:
context: ./app

c. ports (端口映射)

  • 将容器内的端口映射到宿主机的端口。格式是 宿主机端口:容器端口
1
2
3
4
5
services:
web:
image: nginx
ports:
- "8080:80"

这将容器的 80 端口映射到宿主机的 8080 端口。

d. volumes (卷挂载)

  • 将宿主机的目录或文件挂载到容器中。
1
2
3
4
5
services:
db:
image: postgres
volumes:
- ./data:/var/lib/postgresql/data

这将宿主机的 ./data 目录挂载到容器的 /var/lib/postgresql/data

e. environment (环境变量)

  • 设置环境变量,用于容器内的配置。
1
2
3
4
5
services:
app:
image: my-app
environment:
- DATABASE_URL=postgres://db:5432

f. depends_on (依赖服务)

  • 指定服务启动顺序,确保某些服务在其他服务启动之前被启动。
1
2
3
4
5
6
7
services:
web:
image: nginx
depends_on:
- db
db:
image: postgres

g. restart (自动重启策略)

  • 设置容器的重启策略。
1
2
3
4
services:
web:
image: nginx
restart: always

restart 的值可以是:

  • no(默认):容器停止后不自动重启。
  • always:容器停止时总是重启。
  • on-failure:仅在容器非正常退出时才重启。
  • unless-stopped:除非容器被手动停止,否则总是重启。

h. networks (网络)

  • 定义容器使用的自定义网络。可以使容器之间的通信更加灵活。
1
2
3
4
5
6
7
8
9
10
11
12
13
services:
web:
image: nginx
networks:
- frontend
db:
image: postgres
networks:
- frontend

networks:
frontend:
name: hmall # 可选, 如果不指定网络名, 默认是: 项目名_网络名

i. command (命令)

  • 覆盖容器的默认启动命令。
1
2
3
4
services:
app:
image: my-app
command: ["npm", "start"]

完整示例

下面是一个较为完整的 docker-compose.yml 文件,展示了如何使用这些配置选项来定义一个 Web 应用和数据库服务:

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

services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- db
networks:
- frontend
restart: always

db:
image: postgres:latest
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
restart: always

networks:
frontend:
backend:

volumes:
db_data:

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都是可选参数,比较常见的有:

image-20250226233015750

  • 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.
Comments