首页 > 其他分享 >docker入门

docker入门

时间:2024-06-21 20:00:30浏览次数:24  
标签:容器 入门 sudo 环境 镜像 docker Docker

前言

Docker诞生于2013年,由Solomon Hykes在DotCloud公司(后更名为Docker, Inc.)创立。Docker的核心理念是**“Build, Ship, and Run Anywhere”**,即构建、发布、运行应用程序不受环境限制。Docker通过容器化技术,将应用及其所有依赖打包到一个独立的、可移植的单元中,从而实现了一次构建,随处运行的目标。如果你生活在docker诞生之前的年代,你可能会遇到项目上线的噩梦,测试环境一切都OK的,上了生产环境就出问题。Docker的出现解放了运维人员,它完没解决了软件实施中由的环境、包依赖产生的各种次生问题。

一、docker解决的实际问题

docker具体解决问题如下:

1. 环境一致性问题

  • 问题描述: 开发环境和生产环境之间经常存在差异,这些差异可能导致应用在开发环境中正常运行,但在生产环境中出现问题。比如,开发者的操作系统、库版本、配置文件等可能与生产环境不同。

  • Docker解决方案: 通过容器技术,开发者可以将应用及其所有依赖打包成一个镜像。这个镜像在任何支持Docker的环境中运行时,都会有相同的行为和环境,从而保证了环境的一致性。

2. 依赖管理问题

  • 问题描述: 现代应用通常依赖于多个库和服务。这些依赖可能会产生冲突,特别是在不同的项目中使用不同版本的库时。

  • **Docker解决方案: ** Docker容器包含应用程序所需的所有依赖,并相互隔离。这意味着一个容器中的依赖不会影响到其他容器,确保了不同应用之间的依赖冲突问题得到解决。

3. 部署复杂性问题

  • 问题描述: 传统的应用部署过程通常是手动的,涉及配置文件修改、依赖安装等多个步骤。这不仅耗时,而且容易出错。

  • Docker解决方案: 通过Docker,整个应用及其环境可以被打包成一个镜像,并且可以在任何支持Docker的平台上运行。这样大大简化了部署过程,减少了出错的可能性。

4. 资源利用率问题

  • 问题描述: 传统的虚拟机技术虽然能够隔离不同的应用,但每个虚拟机都需要一个完整的操作系统,资源开销大,启动速度慢。

  • Docker解决方案: Docker容器共享宿主机的内核,但仍然保持进程的隔离。这使得容器更加轻量,启动速度快,资源利用率高。

5. 可移植性问题

  • 问题描述: 不同的环境(如开发、测试、生产)之间迁移应用通常是困难且复杂的,因为每个环境可能有不同的配置和依赖。

  • Docker解决方案: Docker镜像可以在任何支持Docker的环境中运行。这意味着开发者可以在本地构建和测试容器,然后直接将相同的容器部署到生产环境中,确保应用在所有环境中的行为一致。

总结: Docker诞生的背景是为了解决软件开发和部署过程中常见的环境一致性、依赖管理、部署复杂性、资源利用率以及可移植性问题。通过容器技术,Docker提供了一种轻量级、快速、隔离的解决方案,使得应用的开发、测试、部署和运行变得更加高效和可靠。

二、Docker技术介绍

2.1 什么是Docker?

Docker是一个开源的应用容器引擎,允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,或Windows和MacOS上。容器是完全使用沙箱机制,相互之间不会有任何接口。

2.2 Docker的优势

  1. 轻量级: Docker容器与传统虚拟机相比更轻量,不需要额外的操作系统开销。
  2. 快速启动: 容器化的应用启动速度非常快,通常在秒级别。
  3. 一致性环境: 确保开发、测试、生产环境的一致性,减少环境差异带来的问题。在这里插入代码片
  4. 易于扩展和迁移: Docker容器可以轻松地在不同环境中迁移和扩展。

2.3Docker的基本概念

  1. 镜像(Image): 一个只读的模板,用于创建容器。镜像可以包含应用程序和其运行环境。
  2. 容器(Container): 镜像的一个实例。可以启动、停止、移动和删除。每个容器都是相互隔离的。
  3. 仓库(Repository): 存储镜像的地方。分为公共仓库和私有仓库。

三、Linux下安装和使用Docker

3.1安装Docker

以Ubuntu为例,以下是安装Docker的步骤:

1.更新软件包索引

sudo apt-get update

2.安装必要的依赖包

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

3.添加Docker的官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. 设置Docker的稳定版仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5. 再次更新软件包索引

sudo apt-get update

6. 安装Docker CE(Community Edition)

sudo apt-get install docker-ce

7. 验证Docker是否安装成功

sudo systemctl status docker

或者

docker --version

3.2 使用Docker

1. 运行一个简单的Docker容器

sudo docker run hello-world

这条命令会从Docker Hub拉取一个名为hello-world的测试镜像,并在容器中运行它。

2. 列出所有运行中的容器

sudo docker ps

3.列出所有容器(包括未运行的)

sudo docker ps -a

4.启动一个已停止的容器

sudo docker start <容器ID>

5.停止一个运行中的容器

sudo docker stop <容器ID>

6.删除一个容器

sudo docker rm <容器ID>

7.拉取一个镜像

sudo docker pull <镜像名>

8.构建一个镜像

假设有一个名为Dockerfile的文件:

sudo docker build -t myimage:1.0 .

9.列出本地所有镜像

sudo docker images

10.删除一个镜像

sudo docker rmi <镜像ID>

11.从镜像运行一个容器

sudo docker run -it <镜像名> /bin/bash

-it 参数使容器运行在交互模式,并且打开一个终端。

12.查看容器的日志

sudo docker logs <容器ID>

13.进入一个运行中的容器

sudo docker exec -it <容器ID> /bin/bash

这条命令将打开一个在指定容器内的交互式终端。

14.查看容器的详细信息

sudo docker inspect <容器ID>

15.将容器停止并删除、

sudo docker rm -f <容器ID>

16.保存容器为镜像

sudo docker commit <容器ID> <新镜像名>

17.导出容器为tar文件

sudo docker export <容器ID> -o <文件名>.tar

18.导入tar文件为镜像

sudo docker import <文件名>.tar <新镜像名>

19.保存镜像为tar文件

sudo docker save -o <文件名>.tar <镜像名>

20.从tar文件加载镜像

sudo docker load -i <文件名>.tar

21.查看Docker的系统信息

sudo docker info

3.3安装Docker Compose

除了基本的Docker命令,Docker Compose也是一个重要的工具,允许用户定义和管理多容器Docker应用。

1.下载Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.应用可执行权限

sudo chmod +x /usr/local/bin/docker-compose

3.验证安装是否成功

docker-compose --version

3.4使用Docker Compose

1.创建一个docker-compose.yml文件

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  redis:
    image: redis

2.启动所有服务

sudo docker-compose up -d

3.查看服务状态

sudo docker-compose ps
sudo docker-compose ps

4.停止所有服务

sudo docker-compose down

5.查看服务日志

sudo docker-compose logs

通过以上步骤,你可以在Linux下成功安装、配置并使用Docker进行应用容器化管理。Docker的灵活性和强大的功能使其成为现代应用开发和部署的重要工具。

四、初学者常见的问题

1. 什么是Docker镜像和容器,二者有什么区别?

疑惑描述: 很多初学者会混淆镜像(Image)和容器(Container)的概念。
解答:

  • Docker镜像是一个只读的模板,包含了运行应用程序所需的所有文件和配置。镜像是静态的。你还记得机器猫用的那台照相机吗,用这台照相机把想要的东西拍下来,然后将拍摄下来的照片放在地上,加热水在照片上等3秒钟,就会把这个东西微缩模型造出来。这个照片你就可以理解为Docker镜像。而那个生成的3D模型就是Docker镜像。你也可以对比类和类的实例对象一样,镜像是类,容器是类的实例。
  • Docker容器是镜像的一个运行实例,是动态的。容器包含镜像的内容,并且在容器内可以运行应用、修改文件等。

2. Docker容器如何实现隔离,为什么比虚拟机更高效?

疑惑描述: 初学者可能不理解容器和虚拟机的隔离机制以及它们的性能差异。

解答:

  • 隔离机制: Docker容器利用操作系统的内核功能(如cgroups和namespaces)来实现进程和资源的隔离。每个容器运行在其独立的环境中,但共享宿主机的操作系统内核。
  • 性能: 因为容器不需要像虚拟机那样加载一个完整的操作系统,它们启动速度更快,占用的资源更少。虚拟机需要虚拟化一个完整的硬件环境和操作系统,而容器只虚拟化应用层和其依赖。

3.如何持久化数据,避免数据在容器删除后丢失?

**疑惑描述:**容器本身是短暂的,数据如何在容器重启或删除后保留?

解答:

  • 数据卷(Volumes):Docker提供了数据卷来实现持久化数据。数据卷独立于容器的生命周期,即使容器被删除,数据卷中的数据依然保留。
docker run -v /host/path:/container/path myimage
  • 绑定挂载(Bind Mounts):将宿主机上的目录挂载到容器中,类似于数据卷,但更灵活。

4.Dockerfile是什么,它如何工作?

疑惑描述: 很多初学者不知道如何创建和使用Dockerfile。

解答:

  • Dockerfile是一个文本文件,包含一系列指令,用于描述如何构建Docker镜像。
  • 每个指令在镜像上执行一个操作,如安装软件、复制文件、设置环境变量等。
  • 一个简单的Dockerfile示例:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3
COPY . /app
WORKDIR /app
CMD ["python3", "app.py"]
  • 使用docker build -t myimage .命令根据Dockerfile构建镜像。

五、docker技术的优势的实例

假设我们有一个使用Flask开发的Web应用,数据库使用MySQL。我们将比较在开发和测试、生产环境中,使用Docker和不使用Docker技术的区别,重点突出Docker在环境隔离和依赖管理方面的优点。

5.1 不使用Docker的开发和部署

开发和测试环境

1.安装依赖
  • 开发者需要在本地安装Python和Flask。
  • 安装MySQL数据库。
  • 使用requirements.txt安装Flask和其他Python依赖。
  • 配置虚拟环境(例如venv)以隔离项目的依赖。
  • 配置MySQL数据库(例如数据库名、用户、密码)。
2.运行应用
python app.py
3.可能遇到的问题
  • 不同开发者的环境配置可能不同,导致代码在某些开发者的环境中运行失败。
  • MySQL版本不一致可能导致数据库兼容性问题。
  • 依赖包版本冲突,特别是在多个项目共用一个环境时。

生产环境

1.部署依赖
  • 在服务器上安装Python和Flask。
  • 安装和配置MySQL数据库。
  • 使用requirements.txt安装Flask和其他Python依赖。
  • 确保生产环境的配置和开发环境一致。
2.运行应用
  • 配置和启动Flask应用,可能使用gunicorn等WASGI服务器。
  • 确保MySQL数据库服务正常运行。
3.可能遇到的问题
  • 生产环境和开发环境之间的配置差异导致应用不兼容。
  • 手动安装和配置依赖,容易出错且耗时。
  • 版本不一致和环境依赖问题,导致生产环境下的应用运行异常。

5.2 使用Docker的开发和部署

开发和测试环境

1.创建Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]
2.创建docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      - FLASK_ENV=development
      - DATABASE_URI=mysql://user:password@db/dbname

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: dbname
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
3.启动开发环境
docker-compose up
4.优势
  • 所有开发者使用相同的Docker镜像和容器,确保环境一致性。
  • 依赖和配置在Dockerfile和docker-compose.yml中定义,避免手动安装和配置。
  • 容器化的MySQL确保数据库版本一致,不同项目之间互不影响。

生产环境

1. 配置Docker镜像和Compose文件
  • 使用相同的Dockerfile和docker-compose.yml文件,可以在生产环境中部署。
  • 生产环境可能需要调整一些配置,如环境变量和数据库连接信息。
2. 构建和启动容器
docker-compose -f docker-compose.prod.yml up -d --build
3. 优势
  • 镜像构建一次,可以在不同环境中使用,保证开发、测试、生产环境的一致性。

  • 容器化的部署简化了依赖管理和环境配置,减少出错的可能性。

  • 易于扩展和缩减服务,通过Docker Compose可以轻松管理多容器应用。

    5.3 总结

  • 不使用Docker: 依赖手动安装和配置,容易出现环境不一致、依赖冲突等问题,增加开发和部署的复杂性和风险。

  • 使用Docker: 通过容器技术实现环境隔离和依赖管理,确保开发、测试、生产环境的一致性,简化部署过程,提高效率和可靠性。

  • Docker的优势在于提供了一个可移植、轻量级的运行环境,确保应用在任何地方都能一致运行,从而极大地减少了环境差异带来的问题。

标签:容器,入门,sudo,环境,镜像,docker,Docker
From: https://blog.csdn.net/way311/article/details/139867764

相关文章

  • Flask新手入门(一)
    前言Flask是一个用Python编写的轻量级Web应用框架。它最初由ArminRonacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包,提供了各种用于Web应用开发的工具和函数。自发布以来,Flask因其简洁和灵活性而迅速受到开发者的欢迎。随着Python社区的增长,Fl......
  • DockerHub镜像无法下载的多种解决方案
    hub.docker.com和国内几家DockerHub镜像服务平台陆续下架,停止服务。给使用的同学造成非常大的困扰。汇总了几种目前有效的解决方案,希望能帮助到大家。因为有些链接有时效性,可以关注文中链接的issue。(2024年6月中旬测试可用)Docker镜像加速站为了加速镜像拉取,使用以下命令设......
  • Windows C++ 应用软件开发从入门到精通详解
    目录1、引言2、IDE开发环境介绍2.1、VisualStudio 2.2、QTCreator3、Windows平台实用小工具介绍3.1、代码编辑器VSCode3.2、代码查看编辑器SourceInsight3.3、文本编辑器Notepad++3.4、文件搜索工具Everything4、C++语言特性4.1、熟悉泛型编程4.2、了解......
  • 迁移与备份、Dockerfile、docker 私有仓库
    【迁移与备份】1#1镜像从哪来的?21dockerpull拉的,远程仓库--》国内镜像站342通过容器打包成镜像5-centos镜像运行成容器---》装了vim6-把装了vim的容器---》打包成镜像7-以后拿到这个镜像--》再运行成容器,都会带......
  • docker文章参考及初步了解
    docker简介:docker是一种轻量级的操作系统虚拟机解决方案。 docker组件由三部分构成:1.docker服务端与客户端:dockers服务端与客户端可以是多对多的关系,但是客户端和服务端进行通信是通过服务端的守护进程,即客户端连接到服务端的守护进程来连接服务端。2.镜像与容器:镜像类似为类......
  • Java入门指南:大一新生的编程初体验
    引言作为一名大一新生,踏入编程世界可能会让人感到既兴奋又有些忐忑。Java作为一种广泛使用的编程语言,以其强大的功能和跨平台的特性,成为了许多计算机科学课程的首选。本文将带你一起走进Java的世界,分享一些入门的知识和学习经验,希望对刚开始学习Java的你有所帮助。1.为什么......
  • 从 Docker Hub 拉取镜像受阻?试试这些解决方案
    最近一段时间Docker镜像一直是Pull不下来的状态,感觉除了挂......
  • Ubuntu 20.04 上安装和使用 Docker
    如何在Ubuntu20.04上安装和使用Docker如何在Ubuntu20.04上安装和使用Docker-阿里云开发者社区(aliyun.com) 简介:本文最先发布在:https://www.itcoder.tech/posts/how-to-install-and-use-docker-on-ubuntu-20-04/Docker是一个开源的容器化平台,它允许你构建,......
  • vscode python编程入门与插件推荐
    使用背景作者是一名ai测开工程师,工作环境中通常会使用到pythonshellpostgresql数据库jupyter,shh工具git版本控制等,因此向选用一个适合自己的文本编辑软件,经过长时间磨合,最终选择VScode作为我的工作软件优点内存占用率低,集成度高,开源免费插件推荐AI助手:codegeex此插件......
  • 从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
    最近一段时间Docker镜像一直是Pull不下来的状态,感觉除了挂......