自学内容网 自学内容网

Docker学习【干货教程】

目录

​编辑

1. 什么是Docker

2. Docker常见命令

2.1 镜像

2.2 容器 

2.3 进阶命令 

3 Docker存储

3.1 目录挂载

3.2 卷映射

3.3 目录挂载与卷映射对比不同

3.3.1 写法不同

3.3.2 优先级不同

4. Docker网络

4.1 Docker网络模式

4.1.1 Bridge(桥接网络)

4.1.2 Host(主机网络)

4.1.3 None(无网络)

4.1.4 Overlay(覆盖网络)

4.1.5 Macvlan网络

4.2 自定义网络

4.2.1 设置自定义网络

4.2.2 绑定自定义网络

5. Docker Compose

5.1 一般的命令式运行容器

5.2 Docker Compose一键启动

5.3 Compose 特征

5.3.1 增量更新

5.3.2 数据不删

6. Dockerfile

6.1 语法

6.2 命令

7. 总结 


1. 什么是Docker

        想象一下,你是一名厨师,想要在不同地方开设多家餐厅。每家餐厅都需要相同的厨房设备、食材和食谱来确保菜品的味道一致。但每个新地点可能有不同的条件:有的地方的烤箱型号不同,有的地方的冰箱温度设置不准确,还有的地方可能缺少某些特定的调料。

        为了保证菜品质量的一致性,你可以选择将整个厨房打包成一个可移动的模块,包括所有必要的设备、工具和食材,并且这个模块可以轻松地从一个地方搬到另一个地方,而不需要担心外部环境的影响。这样,无论你在哪里开设新餐厅,只要插上电源,打开水龙头,就可以立即开始烹饪了。

        Docker 就像是这样一个“可移动厨房”,它允许开发者将应用程序及其所有依赖(比如数据库、配置文件等)打包到一个独立的小盒子(容器)中。这个小盒子可以在任何安装了 Docker 的机器上运行,无论是开发者的笔记本电脑、测试服务器还是生产服务器。由于容器内部环境是完全隔离且一致的,因此可以确保应用程序在任何地方都能以相同的方式运行,消除了“在我的机器上能正常工作”的问题。

如果你没有安装docker,可以点击下面的文章用作参考。

【CentOS7】Linux安装Docker容器 (超详细)-CSDN博客

2. Docker常见命令

2.1 镜像

镜像:相当于你的标准化厨房蓝图,定义了厨房里应该有什么设备和工具。它是一个轻量级、独立且可执行的软件包,包含了运行应用程序所需的一切:代码、运行时环境、工具、库以及配置文件。镜像定义了容器创建时的样子,确保无论在哪里启动容器,其内部环境都是一致的。

#查看运行中的容器
docker ps
#查看所有容器
docker ps -a
#搜索镜像
docker search nginx
#下载镜像
docker pull nginx
#下载指定版本镜像
docker pull nginx:1.26.0
#查看所有镜像
docker images
#删除指定id的镜像
docker rmi 镜像名

2.2 容器 

容器:根据镜像创建的实际运行中的厨房实例,就像是按照蓝图搭建好的、正在使用的厨房。它是一种轻量级、可移植的软件包,它包含了运行应用程序所需的一切:代码、运行时环境、系统工具、库和配置文件。

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

2.3 进阶命令 

# 提交容器变化打成一个新的镜像
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

注意:Docker hub是一个在线仓库,类似于存放各种厨房设计图的地方。里面存放着各种各样的 Docker 镜像,既有官方维护的基础镜像(如官方的 Ubuntu、Nginx、MySQL 等),也有社区成员和企业用户上传的自定义镜像。

3 Docker存储

3.1 目录挂载

目录挂载:是一种将宿主机上的文件系统目录与容器内的目录关联的技术。通过这种方式,你可以让容器访问宿主机上的文件或目录,或者反过来将容器内部的数据持久化到宿主机上

docker run -d -p 99:80 \
-v /app/nghtml:/usr/share/nginx/html \
--name app03 \
nginx

其中 -v就是目录挂载命令 /app/nghtml 是宿主机中的目录,/usr/share/nginx/html 是nginx容器默认存放静态资源的目录。

3.2 卷映射

卷映射:是 Docker 中用于将容器内的目录与宿主机上的目录或 Docker 卷关联的技术。默认情况下它会创建一个位于 /var/lib/docker/volumes 下的特殊目录来存放数据。

docker run -d -p 99:80 \
-v ngconf:/etc/nginx \
--name app03 \
nginx

如上所示,ngconf 是一个命名卷的名字,它被挂载到了容器内的 /etc/nginx 目录。这使得 Nginx 的配置文件可以持久化保存在这个卷中,即使容器被删除,卷中的数据仍然存在。如果你对 Nginx 进行了任何配置更改,这些更改会保存在卷中,而不会随着容器的销毁而丢失。

3.3 目录挂载与卷映射对比不同

3.3.1 写法不同

目录挂载 是以路径写法开始的,如下图所示。

卷映射 是以变量名写法开始的,如下图所示。

3.3.2 优先级不同

目录挂载 以外部宿主机的文件夹为准,当容器第一次启动,如果外部的宿主机没有数据,那么挂载到容器里也会没有数据。

卷映射 以容器内部为准,当容器第一次启动,如果容器内部有数据,它会自动映射到外部宿主机。

4. Docker网络

Docker 网络功能允许容器之间以及容器与外部网络进行通信。理解 Docker 的网络机制对于构建高效、安全和可扩展的应用程序至关重要。

4.1 Docker网络模式

Docker 提供了几种不同的网络模式,每种模式适用于不同的使用场景。

4.1.1 Bridge(桥接网络)
# 启动一个容器并连接到默认的 bridge 网络
docker run -d --name container1 nginx

默认模式:当没有特别指定时,容器会自动连接到一个名为 bridge 的默认网络。

特点:每个容器都会被分配一个私有的 IP 地址,并通过 Docker 内置的 NAT 规则访问外部网络。容器可以通过容器名互相解析对方的 IP 地址。

试用场景:适合大多数应用开发和测试环境,提供了较好的隔离性和安全性。

4.1.2 Host(主机网络)
# 启动一个容器并使用 host 网络模式
docker run -d --name container2 --network host nginx

无隔离:容器直接使用宿主机的网络栈,共享相同的网络命名空间。容器内的进程可以绑定到宿主机的任意端口。

特点:性能最佳,因为没有额外的网络层开销;但缺乏隔离性,可能会导致端口冲突。

试用场景:适用于对网络性能要求极高的应用或需要直接访问宿主机网络接口的情况。

4.1.3 None(无网络)
# 启动一个容器并使用 none 网络模式
docker run -d --name container3 --network none busybox

完全隔离:容器不配置任何网络接口,除了回环设备外没有任何网络连接

特点:最严格的网络隔离,适用于不需要网络连接的容器。

试用场景:用于运行不需要网络访问的任务或服务。

4.1.4 Overlay(覆盖网络)
# 在 Swarm 模式下创建一个 overlay 网络
docker network create --driver overlay my-overlay-network

# 启动一个容器并连接到 overlay 网络
docker service create --name web --network my-overlay-network nginx

跨主机通信:允许在多个 Docker 宿主机之间创建一个虚拟网络,使不同宿主机上的容器能够相互通信。

特点:支持多主机环境下的容器联网,常用于 Swarm 模式或其他分布式系统。

试用场景:适合微服务架构或多节点集群环境。

4.1.5 Macvlan网络
# 创建一个 macvlan 网络,假设宿主机有一个名为 eth0 的网络接口
docker network create -d macvlan \
  --subnet=192.168.1.0/24 --gateway=192.168.1.1 \
  -o parent=eth0 my-macvlan-network


# 启动一个容器并连接到 macvlan 网络
docker run -d --name container4 --network my-macvlan-network nginx

独立子网:为每个容器分配一个独立的 MAC 地址,使其看起来就像连接到了物理网络中的不同设备。

特点:提供更好的网络隔离,同时让容器可以直接接入外部网络,无需经过 NAT。

使用场景:适用于需要容器直接暴露在网络中的情况,如模拟真实的网络拓扑结构。

4.2 自定义网络

通过创建独立的自定义网络,你可以将相关的容器组隔离开来,确保只有特定的容器能够互相通信。例如,你可以在一个网络中放置前端应用容器,在另一个网络中放置数据库容器,防止不必要的交互。

4.2.1 设置自定义网络
docker network create mynet
4.2.2 绑定自定义网络
docker run -d -p 99:90 --name nginx1 --network mynet nginx

docker run -d -p 77:80 --name nginx2 --network mynet nginx

Docker自定义网络详见这里!!!

5. Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过docker-compose.yml 文件,你可以配置应用程序的服务、网络和卷,然后使用单个命令启动整个应用程序环境。

5.1 一般的命令式运行容器

#创建网络
docker network create blog

#启动mysql
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network blog \
mysql:8.0

#启动wordpress
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress:/var/www/html \
--restart always --name wordpress-app \
--network blog \
wordpress:latest

上面分别启动了两个容器,可以看见,如果容器很多的话,一个一个命令输入起来麻烦。

5.2 Docker Compose一键启动

compose.yml 文件

name: myblog
services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=wordpress
    volumes:
      - mysql-data:/var/lib/mysql
      - /app/myconf:/etc/mysql/conf.d
    restart: always
    networks:
      - blog

  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html
    restart: always
    networks:
      - blog
    depends_on:
      - mysql

volumes:
  mysql-data:
  wordpress:

networks:
  blog:

启动命令

# 在 compose.yaml 文件所在的目录下执行
docker compose up -d

这样就一键启动了mysql和wordpress两个容器,并实现了各项配置,如指定镜像、如卷映射、目录挂载、端口映射, 自定义网络连接等等。

停止服务

# 停止所有正在运行的容器
# 移出这些容器
# 移出由Compose创建的网络

docker compose down

5.3 Compose 特征

5.3.1 增量更新

修改 Docker Compose 文件。重新启动应用。只会触发修改项的重新启动。

比如上面我启动了两个容器mysql和wordpress,如果compose.yml文件中我只修改了mysql的镜像,再次重新启动compose.yml文件,只会重启mysql容器,而wordpress容器不会发生变化。

5.3.2 数据不删

默认就算down了容器,所有挂载的卷不会被移除。比较安全。

6. Dockerfile

Dockerfile 是一个文本文件,它包含了用于构建 Docker 镜像的一系列指令。通过dockerfile,你可以定义应用程序的运行环境,包括操作系统、依赖库、配置文件以及启动命令等。这使得 Docker 镜像可以被一致地构建和部署,确保了开发、测试和生产环境之间的兼容性。

可以换一种思路,假设你有一个 Java 应用程序,你想把它打包成一个可以在任何地方运行的“盒子”。你可以写一个dockerfile 来描述具体怎么做。

6.1 语法

dockerfile文件

FROM openjdk:17

LABEL author=leifengyang

COPY app.jar /app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

(1) 指定基础镜像为 openjdk:17 这是官方的 OpenJDK 17 镜像,包含了 JDK 和 JRE,适用于运行 Java 应用程序。

(2) LABEL标签用于描述镜像的元数据,这里指定作者信息。

(3) 将宿主机上的 app.jar 文件复制到镜像中的 /app.jar 路径。

(4) 声明容器运行时监听的端口为 8080。

(5) 设置容器启动时执行的命令为 java -jar /app.jar

6.2 命令

通过dockerfile文件构建镜像

docker build -f dockerfile -t myjavaapp .

其中,dockerfile是文件名, myjavaapp是构建的镜像名称

运行镜像

docker run -d -p 8080:8080 myjavaapp

 如果你想通过 dockerfile 实战操作一下,加深了解,可以参考下面的文章

Dockerfile 构建java镜像并运行部署java项目!!!

7. 总结 

        以上内容涵盖了 Docker 大部分的基础知识,也是我学习 Docker 的路线。由于篇幅原因,一些附加知识包括如何下载Docker、Dockerfile构建镜像运行java环境等都发在了其他文章中,包括我学习的链接。我都一并放在了下面。如果有兴趣可以点击链接查看。希望游览之后对你有所帮助😀。

1. Docker - 快速通关 (3h)

【CentOS7】Linux安装Docker容器 (超详细)-CSDN博客

 Dockerfile 构建java镜像并运行部署java项目-CSDN博客

 Docker自定义网络,让容器之间相互通信-CSDN博客


原文地址:https://blog.csdn.net/qq_58195504/article/details/145057457

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!