Docker 基础知识
Docker 初识
1. 什么是Docker
Docker 是一种轻量级的容器技术,可以在容器内运行应用程序和服务。它可以让开发人员和运维人员更轻松地打包、交付和运行应用程序,从而提高了应用程序的可移植性、可靠性和安全性。
2. Docker 的出现主要解决的问题
Docker 的出现主要是解决了软件开发、交付和部署的问题。在传统的软件开发流程中,开发人员通常需要在本地安装开发环境和依赖,而这些环境和依赖在不同的开发人员之间可能存在差异,导致应用程序在不同的环境中运行时出现问题。此外,可以将应用程序及其依赖打包到一个可移植的容器中,使得应用程序在不同的环境中运行时具有一致的行为, 并且可以方便地进行部署和管理。因此,Docker的出现主要解决了应用程序的可移植性和一致性、快速部署、灵活性和可重复性等问题。
3. Docker 的主要优点和应用场景
a. 轻量级和高效性: Docker 容器使用的资源很少,因此可以在一个物理机上运行多个容器,提高了硬件利 用率和应用程序的效率;
b. 可移植性: Docker 容器包含了所有运行应用程序所需的依赖项和配置,因此可以轻松地在不同的环境中 运行;
c. 一致性和可重复性: Docker 容器可以确保应用程序在不同的环境中以相同的方式运行,从而提高了应用 程序的一致性和可重复性;
d. 快速部署和交付: Docker 容器可以快速地部署和交付,减少了开发、测试和生产环境之间的差异,提高了 应用程序的交付速度。
4. Docker 容器与传统虚拟机的区别
a. 架构不同: 虚拟机是一种完整的虚拟化技术,需要运行一个完整的操作系统, 而Docker 容器是基于操作系统级别的虚拟化技术, 容器共享宿主机的操作系统内核;
b. 资源占用: 虚拟机启动时需要分配一定的CPU,内存和存储资源,而Docker 容器只需要分配所需的资源, 不会浪费多余的资源;
c. 启动速度: 虚拟机启动是需要加载完整的操作系统,并启动各种服务, 启动速度较慢, 而Docker 容器只需要启动应用程序和依赖项,可以快速部署和迁移;
d. 部署方式: 虚拟机镜像通常很大, 需要使用专门的工具进行部署,而Docker 容器镜像只包含应用程序及其依赖项, 可以快速的部署和迁移;
e.网络与安全: 虚拟机通常需要单独配置网络和安全策略, 而Docker 容器可以共享宿主机的网络和安全策略.
总体来看,Docker 容器想对于传统的虚拟机来说,更加的轻量级,启动速度更快,资源占用更少,更易于管理和迁移.但是,虚拟机可以提供更高的隔离性和安全性,适用于一些对安全性要求较高的场景.
Docker 相关基本概念
1. Docker 镜像
Docker 镜像是 Docker 容器运行所需的文件系统快照和配置文件的集合,可以看作是一个可执行的软件包,其中包含了运行容器所需的所有内容,包括操作系统、应用程序、库文件、依赖项等。使用 Docker 镜像可以方便地创建、部署、移植和共享容器,是 Docker 技术的核心概念之一。
## 常用命令
> docker images # 查看所有镜像 docker image ls 同理
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB
mysql 8.0.29 33037edcac9b 10 months ago 444MB
> docker rmi [镜像ID号] # 镜像删除 注: 删除镜像时必须保证不存在基于该镜像构建的容器存在,否则无法删除
Untagged: hello-world:latest
Untagged: hello-world@sha256:fc6cf906cbfa013e80938cdf0bb199fbdbb86d6e3e013783e5a766f50f5dbce0
Deleted: sha256:9c7a54a9a43cca047013b82af109fe963fde787f63f9e016fdc3384500c2823d
Deleted: sha256:01bb4fce3eb1b56b05adf99504dafd31907a5aadac736e36b27595c8b92f07f1
> docker search hello-world # 镜像查找
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
hello-world Hello World! (an example of minimal Dockeriz… 2032 [OK]
rancher/hello-world 4
okteto/hello-world 0
golift/hello-world Hello World Go-App built by Go Lift Applicat… 0
tacc/hello-world 0
armswdev/c-hello-world Simple hello-world C program on Alpine Linux… 0
tutum/hello-world Image to test docker deployments. Has Apache… 90 [OK]
thomaspoignant/hello-world-rest-json This project is a REST hello-world API to bu… 2
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 153
> docker pull hello-world # 镜像拉取 在不标注标签的情况下,默认下载latest版本
Using default tag: latest
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:fc6cf906cbfa013e80938cdf0bb199fbdbb86d6e3e013783e5a766f50f5dbce0
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
# 其他的一些命令说明
build -- Build an image from a Dockerfile
history -- Show the history of an image
import -- Import the contents from a tarball to create a filesystem image
inspect -- Display detailed information on one or more images
load -- Load an image from a tar archive or STDIN
ls -- List images
prune -- Remove unused images
pull -- Download an image from a registry
push -- Upload an image to a registry
save -- Save one or more images to a tar archive (streamed to STDOUT by default)
tag -- Tag an image into a repository
Docker 镜像的创建和管理是通过 Dockerfile 文件来实现的,Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于定义容器的构建流程和配置信息。通过 Dockerfile 文件,可以定义容器的基础镜像、安装依赖项、配置环境变量、运行命令等操作,最终生成一个可执行的 Docker 镜像。
Docker 镜像可以通过 Docker Hub 或者私有镜像仓库来共享和分发,用户可以在这些镜像仓库中搜索和下载所需的镜像,也可以将自己创建的镜像上传到仓库中,供其他用户使用。镜像仓库还提供了版本管理、安全扫描、镜像签名等功能,可以帮助用户更好地管理和维护 Docker 镜像。
Docker 官方镜像查看地址: https://hub.docker.com/
2. Docker 容器
Docker 容器是 Docker 技术中的一个核心概念,它是一个独立、轻量、可移植的运行环境,可以在其中运行应用程序和服务。Docker 容器是基于 Docker 镜像创建的,每个容器都包含了 Docker 镜像的一个运行实例。
# 容器运行 说明: --name 容器命名 -v 文件挂载 -p 端口映射 -d 容器持久化运行
> docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -p 8088:80 -d nginx
# 容器 日志查看命令
> docker logs [容器ID]
# 容器查看
> docker ps -a # -a 显示全部容器包括暂停运行的容器
# 容器删除
> docker rm [容器ID]
# 进入容器
> docker exec -it [容器ID] /bin/bash # 部分容器需要替换为 /bin/sh
# 其他命令
attach -- Attach to a running container
commit -- Create a new image from a container's changes
cp -- Copy files/folders between a container and the local filesystem
create -- Create a new container
diff -- Inspect changes on a container's filesystem
exec -- Execute a command in a running container
export -- Export a container's filesystem as a tar archive
inspect -- Display detailed information on one or more containers
kill -- Kill one or more running containers
logs -- Fetch the logs of a container
ls -- List containers
pause -- Pause all processes within one or more containers
port -- List port mappings or a specific mapping for the container
prune -- Remove all stopped containers
rename -- Rename a container
restart -- Restart one or more containers
rm -- Remove one or more containers
run -- Create and run a new container from an image
start -- Start one or more stopped containers
stats -- Display a live stream of container(s) resource usage statistics
stop -- Stop one or more running containers
top -- Display the running processes of a container
unpause -- Unpause all processes within one or more containers
update -- Update configuration of one or more containers
wait -- Block until one or more containers stop, then print their exit codes
Docker 镜像与容器之间的关系
-
镜像是容器的基础,是一个只读的模板,包含了运行容器所需的所有文件、配置和依赖项等信息。可以通过 Dockerfile 文件或者从 Docker Hub 上下载镜像来创建自己的镜像。
-
容器是由镜像创建的一个可运行的实例,可以被启动、停止、删除等操作。容器可以在运行时对文件系统进行读写操作,并且可以通过端口映射等方式与外部网络进行通信。
-
容器与镜像之间是一对多的关系,即一个镜像可以创建多个容器实例。容器的状态和数据可以随时保存或删除,而镜像是不可修改的。
-
容器可以通过 Dockerfile 文件中的指令或者 Docker run 命令中的参数来进行配置和个性化定制。例如,可以通过 Dockerfile 中的 ENV 指令设置环境变量,或者通过 Docker run 命令中的 -v 选项挂载主机目录等。
总之,Docker 镜像是容器的基础,容器是镜像的可运行实例,容器可以通过镜像来创建,同时容器也可以通过修改和保存来生成新的镜像。