WikiWiki
首页
Java开发
Java面试
Linux手册
  • AI相关
  • Python Flask
  • Pytorch
  • youlo8
SEO
uniapp小程序
Vue前端
work
数据库
软件设计师
入门指南
首页
Java开发
Java面试
Linux手册
  • AI相关
  • Python Flask
  • Pytorch
  • youlo8
SEO
uniapp小程序
Vue前端
work
数据库
软件设计师
入门指南
  • Docker技术笔记
  • Ubuntu LVM 根分区扩容到 500G 详细操作手册
  • UbuntuJava环境搭建手册
  • mysql5.7主从配置手册
  • 内网nginx部署与负载均衡手册
  • 服务器资源整理
  • 账本docker部署手册

Docker技术文档

导学

image-20241124012240282

一、Docker的介绍和安装

Docker官网 中文版本 课程电子书

1.容器技术介绍

什么是container(容器)?

容器是一种快速的打包技术

Package Software into Standardized Units for Development,Shipment and Deployment
  • 标准化
  • 轻量级
  • 易移植

Linux Container容器技术的诞生(2008年)就解决了IT世界里"集装箱运输"的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要由Namespace和Cgroup两大机制来保证实现

  • Namespace命名空间主要用于资源的隔离
  • Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。

image-20241124013117153

2.Docker的安装与介绍

image-20241124014620298

Windows安装

  • 安装Docker Windows版本,需要开启BIOS 虚拟化

使用 PowerShell 启用 Hyper-V 在 Windows 上启用 Hyper-V | Microsoft Learn

  1. 以管理员身份打开 PowerShell 控制台。
  2. 运行以下命令
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

如果未找到此命令,请确保你以管理员身份运行 PowerShell。

  1. 安装完成时,请重新启动。

使用 CMD 和 DISM 启用 Hyper-V

部署映像服务和管理工具 (DISM) 可帮助配置 Windows 和 Windows 映像。 在众多应用程序中,DISM 可以在操作系统运行时启用 Windows 功能。

使用 DISM 启用 Hyper-V 角色

  1. 以管理员身份打开 PowerShell 或 CMD 会话。
  2. 输入以下命令
DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V

显示正在启用 Hyper-V 的控制台窗口。

有关 DISM 的详细信息,请参阅 DISM 技术参考。

通过“设置”启用 Hyper-V 角色

  1. 导航到“控制面板”。
  2. 选择“程序”,然后选择“程序和功能”。
  3. 选择“打开或关闭 Windows 功能”。
  4. 选择“Hyper-V”,然后选择“确定”。

Windows 程序和功能对话框

安装完成后,系统会提示你重启计算机。

Docker安装

Docker Desktop: The #1 Containerization Tool for Developers | Docker

下载后打开

验证CMD

docker version

安装 Windows10 WSL2 环境和 Docker#

如果大家使用Windows10的话,比较建议大家安装WSL2

我在Youtube和B站上有相关的系列视频,感兴趣的可以观看(观看地址在下面)

win10-wsl2

Windows10 WSL2环境的搭建系列视频

youtube

Windows10开发环境搭建(YouTube)

B站

Windows10开发环境搭建(B站)

Mac 安裝

请下载安装 Docker Desktop for Mac, 注意版本

https://docs.docker.com/docker-for-mac/install/

  • intel芯片,请选择 Mac with intel chip
  • M1芯片,请选择 Mac with Apple chip

Linux安装

适用于所有Linux版本

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh  需要sudo 权限

脚本会判断linux版本,选择合适命令去安装

验证

sudo docker version

启动docker

sudo systemctl start docker

二、容器快速上手

1.Docker基本命令

docker version 查看版本
Client: Docker Engine - Community
 Version:           26.1.4  //docker版本
 API version:       1.45   //API版本
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64  //操作系統版本/CPU架构
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64  //操作系統版本/CPU架构
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

常用命令示例

  1. run

创建并启动一个新的容器

docker run -d -p [外部端口]:[内部端口] [镜像名]
  1. exec

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

docker exec -it [容器名] [命令]
  1. ps

列出所有容器

docker ps

列出所有正在运行的容器

docker ps -a
  1. build
docker build -t [镜像名] .
docker build -t my_image_name .
  1. pull

从Docker Hub下载一个镜像

docker pull [镜像名]
docker pull nginx
  1. push

将镜像上传到Docker Hub

docker push [用户名]/[镜像名]
docker push my_account/my_image_name
  1. images
docker images
  1. login
docker login
  1. logout
docker logout
  1. search
docker search [关键词]
docker search nginx
  1. version

显示Docker版本信息

docker version
  1. info

显示系统范围的信息

docker info

其他命令示例

  1. attach

将本地的标准输入、输出和错误流附加到正在运行的容器

docker attach [容器名]
docker attach my_container
  1. commit

根据容器的更改创建一个新的镜像

docker commit [容器名] [新镜像名]
docker commit my_container my_new_image
  1. cp

在容器与本地文件系统之间复制文件或目录

docker cp [本地路径] [容器名]:[容器内路径]
docker cp /local/file.txt my_container:/container/path/
  1. create

创建一个新的容器

docker create -p [外部端口]:[内部端口] [镜像名]
docker create -p 8080:80 nginx
  1. diff

检查容器文件系统的文件或目录的变化

docker diff [容器名]
docker diff my_container
  1. events

获取来自服务器的实时事件

docker events
  1. export

导出容器的文件系统作为一个tar存档文件

docker export [容器名] > [文件名].tar
docker export my_container > container.tar
  1. history

显示镜像的历史记录

docker history [镜像名]
docker history nginx
  1. import

从tarball导入内容以创建文件系统镜像

cat [文件名].tar | docker import - [新镜像名]
cat container.tar | docker import - my_new_image
  1. inspect

返回Docker对象的底层信息

docker inspect [对象名]
docker inspect my_container
  1. kill

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

docker kill [容器名]
docker kill my_container
  1. load

从tar存档或STDIN加载一个镜像

docker load < [文件名].tar
docker load < image.tar
  1. logs

获取容器的日志

docker logs [容器名]
docker logs my_container
  1. pause

暂停一个或多个容器中的所有进程

docker pause [容器名]
docker pause my_container
  1. port

列出容器的端口映射或特定映射

docker port [容器名]
docker port my_container
  1. rename

重命名一个容器

docker rename [旧容器名] [新容器名]
docker rename old_name new_name
  1. restart

重启一个或多个容器

docker restart [容器名]
docker restart my_container
  1. rm

删除一个或多个容器

docker rm [容器名]
docker rm my_container
  1. rmi

删除一个或多个镜像

docker rmi [镜像名]
docker rmi my_image
  1. save

将一个或多个镜像保存为tar存档

docker save -o [文件名].tar [镜像名]
docker save -o image.tar my_image
  1. start

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

docker start [容器名]
docker start my_container
  1. stats

显示容器资源使用情况的实时流

docker stats [容器名]
docker stats my_container
  1. stop

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

docker stop [容器名]
docker stop my_container
  1. tag

创建指向源镜像的目标镜像标签

docker tag [源镜像名] [目标镜像名]
docker tag my_image my_account/my_image_name
  1. top

显示容器中的运行进程

docker top [容器名]
docker top my_container
  1. unpause

解除暂停一个或多个容器中的所有进程

docker unpause [容器名]
docker unpause my_container
  1. update

更新一个或多个容器的配置

docker update [选项] [容器名]
docker update --restart always my_container
  1. wait

阻塞直到一个或多个容器停止,然后打印它们的退出代码

docker wait [容器名]

2.镜像和容器

image镜像

  • Docker image是一个 read-only 文件
  • 这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件
  • 可以理解成一个模板
  • docker image具有分层的概念

container容器

  • “一个运行中的docker image”
  • 实质是复制image并在image最上层加上一层 read-write 的层 (称之为 container layer ,容器层)
  • 基于同一个image可以创建多个container

docker-image-vs-container

3.创建容器

创建容器:image不存在会自动取docker hup 上下载

docker container run nginx 

当前正在运行的container

docker container ls

删除容器

docker rm [容器ID]

查看容器

docker ps -a
docker ps

停止容器

docker stop [容器名/id]

4.命令技巧批量操作

注意:不能直接删除正在运行的容器

批量停止容器

docker stop [容器名/id] [容器名/id] [容器名/id]
docker ps -aq (之列出id)
docler stop $(docker ps -qa)  //批量停止容器

批量删除

docker rm $(docker ps -aq)

5.容器的attached和detached

docker run -p 80:80 nginx
docker run -d -p 80:80 nginx    -d detached 后台执行
docker attach [id]		进入attach模式 非后台执行模式

6.容器的交互模式

docker logs [id]   打印容器日志
docker logs -f [id]   动态跟踪日志
docker run -it [名称/ubuntu] sh  使用交互式模式运行
可以直接进入容器的shell
exit 退出shell 容器也会停止
docker exec -it [id] sh		进入正在运行的容器的内部
exit 退出shell 容器不会停止

7.容器和虚拟机

docker-vs-vm

容器不是Mini虚拟机

  • 容器其实是进程Containers are just processes
  • 容器中的进程被限制了对CPU内存等资源的访问
  • 当进程停止后,容器就退出了

容器的进程process

以下是在Ubuntu20.04中演示,因Windows环境下的Docker和Linux具有一些差异。pstree 命令需要额外安装,可以使用 yum install psmisc 或者 sudo apt-get install psmisc 安装

➜  ~ docker container run -d nginx
57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0
➜  ~ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
57fe4033dd7e   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   80/tcp    festive_proskuriakova
➜  ~ docker container top 57f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7646                7625                0                   12:14               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            7718                7646                0                   12:14               ?                   00:00:00            nginx: worker process
➜  ~
➜  ~
➜  ~  ps -aef --forest
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May14 ?        00:00:00 /init
root       157     1  0 May14 ?        00:00:00 /init
root       523   157  0 May14 ?        00:02:32  \_ /usr/bin/dockerd -p /var/run/docker.pid
root       545   523  0 May14 ?        00:25:55  |   \_ containerd --config /var/run/docker/containerd/containerd.toml --log-level info
root      7625   157  0 12:14 ?        00:00:00  \_ /usr/bin/containerd-shim-runc-v2 -namespace moby -id 57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0 -address /var/run/d
root      7646  7625  0 12:14 ?        00:00:00      \_ nginx: master process nginx -g daemon off;
systemd+  7718  7646  0 12:14 ?        00:00:00          \_ nginx: worker process
root      6442     1  0 May18 ?        00:00:00 /init
root      6443  6442  0 May18 ?        00:00:00  \_ /init
penxiao   6444  6443  0 May18 pts/2    00:00:01      \_ -zsh
penxiao   7770  6444  0 12:15 pts/2    00:00:00          \_ ps -aef --forest
➜  ~
➜  ~ pstree -halps 7718
init,1
└─init,157
    └─containerd-shim,7625 -namespace moby -id 57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0 -address /var/run/docker/containerd/containerd.sock
        └─nginx,7646
            └─nginx,7718

查看容器进程

docker top [id]

通过容器可以创建多个进程

ps aux | grep nginx
pstree -halps 9930 查看进程

docker container run 背后发生了什么?

$ docker container run -d --publish 80:80 --name webhost nginx
  • 在本地查找是否有nginx这个image镜像,但是没有发现
  • 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
  • 下载最新版本的nginx镜像 (nginx:latest 默认)
  • 基于nginx镜像来创建一个新的容器,并且准备运行
  • docker engine分配给这个容器一个虚拟IP地址
  • 在宿主机上打开80端口并把容器的80端口转发到宿主机上
  • 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)

三、镜像的创建管理和发布

1.镜像的获取方式

  • pull from registry (online) 从registry拉取
    • public(公有)
    • private(私有)
  • build from Dockerfile (online) 从Dockerfile构建
  • load from file (offline) 文件导入 (离线)

docker-image

2.Docker Image Registry

docker地址 quay.io

账号:1372065855@qq.com

密码:yanpeng2580

3.从Registry拉取镜像

镜像的基本操作

docker image

镜像的拉取Pull Image

默认从Docker Hub拉取,如果不指定版本,会拉取最新版

docker pull nginx

指定版本

docker pull nginx:1.20.0

从Quay上拉取镜像

docker pull quay.io/bitnami/nginx

镜像的查看

docker image ls

镜像的删除

docker image rm 0922eabe1625

显示特定镜像的详细信息

docker image inspect [ImageID]

注意:删除镜像必须要删除运行过镜像的容器。

4.镜像的导出和导入 (offline)

导出镜像文件

docker image save nginx:1.20.0 -o nginx.image

导入镜像文件

docker image load -i .\nginx.image

5.Dockerfile 介绍

https://docs.docker.com/engine/reference/builder/

  • Dockerfile是用于构建docker镜像的文件
  • Dockerfile里包含了构建镜像所需的“指令”
  • Dockerfile有其特定的语法规则

举例:执行一个Python程序

容器即进程,所以镜像就是一个运行这个进程所需要的环境。

假如我们要在一台ubuntu 22.04上运行下面这个hello.py的Python程序

hello.py的文件内容:

print("hello docker")

第一步,准备Python环境

apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev

第二步,运行hello.py

$ python3 hello.py
hello docker

一个Dockerfile的基本结构

FROM ubuntu:22.04  //docker image 基础镜像(虚拟机)
RUN apt-get update && \  //安装依赖以及包
    DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev
ADD hello.py / //添加到镜像根目录Hello.py文件
CMD ["python3", "/hello.py"]  //执行Hello.py

6.镜像的构建和分享

构建DockerFile

docker image build -t hello .

-t: 标签名称

.: 当前目录

如何把镜像上传到Dockerhub

打包镜像

docker image build -t [账号ID]/[名称]:[版本号]

PUSH

  • 登录
docker login
  • push
docker image push [账号ID]/[名称]:[版本号]

拉取

docker pull [账号ID]/[名称]:[版本号]

运行

docker run [账号ID]/[名称]:[版本号]

7.通过commit创建镜像

把当前容器打包成镜像,可以保存容器内更改过的数据

docker container commit [容器ID] [账号ID]/[名称]:[版本号]
docker container commit [容器ID] [账号ID]/[名称]:[版本号] python3 /hello.py

8.关于 scratch 镜像

Scratch是一个空的Docker镜像。

通过scratch来构建一个基础镜像。

hello.c
#include <stdio.h>
int main()
{
    printf("hello docker\n");
}

编译成一个二进制文件

$ gcc --static -o hello hello.c
$ ./hello
hello docker
$
Dockerfile
FROM scratch [这里是空镜像]
ADD hello /
CMD ["/hello"]

构建

$ docker build -t hello .
$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hello        latest    2936e77a9daa   40 minutes ago   872kB

运行

$ docker container run -it hello
hello docker

4.1

最近更新:: 2025/8/21 14:43
Contributors: yanpeng_
Next
Ubuntu LVM 根分区扩容到 500G 详细操作手册