Docker

Docker

1. 简介

Docker 是一个开源的应用容器引擎,它可以让开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 的优势:

  1. 更高效的利用系统资源

    • 由于容器不需要运行完整的操作系统,相较于传统的虚拟机,它们对系统资源的需求更少,能够更高效地利用服务器的 CPU、内存和存储。

    • 例如,在一台服务器上可以运行数百个 Docker 容器,而传统虚拟机可能只能运行十几个。

  2. 更快的部署和启动时间

    • Docker 容器的启动时间通常在秒级,而虚拟机的启动可能需要几分钟。

    • 这使得应用能够更快地响应需求,特别是在需要快速扩展或缩容的场景中。

  3. 一致性的运行环境

    • 开发者可以在本地构建和测试 Docker 容器,然后确保在生产环境中运行的是完全相同的环境,减少了由于环境差异导致的问题。

    • 例如,一个基于 Python 开发的应用,在开发环境中使用特定版本的 Python 和相关库,通过 Docker 可以确保在生产环境中也使用相同的配置。

  4. 易于迁移和扩展

    • Docker 容器可以轻松地在不同的服务器之间迁移,无论是在本地数据中心还是在云平台上。

    • 同时,通过简单地增加或减少运行的容器数量,可以轻松地实现应用的横向扩展。

  5. 版本控制和回滚

    • 每个 Docker 镜像都可以进行版本控制,当出现问题时,可以快速回滚到之前的版本。

    • 这类似于代码的版本控制,为应用的维护和更新提供了极大的便利。

2. 核心概念

  1. 镜像(Image)

    • 镜像是 Docker 容器的只读模板,包含了运行应用所需的所有内容,如代码、运行时环境、库和依赖等。

    • 可以将镜像看作是一个类,而容器则是基于这个类创建的实例。

    • 镜像可以从 Docker Hub 等公共仓库获取,也可以自己创建和定制。

    • 例如,一个 Python 应用的镜像可能包含 Python 解释器、相关库以及应用代码。

  2. 容器(Container)

    • 容器是基于镜像创建的运行实例,它是一个独立、隔离的运行环境,可以启动、停止、删除等。

    • 多个容器可以基于同一个镜像创建,并且每个容器的运行状态相互独立。

    • 容器在运行时会在其内部产生一些数据,如日志、进程 ID 等。

  3. 仓库(Repository)

    • 仓库用于存储和管理 Docker 镜像,可以是公共的,如 Docker Hub,也可以是私有的。

    • 开发者可以将自己创建的镜像推送到仓库中,以便在不同的环境中使用。

    • 例如,一个公司可以创建自己的私有仓库来存储内部使用的镜像。

3. 安装

# 1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2

# 2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 3.安装Docker
yum makecache fast
yum -y install docker-ce

# 4.启动Docker,并设置为开机自动启动,测试
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world

4. 配置镜像源

常见国内镜像源:

  • 中国官方镜像:https://registry.docker-cn.com
  • 网易163镜像:http://hub-mirror.c.163.com
  • 中科大镜像:https://docker.mirrors.ustc.edu.cn
  • 阿里云镜像:https://[xxx].mirror.aliyuncs.com
  • 腾讯云镜像: https://mirror.ccs.tencentyun.com
  1. 打开配置文件
sudo vim /etc/docker/daemon.json
  1. 配置镜像源
{  
  "registry-mirrors": [  
    "https://registry.docker-cn.com",  
    "http://hub-mirror.c.163.com",  
    "https://docker.mirrors.ustc.edu.cn"  
    // 你可以继续添加其他镜像源地址....
  ]  
}

ps:使用云服务时最好使用相同厂商的镜像源

5. 基本命令

  1. docker pull

用于从 Docker 仓库拉取指定的镜像。

语法docker pull [OPTIONS] NAME[:TAG|@DIGEST]

示例

docker pull ubuntu:latest  # 拉取最新的 Ubuntu 镜像
  1. docker run

基于指定的镜像创建并启动一个新的容器。

语法docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用选项

  • -d:以守护式(后台)模式运行容器。
  • -p:将容器的端口映射到主机的端口。
  • -v:挂载数据卷或主机目录到容器。
  • --name:为容器指定一个名称。

示例

docker run -d -p 8080:80 --name mynginx nginx  # 后台运行一个名为 mynginx 的 Nginx 容器,将容器的 80 端口映射到主机的 8080 端口
  1. docker ps

列出正在运行的容器。

语法docker ps [OPTIONS]

常用选项

  • -a:列出所有容器,包括已停止的。

示例

docker ps  # 列出正在运行的容器
docker ps -a  # 列出所有容器
  1. docker stop

停止一个或多个正在运行的容器。

语法docker stop [OPTIONS] CONTAINER [CONTAINER...]

示例

docker stop mynginx  # 停止名为 mynginx 的容器
  1. docker start

启动一个或多个已停止的容器。

语法docker start [OPTIONS] CONTAINER [CONTAINER...]

示例

docker start mynginx  # 启动名为 mynginx 的容器
  1. docker restart

重新启动一个或多个容器。

语法docker restart [OPTIONS] CONTAINER [CONTAINER...]

示例

docker restart mynginx  # 重新启动名为 mynginx 的容器
  1. docker rm

删除一个或多个容器。

语法docker rm [OPTIONS] CONTAINER [CONTAINER...]

常用选项

  • -f:强制删除正在运行的容器。

示例

docker rm mynginx  # 删除名为 mynginx 的容器(需先停止)
docker rm -f mynginx  # 强制删除正在运行的名为 mynginx 的容器
  1. docker images

列出本地已有的镜像。

语法docker images [OPTIONS] [REPOSITORY[:TAG]]

常用选项

  • -a:列出所有镜像,包括中间层镜像。

示例

docker images  # 列出本地已有的镜像
docker images -a  # 列出所有镜像
  1. docker rmi

删除一个或多个本地镜像。

语法docker rmi [OPTIONS] IMAGE [IMAGE...]

示例

docker rmi ubuntu  # 删除名为 ubuntu 的镜像
  1. docker exec

在运行中的容器内执行命令。

语法docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

示例

docker exec -it mynginx bash  # 在名为 mynginx 的容器内打开一个交互式的 Bash 终端
  1. docker logs

查看容器的日志输出。

语法docker logs [OPTIONS] CONTAINER

常用选项

  • -f:跟踪日志输出,类似于 tail -f

示例

docker logs mynginx  # 查看名为 mynginx 的容器的日志
docker logs -f mynginx  # 跟踪名为 mynginx 的容器的日志输出
  1. docker build

用于根据指定的 Dockerfile 和上下文(Context)构建 Docker 镜像。

语法docker build [OPTIONS] PATH | URL | -

常用选项

  • -t, --tag
    • 为构建的镜像设置标签。例如:docker build -t my_image:v1.
    • 可以指定多个标签。
  • --build-arg
    • 在构建过程中传递变量值给 Dockerfile 中的 ARG 指令。例如:docker build --build-arg VERSION=1.0.
  • --file, -f
    • 指定要使用的 Dockerfile 的路径和文件名。默认情况下,Docker 会在构建上下文的根目录中查找名为 Dockerfile 的文件。
  • --no-cache
    • 构建时不使用缓存,强制重新构建所有步骤。
  • --quiet, -q
    • 抑制构建过程中的详细输出,仅显示构建的总体进度。

示例

docker build -t my_app_image -f dockerfiles/Dockerfile. # 构建一个名为 my_app_image 的镜像
  1. docker cp

用于在 Docker 容器和宿主机之间复制文件或目录。

语法docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

docker cp [OPTIONS] CONTAINER:SRC_PATH|- DEST_PATH

常用选项

  • -a:保留文件的所有属性,包括权限、所有者、时间戳等。
  • -L:跟随源文件中的符号链接。

示例

docker cp /host/path/file.txt container_name:/container/path # 将宿主机上的文件或目录复制到正在运行的容器中

docker cp container_name:/container/path/file.txt /host/path # 将容器中的文件或目录复制到宿主机

6. 容器数据卷

容器数据卷是 Docker 中用于实现数据持久化和共享的机制。它独立于容器的生命周期,可在宿主机上存在,能被挂载到容器内供其读写,确保数据在容器删除或重建后仍得以保留和访问。

使用方式

通过在 docker run 命令中使用 -v 选项来挂载数据卷到容器中。

例如:docker run -v /data/volume:/container/path image_name

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

可以通过docker inspect 容器id查看容器信息

具名挂载

为数据卷指定一个名称,方便识别和管理。

创建具名数据卷:docker volume create volume_name

挂载具名数据卷:docker run -v volume_name:/container/path image_name

匿名挂载

不指定数据卷的名称,由 Docker 自动创建和管理。

例如:docker run -v /container/path image_name ,这里没有指定数据卷的名称,即为匿名挂载。

7. Dockerfile

Dockerfile 是一个用于定义 Docker 镜像构建过程的文本文件。它包含了一系列指令,Docker 引擎会按照这些指令逐步构建出所需的镜像。

常用指令

  1. FROM

    • 指定基础镜像,后续的指令将基于这个镜像进行操作。
    • 示例:FROM ubuntu:latest
  2. RUN

    • 在镜像中执行命令。
    • 可以是单个命令,也可以是多个命令用 && 连接。
    • 示例:RUN apt-get update && apt-get install -y python3
  3. CMD

    • 指定容器启动时默认执行的命令。
    • 可以被 docker run 命令行参数覆盖。
    • 示例:CMD ["python3", "app.py"]
  4. COPY

    • 将宿主机上的文件或目录复制到镜像内。
    • 示例:COPY. /app
  5. ADD

    • 功能类似于 COPY,但还可以处理 URL 和解压缩文件。
  6. ENV

    • 设置环境变量。
    • 示例:ENV MY_VARIABLE value
  7. WORKDIR

    • 设置工作目录。
    • 示例:WORKDIR /app
  8. EXPOSE

    • 声明容器运行时监听的端口。
    • 示例:EXPOSE 8080

构建镜像

使用 docker build 命令基于 Dockerfile 构建镜像。在包含 Dockerfile 的目录下执行:

docker build -t my_image:tag.

其中 -t 指定镜像的名称和标签,. 表示当前目录为构建上下文。

示例:构建Tomcat镜像

1)编写 dokerfile 文件,使用官方命名 Dockerfile。这样的话,build 时就会自动寻找这个文件,就不用加 -f 指定文件了

FROM centos:7
MAINTAINER shenxinde<552456727@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u161-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.60.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.60
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.60
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.60/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.60/logs/catalina.out

2)构建镜像

docker build -t diytomcat:1.0 .

3)run 镜像

docker run -d -p 9090:8080 --name mytomcat -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.60/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.60/logs diytomcat

8. Docker 网络

Docker 网络模式

  1. bridge 模式(默认)
    • 每个容器都会被分配一个独立的网络栈,包括 IP 地址、子网掩码、网关等。
    • 容器通过 Docker 内置的网桥与其他容器和宿主机进行通信。
  2. host 模式
    • 容器直接使用宿主机的网络栈,与宿主机共享网络接口。
    • 容器没有自己独立的网络环境,其端口与宿主机端口直接映射。
  3. none 模式
    • 容器没有任何网络配置,完全隔离。
    • 需要手动为容器配置网络。
  4. container 模式
    • 使新创建的容器与已存在的一个容器共享网络栈。

Docker 网络命令

  1. docker network ls
    • 列出 Docker 中的所有网络。
  2. docker network inspect <network_name>
    • 查看指定网络的详细信息。

用户自定义网络

除了默认的网络模式,还可以创建自定义网络。

  1. 创建自定义网络
    • docker network create <network_name>
  2. 优点
    • 可以更好地管理容器之间的通信和访问控制。
    • 为容器分配稳定的 IP 地址。

容器间通信

  1. 同一网络中的容器
    • 可以通过容器名称或 IP 地址相互通信。
  2. 不同网络中的容器
    • 可以通过端口映射等方式实现通信。

相关推荐

  1. <span style='color:red;'>docker</span>

    docker

    2024-07-21 22:22:03      43 阅读
  2. <span style='color:red;'>Docker</span>

    Docker

    2024-07-21 22:22:03      36 阅读
  3. <span style='color:red;'>docker</span>

    docker

    2024-07-21 22:22:03      51 阅读
  4. <span style='color:red;'>Docker</span>

    Docker

    2024-07-21 22:22:03      59 阅读
  5. <span style='color:red;'>Docker</span>

    Docker

    2024-07-21 22:22:03      58 阅读
  6. Docker

    2024-07-21 22:22:03       36 阅读
  7. Docker

    2024-07-21 22:22:03       52 阅读
  8. <span style='color:red;'>Docker</span>

    Docker

    2024-07-21 22:22:03      48 阅读
  9. docker

    2024-07-21 22:22:03       47 阅读
  10. <span style='color:red;'>Docker</span>

    Docker

    2024-07-21 22:22:03      48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 22:22:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 22:22:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 22:22:03       45 阅读
  4. Python语言-面向对象

    2024-07-21 22:22:03       55 阅读

热门阅读

  1. 代码改进,模型优化,强化深度学习

    2024-07-21 22:22:03       19 阅读
  2. python 基础知识点(一)

    2024-07-21 22:22:03       17 阅读
  3. Python利用psutil库进行监控进程和资源

    2024-07-21 22:22:03       18 阅读
  4. SpringBoot RestHighLevelClient 按版本更新

    2024-07-21 22:22:03       20 阅读
  5. 跨域问题几种解决方法

    2024-07-21 22:22:03       20 阅读
  6. Python面试整理-文件处理

    2024-07-21 22:22:03       15 阅读
  7. 分式

    2024-07-21 22:22:03       18 阅读
  8. Spring WebFlux 介绍与效果演示示例

    2024-07-21 22:22:03       17 阅读
  9. django 需要修改的文件

    2024-07-21 22:22:03       21 阅读
  10. Random,ThreadLocalRandom,SecureRandom有什么区别

    2024-07-21 22:22:03       18 阅读
  11. Python 爬虫技术 第05节 异常处理

    2024-07-21 22:22:03       20 阅读
  12. 微信小程序开发:DOM 相关 API 使用详解

    2024-07-21 22:22:03       15 阅读
  13. QtQuick-QML语法

    2024-07-21 22:22:03       16 阅读
  14. Codeforces Round 960 (Div. 2)VP

    2024-07-21 22:22:03       20 阅读