为了账号安全,请及时绑定邮箱和手机立即绑定

Docker学习:新手入门完全指南

标签:
Docker 容器
概述

Docker学习涵盖了从安装到基本操作的全面指南,包括Docker的优势、应用场景以及如何构建和管理容器和镜像。文章还详细介绍了Docker的网络与存储配置,以及通过实践案例帮助读者理解如何使用Docker部署Web应用和多容器应用。

Docker学习:新手入门完全指南
Docker简介与安装

什么是Docker

Docker 是一种开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,几乎不需要进行任何修改。Docker使用客户端-服务器架构,用户通过命令行工具(Docker CLI)或编程接口(Docker API)与Docker守护进程(Docker Daemon)交互。

Docker的核心概念包括镜像(Image)、容器(Container)、仓库(Repository)等:

  • 镜像(Image):Docker镜像是一个只读模板,包含运行应用所需的一切代码、库和资源。
  • 容器(Container):容器是镜像的运行实例。容器是隔离的,拥有自己独立的文件系统,同时容器之间可以共享主机系统资源。
  • 仓库(Repository):仓库是集中存放镜像的场所,可以理解为代码控制中心。可以分为公开和私有仓库,开发者可以将自己的镜像上传到仓库,供他人下载使用。

Docker的优势与应用场景

Docker 的优势主要体现在以下几个方面:

  1. 轻量级:Docker 容器不需要虚拟机上的额外操作系统,因此资源占用较少。
  2. 可移植性:Docker 在任何地方运行的行为都是一致的,可用于不同的开发环境。
  3. 快速启动:启动一个Docker容器只需几秒钟。
  4. 版本控制:Docker 提供了清晰的镜像版本管理。
  5. 依赖管理:Docker 可以将应用与依赖打包在一起,解决了运行环境一致性的问题。
  6. 自动化部署:Docker 可以将应用程序打包成容器,通过CI/CD流程自动化部署到生产环境。

Docker的应用场景广泛,包括Web应用部署、数据库、开发测试环境、微服务架构等。

Docker的安装步骤及环境配置

安装Docker

  1. 安装前准备:确保系统已更新到最新状态。以Ubuntu为例,执行以下命令:

    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  2. 安装Docker

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
  3. 加入Docker组:为了方便使用Docker而不需要使用sudo,可以将当前用户添加到docker组:

    sudo usermod -aG docker $USER
  4. 重启电脑:为了使用户组更改生效,重启系统。

  5. 验证安装:运行以下命令验证安装是否成功:
    docker --version

配置Docker

Docker的配置主要通过Docker的配置文件/etc/docker/daemon.json来完成。以下是一个示例配置文件:

{
  "max-concurrent-downloads": 10,
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries": ["localhost:5000"],
  "debug": true,
  "tls": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server-cert.pem",
  "tlskey": "/etc/docker/server-key.pem",
  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}

配置文件中的每个键都有不同的意义,例如max-concurrent-downloads设置最大并发下载数,log-opts设置日志的最大大小和文件数量,registry-mirrors设置国内镜像源以加速镜像的下载。

Docker基本概念

容器与镜像的概念

镜像(Image)

镜像是构建容器的基础,可以认为是一个只读的模板。镜像包含了一个应用及其依赖的所有文件和配置。Docker Hub 上有很多公开的镜像,例如ubuntunginxmysql等。

容器(Container)

容器是镜像的运行实例。通过docker run命令可以基于镜像启动一个容器。容器是轻量级的,可以被创建、启动、停止、删除,并且可以共享宿主机的资源。

Dockerfile的编写与解释

Dockerfile 是用来定义镜像内容的文本文件。Dockerfile 文件包含了一系列构建镜像的指令,这些指令执行结果由Docker构建工具解释。

以下是一个简单的Dockerfile示例,用于构建一个包含Python环境的镜像:

# 使用官方的Python基础镜像
FROM python:3.7-slim

# 设置工作目录
WORKDIR /app

# 复制当前目录的内容到容器中的/app
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置环境变量
ENV NAME World

# 运行应用
CMD ["python", "app.py"]

解释:

  1. FROM python:3.7-slim:指定基础镜像为Python 3.7 slim版本。
  2. WORKDIR /app:设置工作目录。
  3. COPY . /app:将当前目录的文件复制到容器的/app目录下。
  4. RUN pip install --no-cache-dir -r requirements.txt:安装应用依赖。
  5. ENV NAME World:设置环境变量。
  6. CMD ["python", "app.py"]:运行应用的指令。

Docker仓库的使用

Docker仓库是存放Docker镜像的地方,分为公共仓库和私有仓库。公共仓库如Docker Hub,私有仓库可以是企业内部构建的。以下是推送和拉取镜像的具体步骤:

推送镜像到Docker Hub

  1. 登录Docker Hub:

    docker login --username=your_username --password=your_password
  2. 标记镜像:

    docker tag my_image your_username/my_image:tag
  3. 推送镜像:

    docker push your_username/my_image:tag
  4. 创建并使用私有仓库:以下是一个创建私有仓库的示例,首先需要安装并配置一个私有仓库,例如使用Docker Registry:
    docker run -d -p 5000:5000 --restart=always --name registry registry:2

    然后将镜像推送到私有仓库:

    docker tag my_image localhost:5000/my_image:tag
    docker push localhost:5000/my_image:tag

从Docker Hub拉取镜像

  1. 拉取镜像:

    docker pull ubuntu:latest
  2. 运行容器:
    docker run -it ubuntu:latest /bin/bash
Docker容器操作

启动、停止与删除容器

启动容器

使用docker run命令启动一个容器,示例如下:

docker run -it --name my_container ubuntu:latest /bin/bash

在上面的命令中,-it表示以交互方式运行容器,--name指定容器名称,ubuntu:latest是使用的镜像,/bin/bash是容器启动时执行的命令。

停止容器

停止运行中的容器,可以使用docker stop命令:

docker stop my_container

此命令会发送一个终止信号给容器,等待容器退出后才停止。

删除容器

删除容器使用docker rm命令:

docker rm my_container

如果容器正在运行,需要先停止,然后才能删除:

docker rm -f my_container

-f表示强制删除运行中的容器。

查看容器状态与历史记录

查看容器状态

使用docker ps查看正在运行的容器:

docker ps

使用docker ps -a查看所有容器(包括已经停止的):

docker ps -a

查看容器日志

查看容器的日志信息可以通过docker logs命令:

docker logs my_container

查看容器历史记录

查看容器的运行历史,可以使用docker history命令:

docker history ubuntu:latest

此命令显示构建该镜像的指令。

容器内操作命令

在容器中安装软件、配置服务等操作与普通的Linux系统操作一致。例如,在容器中安装Python并运行一个简单的Python脚本:

  1. 启动容器:

    docker run -it --name my_container ubuntu:latest /bin/bash
  2. 更新apt包列表:

    apt-get update
  3. 安装Python:

    apt-get install -y python3
  4. 运行Python脚本:
    python3 -c "print('Hello World')"
Docker镜像管理

构建与保存镜像

构建镜像

使用docker build命令可以根据Dockerfile构建新的镜像:

docker build -t my_image:tag .

-t参数用来指定镜像的标签(名称与版本号),.表示从当前目录读取Dockerfile文件。

保存镜像

可以使用docker save命令将镜像保存为tar文件:

docker save -o my_image.tar my_image:tag

-o参数用来指定输出文件的路径。

镜像的推送与拉取

推送镜像

推送镜像到Docker Hub的过程已经在Docker仓库的使用部分详细讲解。

拉取镜像

使用docker pull命令从Docker Hub拉取镜像:

docker pull my_image:tag

镜像的标签与版本管理

标签管理

镜像是通过标签(Tag)来区分不同版本的。可以通过以下命令查看镜像的所有标签:

docker images

使用docker tag命令为镜像添加新标签:

docker tag my_image:tag my_image:new_tag

版本管理

通过为镜像添加不同的标签,可以实现版本管理。例如:

docker tag my_image:latest my_image:1.0
docker tag my_image:latest my_image:2.0

每种标签都代表不同版本的镜像。要从不同标签中回退到旧版本,可以使用docker tag命令将旧版本镜像重新标记为当前版本。

Docker网络与存储

容器网络配置与连接

Docker容器默认使用Docker桥接网络,也可以自定义网络。

使用Docker桥接网络

在默认网络模式下,每个容器都会被分配一个IP地址,并且可以相互通信。

自定义网络

创建自定义网络,可以通过docker network命令:

docker network create my_network

将容器连接到自定义网络:

docker run -it --name my_container --network my_network ubuntu:latest /bin/bash

Docker桥接网络与自定义网络

Docker桥接网络

当创建容器时,如果没有指定网络,Docker会自动将其连接到Docker所维护的默认网络(通常是docker0)。

自定义网络

自定义网络可以提供更多的网络配置选项,例如使用不同的网络驱动(如overlay网络用于跨主机通信)。

创建自定义网络并使用:

docker network create --driver bridge my_bridge
docker run -it --network my_bridge --name my_container ubuntu:latest /bin/bash

容器存储卷的使用

存储卷是一种持久化存储的方式,它不依赖于容器的生命周期,即使容器被删除,存储卷中的数据仍然保留。

创建存储卷

创建一个新的存储卷:

docker volume create my_volume

将存储卷挂载到容器

将存储卷挂载到容器的某个目录:

docker run -v my_volume:/data -it --name my_container ubuntu:latest /bin/bash

在容器中创建一个文件,确保文件保存在挂载的存储卷上:

echo "Hello World" > /data/test.txt

启动一个新的容器,挂载同一个存储卷,验证数据是否完整:

docker run -v my_volume:/data -it --name my_container2 ubuntu:latest /bin/bash
cat /data/test.txt

复杂场景下的存储卷配置

可以配置存储卷以支持数据持久化和备份,例如使用docker volume ls命令列出所有存储卷,并使用docker volume rm命令删除不需要的存储卷。

Docker实践案例

构建简单的Web应用容器

假设要构建一个简单的Web应用容器,应用使用Flask框架。以下是完整的Dockerfile和应用代码:

准备Dockerfile

编写Dockerfile,如下:

# 使用官方的Python基础镜像
FROM python:3.7-slim

# 工作目录设置为 /app
WORKDIR /app

# 复制当前目录内容到容器的 /app
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置环境变量
ENV NAME World

# 定义运行应用的命令
CMD ["python", "app.py"]

准备应用代码

在工作目录下,创建app.py文件:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

创建requirements.txt文件:

Flask==1.1.2

构建并运行容器

执行以下命令构建并运行容器:

docker build -t my_web_app .
docker run -p 5000:5000 -d my_web_app

访问http://localhost:5000,可以看到Web应用输出的"Hello World!"。

部署多容器应用

假设需要构建一个包含Web应用和MySQL数据库的多容器应用。

准备Dockerfile和docker-compose.yml

创建docker-compose.yml文件,配置多个容器:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    links:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: exampledb

创建Dockerfile

# 使用官方的Python基础镜像
FROM python:3.7-slim

# 工作目录设置为 /app
WORKDIR /app

# 复制当前目录内容到容器的 /app
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置环境变量
ENV NAME World

# 定义运行应用的命令
CMD ["python", "app.py"]

构建和启动应用

使用以下命令启动应用:

docker-compose up -d

集成Docker到CI/CD流程

将Docker与CI/CD流程集成可以自动化构建、测试和部署流程。以GitHub Actions为例:

  1. 创建.github/workflows/docker-ci.yml 文件:

    name: Docker CI
    
    on:
      push:
        branches:
          - main
      pull_request:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
        - name: Build the Docker image
          run: docker build -t my_docker_image .
        - name: Login to the Docker registry
          uses: docker/build-push-action@v2
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
            registry: my-docker-registry.example.com
            tags: my_docker_image:latest
  2. 配置Docker Hub或私有仓库的登录凭证

    • 在GitHub仓库的Settings -> Secrets中添加Docker Hub的用户名和密码。
  3. 推送镜像到仓库
    • 当推送代码到main分支时,GitHub Actions会自动构建镜像并推送至指定的Docker仓库。

通过上述步骤,成功将Docker集成到CI/CD流程中,实现了自动化构建和部署。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消