Docker入门_Docker

Docker 简介

Docker主要目标是Build,也就是通过对应组件的封装,分发,部署,运行等生命周期的管理,是web应用或者数据库等等,集运行环境能够做到一次封装,到处运行;

Docker的运行逻辑:

Docker入门_Windows_02

Docker 和传统虚拟化方式的不同之处:

  1. 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用
    进程;
  2. 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
    因此容器要比传统虚拟机更为轻便。
  3. 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资

Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。

和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。

Docker的好处:
一次构建,随处运行

  1. 更快速的应用交付和部署
  2. 更便捷的升级和扩缩容
  3. 更简单的系统运维
  4. 更高效的计算资源利用

Docker跟vmware虚拟机一样都是运行于Linux 和 Windows 上的软件,用于创建、管理和编排容器。

Docker入门_容器_03

Docker的安装

Windows安装Docker

配置要求:
Windows 10 Pro(专业版) / Enterprise(企业版) / Education(教育版)(1607 Anniversary Update、Build 14393 或者更新的版本)。

Windows 必须是 64 位的版本。

需要启用 Windows 操作系统中的 Hyper-V 和容器特性

Docker入门_linux_04

开启相应的功能后按需要重启系统;

​下载Docker​

Docker部署原理

Docker入门_容器_05

或者直接安装在window里面(这样会省去虚拟机的开销,同理linux)
安装结束后 cmd界面查看安装的信息;

C:\Windows\system32>docker version
Client:
Cloud integration: v1.0.25
Version: 20.10.16
API version: 1.41
Go version: go1.17.10
Git commit: aa7e414
Built: Thu May 12 09:17:07 2022
OS/Arch: windows/amd64 #操作系统属性
Context: default
Experimental: true

Server: Docker Desktop 4.9.1 (81317)
Engine:
Version: 20.10.16
API version: 1.41 (minimum version 1.12)
Go version: go1.17.10
Git commit: f756502
Built: Thu May 12 09:15:42 2022
OS/Arch: linux/amd64 #操作系统属性
Experimental: false
containerd:
Version: 1.6.4
GitCommit: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
runc:
Version: 1.1.1
GitCommit: v1.1.1-0-g52de29d
docker-init:
Version: 0.19.0
GitCommit: de40ad0

可以看到Docker容器有两种容器,默认是运行在linux系统上的(因为开启了wsl功能—安装时也提示推荐在wsl2上运行)

如果没有开启wsl会优先运行在windows 中,

Docker入门_Windows_06

想要运行原生 Windows 容器(Native Windows Container),可以右击 Windows 通知栏中的 Docker 鲸鱼图标,并选择“切换到 Windows 容器”。

或者使用命令行来完成切换

C:\Program Files\Docker\Docker>.\dockercli -SwitchDaemon

一些常用命令—

C:\Program Files\Docker\Docker>docker image ls  #docker镜像 信息
REPOSITORY TAG IMAGE ID CREATED SIZE

C:\Program Files\Docker\Docker>docker container ls # docker 容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker system info   #docker 系统信息

Docker入门_容器_07


windows版本包括 Docker 引擎,Docker Compose ,Docker Machine,以及Docker Notary 命令行;

验证各个模块已经安装成功---->>

C:\Program Files\Docker\Docker>docker --version  #docker版本
Docker version 20.10.16, build aa7e414

C:\Program Files\Docker\Docker>docker-compose --version #docker构成版本
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g 21 Apr 2020

Docker Machine 被废弃了,新版本出了DockerDeskTop便于管理容器

Docker入门_docker_08


但是考虑到以前的版本,还是有必要了解一下的;

docker-machine的工作模式—
(default) Creating VirtualBox VM… #创建虚拟环境
(default) Creating SSH key… # 使用ssh链接(设置中可以改为非SSH,但是这样不安全)
(default) Starting VM…

$ docker-machine create -d virtualbox default
Running pre-create checks...
Creating machine...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting VM...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env default

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.188:2376 v1.9.1

$ eval "$(docker-machine env default)"

$ docker run busybox echo hello world
Unable to find image 'busybox:latest' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
hello world


$ docker-machine ls # 列出docker运行时的状态--包括运行的地址 端口
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.188:2376 v1.9.1

$ eval "$(docker-machine env default)"

$ docker run busybox echo hello world
Unable to find image 'busybox:latest' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
hello world

#创建一个新容器
$ docker-machine create -d digitalocean --digitalocean-access-token=secret staging
Creating SSH key...
Creating Digital Ocean droplet...
To see how to connect Docker to this machine, run: docker-machine env staging

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.188:2376 v1.9.1
staging - digitalocean Running tcp://203.0.113.81:2376 v1.9.1

最新版的docker简化了我们命令行管理容器的成本,但是在服务器端环境基本都是命令行操作,所以 还是需要掌握使用的命令;

如果您主要在较旧的 Mac 或 Windows 笔记本电脑或台式机上工作,而这些笔记本电脑或台式机不符合新的 Docker for Mac 和 Docker for Windows 应用程序的要求,则需要 Docker Machine 在本地运行 Docker Engine。使用 Docker Toolbox 安装程序在 Mac 或 Windows 机箱上安装 Docker 计算机可使用 Docker 引擎预配本地虚拟机,使您能够连接它并运行命令。docker
命令有些多,可以查一下api

看到一条 信息---->>
在WSL2上运行Docker的性能要比wsl1高,

因为它是由 Microsoft 构建的完整 Linux 内核,允许 Linux 发行版运行而无需管理虚拟机。在 WSL 2 上运行 Docker Desktop,用户可以利用 Linux 工作区,避免同时维护 Linux 和 Windows 构建脚本。此外,WSL 2 还改进了文件系统共享和启动时间,并允许 Docker Desktop 用户访问一些很酷的新功能。

Docker Desktop 使用 WSL 2 中的动态内存分配功能,大大提高了资源消耗。这意味着,Docker Desktop 仅使用所需的 CPU 和内存资源,同时支持 CPU 和内存密集型任务(如构建容器)以更快地运行。

此外,在 WSL 2 中,在冷启动后启动 Docker 守护程序所需的时间要快得多。启动 Docker 守护程序只需不到 10 秒,而以前版本的 Docker Desktop 只需近一分钟。

这里重点以linux系统中的docker操作进行展开

Linux安装Docker

linux安装Docker Desktop系统配置要求:

  1. 64 位内核和 CPU 支持虚拟化
  2. KVM 虚拟化支持。按照 KVM 虚拟化支持说明检查是否启用了 KVM 内核模块以及如何提供对 kvm 设备的访问。
  3. QEMU 必须是版本 5.2 或更高版本。我们建议升级到最新版本。
  4. ,系统初始化系统。
  5. .Gnome 或 KDE 桌面环境。- 对于许多Linux发行版,Gnome环境不支持托盘图标。要添加对托盘图标的支持,您需要安装 Gnome 扩展。例如,AppIndicator)。
  6. 至少 4 GB 的内存。

这里以fedora35为例,有很多安装的方式,这里采用最便捷的方式

sudo yum install docker

然后

查看安装的结果–>>

Docker入门_容器_09


设置docker为开机自启动

[root@Gavin bin]# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

安装最新版本的docker

这里说明一下为什么要安装最新版本—

Docker入门_容器_10


还是以fedora35为例

  1. 设置存储库
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager \
--add-repo \
https://download.docker.com/linux/fedora/docker-ce.repo
  1. 安装 Docker 引擎
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin

这里没有弹出GPG密钥,如果其他版本的fedora弹出了,请验证是否匹配,如果是,请接受它。

060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35

此时docker应安装完毕,如果想要安装特定版本的,可以

[root@Gavin docker]# dnf list docker-ce  --showduplicates | sort -r

Installed Packages
docker-ce.x86_64 3:20.10.17-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.17-3.fc35 @docker-ce-stable
docker-ce.x86_64 3:20.10.16-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.15-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.14-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.13-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.12-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.11-3.fc35 docker-ce-stable
docker-ce.x86_64 3:20.10.10-3.fc35 docker-ce-stable

安装特定版本---->>

sudo dnf -y install docker-ce-3:20.10.17-3 docker-ce-cli-3:20.10.17-3 containerd.io docker-compose-plugin

这里安装通用版本

检查默认上下文关系

[root@Gavin docker]# docker context inspect default
[
{
"Name": "default",
"Metadata": {
"StackOrchestrator": "swarm"
},
"Endpoints": {
"docker": {
"Host": "unix:///var/run/docker.sock",
"SkipTLSVerify": false
}
},
"TLSMaterial": {},
"Storage": {
"MetadataPath": "\u003cIN MEMORY\u003e",
"TLSPath": "\u003cIN MEMORY\u003e"
}
}
]

Docker 容器:

Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可
以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简
易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程
序。容器的定义和镜像几乎一模一样,也是**一堆层的统一视角,**唯一区别在于容器的最上面那一层是可读可写的。

仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。

仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓
库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。
国内的公开仓库包括阿里云 、网易云 等

镜像文件

image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,
也就是我们的容器
至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来
就可以了。

Docker镜像源配置

docker的服务器在国外,如果拉取镜像的话会比较慢,国内有阿里云,网易云华为云等可以使用;

配置阿里云镜像源加速器

创建新的上下文

[root@Gavin docker]# docker context create docker-test --default-stack-orchestrator=swarm --docker host=unix://var/run/docker.sock
docker-test
Successfully created context "docker-test"

注意:默认上下文的行为与手动创建的上下文不同。它没有配置文件,并且会根据当前配置动态更新。例如,如果您使用 切换当前的 Kubernetes 配置,则默认的 Docker 上下文会将自身动态更新到新的 Kubernetes 端点;

创建一个配置,其中 **Kubernetes 作为默认业务流程协调程序,**使用存储在 中的现有 kubeconfig。为此,您需要在 中提供一个有效的 kubeconfig 文件。如果您的 kubeconfig 有多个上下文,则将使用当前上下文;

使用不同的上下文

切换上下文

docker context use

[root@Gavin zzy]# docker context use docker-test

docker-test
Current context is now "docker-test"

定义活动docker容器
以验证“docker-test”上下文现在是否为活动上下文。

[root@Gavin zzy]# export DOCKER_CONTEXT=docker-test
[root@Gavin zzy]# docker context ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
docker-test * unix://var/run/docker.sock swarm

导入导出Docker上下文

导出docker上下文

docker context export docker-test

检查导出文件的内容。

[root@Gavin zzy]# cat docker-test.dockercontext
meta.json0000644000000000000000000000022200000000000011022 0ustar0000000000000000{"Name":"docker-test","Metadata":{"StackOrchestrator":"swarm"},"Endpoints":{"docker":{"Host":"unix://var/run/docker.sock","SkipTLSVerify":false}}}tls0000700000000000000000000000000000000000000007716 5ustar0000000000000000[root@Gavin zzy]#

导入docker上下文

docker context import docker-test docker-test.dockercontext

导出 Kubernetes 上下文

注意:仅当要导出的上下文配置了 Kubernetes 端点时,才能导出 Kubernetes 上下文。

dockerdesktop与docker Engine

由于最新版本的docker是以dockerdesktop可视化管理安装的,在这之前是通过docker Engine来管理 容器的;
虽然可以同时运行 Docker Desktop 和 Docker Engine,但在某些情况下,**同时运行这两个引擎可能会导致 映射容器的网络端口 冲突问题,**一般使用一种管理docker的工具即可;

如果在同一台计算机上安装了 Docker Desktop 和 Docker Engine,则可以运行命令在 Docker Desktop 和 Docker 引擎上下文之间切换。

[zzy@Gavin ~]$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
desktop-linux npipe:./pipe/dockerDesktopLinuxEngine
[zzy@Gavin ~]$ docker context use default
default
Current context is now "default"
[zzy@Gavin ~]$ docker context use desktop-linux
desktop-linux
Current context is now "desktop-linux"
[zzy@Gavin ~]$

docker Context 命令:
单个 Docker CLI 可以有多个上下文。每个上下文都包含管理不同群集或节点所需的所有端点和安全信息。通过docker context该命令,可以轻松配置这些上下文并在它们之间切换;

单个docker客户端可能配置了两个上下文,
dev-k8s 和 prod-swarm。

dev-k8s 包含**端点数据和安全凭证,**用于开发环境中配置和管理kubernetes集群;

pro-swarm包含在生产环境中管理swarm集群所需的一切;

Docker的镜像运行

C:\Users\Gavin>docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Docker存储驱动的选择

每一个docker容器都有一个本地存储空间,用于保存层叠的镜像层,以及挂载的容器文件系统,默认请款下,容器的读写操作都发生在其镜像挂载的文件系统中,Docker在linux中有不同的存储驱动实现方式,每一种方式都采用不同的方法了镜像层和实现写时复制;

Docker在Linux中的可选存储驱动---->>






在Linux指定存储驱动

修改daemon.json文件;

例如:

Docker入门_容器_11

{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.directlvm_device=/dev/xdf",
"dm.thinp_percent=95",
"dm.thinp_metapercent=1",
"dm.thinp_autoextend_threshold=80",
"dm.thinp_autoextend_percent=20",
"dm.directlvm_device_force=false"
]
}

DeviceMapper—>>

大部分Linux存储驱动不需要或需要很少的配置。但是,Device Mapper通常需要合理配置之后才能表现出良好的性能。

配置解析—>>

dm.directlvm_device=/dev/xdf

设置块设备的位置,为了达到最佳性能,块设备应当位于本地高性能的RAID或者外部的RAID存储阵列上;

dm.thinp_percent=95

设置了镜像和容器允许的最大的使用空间占比—默认95%

dm.thinp_metapercent=1

元数据的存储空间占比默认1%

dm.thinp_autoextend_threshold=80

设置LVM自动扩展精简池的阈值,默认80%

dm.thinp_autoextend_percent=20

触发精简池自动扩容机制的时候,扩容的大小应当占有的空间比例;

dm.directlvm_device_force=false
允许用户决定是否将块设备格式化为新的文件系统;

Docker在Win中的存储驱动---->>

windowsfilter

Docker入门_容器_12

Docker 常用命令

Docker入门_linux_13

C:\Users\Gavin>docker version  #查看docker版本
Client:
Cloud integration: v1.0.25
Version: 20.10.16
API version: 1.41
Go version: go1.17.10
Git commit: aa7e414
Built: Thu May 12 09:17:07 2022
OS/Arch: windows/amd64
Context: default
Experimental: true

Server: Docker Desktop 4.9.1 (81317)
Engine:
Version: 20.10.16
API version: 1.41 (minimum version 1.12)
Go version: go1.17.10
Git commit: f756502
Built: Thu May 12 09:15:42 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.4
GitCommit: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
runc:
Version: 1.1.1
GitCommit: v1.1.1-0-g52de29d
docker-init:
Version: 0.19.0
GitCommit: de40ad0

C:\Users\Gavin>docker --version #这个是查看docker client和dockerdesktop的版本
Docker version 20.10.16, build aa7e414

查看 docker镜像

Docker入门_Windows_14

C:\Users\Gavin>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine/git latest 620bef75a214 6 days ago 39.4MB
redis latest 604d80444252 12 days ago 117MB
hello-world latest feb5d9fea6a5 9 months ago 13.3kB

C:\Users\Gavin>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine/git latest 620bef75a214 6 days ago 39.4MB
redis latest 604d80444252 12 days ago 117MB
hello-world latest feb5d9fea6a5 9 months ago 13.3kB

docker 镜像帮助命令

C:\Users\Gavin>docker images --help

Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
-a, --all Show all images (default hides intermediate images) #查看镜像所有信息
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output #不截断查看完整信息
-q, --quiet Only show image IDs #只显示镜像id

docker images --digests #查看镜像摘要信息

C:\Users\Gavin>docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
alpine/git latest sha256:23dcd3edfd1d9c7cbb14f7823d07a4934716cfa4d4dbc402d37ee011c440a685 620bef75a214 6 days ago 39.4MB
redis latest sha256:cfda0458239615720cc16d6edf6bae7905c31265f218d2033c43cdb40cd59792 604d80444252 12 days ago 117MB
hello-world latest sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651 feb5d9fea6a5 9 months ago 13.3kB

C:\Users\Gavin>docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
alpine/git latest sha256:23dcd3edfd1d9c7cbb14f7823d07a4934716cfa4d4dbc402d37ee011c440a685 620bef75a214 6 days ago 39.4MB
redis latest sha256:cfda0458239615720cc16d6edf6bae7905c31265f218d2033c43cdb40cd59792 604d80444252 12 days ago 117MB
hello-world latest sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651 feb5d9fea6a5 9 months ago 13.3kB

镜像命令

Docker入门_docker_15

拉取镜像

C:\Users\Gavin>docker pull  nginx   拉取 nginx镜像
Using default tag: latest
latest: Pulling from library/nginx
b85a868b505f: Already exists
f4407ba1f103: Pull complete
4a7307612456: Pull complete
935cecace2a0: Pull complete
8f46223e4234: Pull complete
fe0ef4c895f5: Pull complete
Digest: sha256:10f14ffa93f8dedf1057897b745e5ac72ac5655c299dade0aa434c71557697ea
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

C:\Users\Gavin>docker pull --help
#docker pull的使用帮助

Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform
capable
-q, --quiet Suppress verbose output

C:\Users\Gavin>docker pull -a mysql
5: Pulling from library/mysql
824b15f81d65: Downloading [==============> ] 8.067MB/27.14MB
c559dd1913db: Download complete
e201c19614e6: Download complete
f4247e8f6125: Downloading [===============================> ] 884.7kB/1.387MB
dc9fefd8cfb5: Waiting

docker 查找镜像

C:\Users\Gavin>docker search --help #查找镜像帮助信息

Usage: docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output

C:\Users\Gavin>
C:\Users\Gavin>docker search tomcat --limit 2
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3344 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 97 [OK]


C:\Users\Gavin>docker search -f stars=5 tomcat --limit 2
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3344 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 97 [OK]

docker search -f stars=5 tomcat --limit 2
格式 key=value 这里是条件 之后收查找的镜像名, limit是限制显示的条数的;

docker 删除镜像

Docker入门_docker_16

C:\Users\Gavin>docker rmi redis -f   
#删除redis镜像 需要强制删除

Untagged: redis:latest
Untagged: redis@sha256:cfda0458239615720cc16d6edf6bae7905c31265f218d2033c43cdb40cd59792
Deleted: sha256:604d80444252dd46a4b4d35bb0226fc16e1022efcd18bf5980650f72d1cf29e5


C:\Users\Gavin>docker rmi --help #移除镜像的帮助

Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Options:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents

删除多个镜像:
docker rmi -f 镜像:标签 镜像:标签

C:\Users\Gavin>docker rmi -f redis:latest nginx:latest
Untagged: redis:latest
Untagged: redis@sha256:d581aded52343c461f32e4a48125879ed2596291f

还可以这么删除

Docker入门_容器_17

C:\Users\Gavin>docker images -qa  #找到所有的镜像id
55f4b40fe486
620bef75a214
4813a0e5f815
feb5d9fea6a5
5d0da3dc9764
#执行删除
C:\Users\Gavin>docker rmi -f $(dockers images -qa)
# 就可以把所有的镜像删除掉

```bash
docker ps #----列举最近的容器

Usage: docker ps [OPTIONS]

List containers

Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all
states) (default -1)
-l, --latest Show the latest created container (includes all
states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes

Docker入门_容器_18

C:\Users\Gavin>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 27 minutes ago Up 27 minutes heuristic_moore

C:\Users\Gavin>docker ps -l #列出最近创建的容器 默认显示数量为 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 28 minutes ago Up 28 minutes heuristic_moore

C:\Users\Gavin>docker ps -n 2 #显示最近的创建的两个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 32 minutes ago Up 32 minutes heuristic_moore
b021ff31b514 centos "/bin/bash" 34 minutes ago Exited (0) 34 minutes ago jovial_noyce

C:\Users\Gavin>docker ps -n 2 -l 显示最近创建的两个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 33 minutes ago Up 33 minutes heuristic_moore
b021ff31b514 centos "/bin/bash" 34 minutes ago Exited (0) 34 minutes ago jovial_noyce

C:\Users\Gavin>docker ps -n 3 -l -q #显示最近创建的三个容器的编号
78b4e097b354
b021ff31b514
69807b0a68d4

C:\Users\Gavin>docker ps --no-trunc #不截断输出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b35438969832cd7c15aae13259f2e65cb0f14313a98ad575f1f16acf centos:latest "/bin/bash" 38 minutes ago Up 38 minutes heuristic_moore

退出容器:
exit

exit #退出docker 容器
C:\Users\Gavin>docker ps -a #查看容器的信息---都为exit
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 39 minutes ago Up 39 minutes heuristic_moore
b021ff31b514 centos "/bin/bash" 41 minutes ago Exited (0) 40 minutes ago jovial_noyce
69807b0a68d4 604d80444252 "docker-entrypoint.s…" 7 days ago Exited (0) 7 days ago redis-p2Mg

容器命令

有镜像才有容器,首先我们需要整一个系统镜像

拉取一个镜像

#docker pull centos
C:\Users\Gavin>docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

创建并启动容器

C:\Users\Gavin>docker run  --help
# 运行帮助
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
--add-host list Add a custom host-to-IP mapping
(host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight),
between 10 and 1000, or 0 to
......

运行容器:

C:\Users\Gavin>docker run -it centos /bin/bash
[root@af06251210bf /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr

Docker入门_Docker_19

-i 交互模式运行

docker  run -i centos /bin/bash

Docker入门_linux_20


Docker入门_docker_21

-t 为容器重新分配一个伪输入终端,

C:\Users\Gavin>docker run -t centos /bin/bash
[root@dafae7f76cc1 /]#

-i -t的区别----->>>可以看出 -i像是在后台运行的,-t是前台运行 ,运行后直接进入了 centos,而 -i需要手动进入系统;

Docker入门_linux_22

一般是两个一起使用

C:\Users\Gavin>docker run --name mycent -d centos:latest

5a8b70be3aec55556b10f5c9044ac30064f49fdfea84aa4d655b58c0079c992b# 返回id

docker run --name 别名-d 镜像名:版本号

-d 表示后台运行
返回执行后的 容器 id

C:\Users\Gavin>docker run -d centos /bin/bash
f5163c0a487f24e474ac6e7404d1b06536f0d36038fc634fe9b485942164e9c2

但是实际结果是运行后立马就退出了,需要配合 -i -t 来使用
如下---->>

C:\Users\Gavin>docker run -it -d centos:latest
78b4e097b35438969832cd7c15aae13259f2e65cb0f14313a98ad575f1f16acf

返回结果也是运行后容器的id;

Docker入门_Docker_23


容器的停止运行:

docker stop contatinerid

C:\Users\Gavin>docker stop --help

Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
-t, --time int Seconds to wait for stop before killing it (default 10)

看帮助信息知道我们需要 容器的id

docker ps 命令来查看 containerid

C:\Users\Gavin>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78b4e097b354 centos:latest "/bin/bash" 5 minutes ago Up 5 minutes heuristic_moore

到这里我们可以发现每次启动容器都会启动一个新的image.如果想要启动以前的容器镜像该怎么操作呢?

docker start CONTAINER ID

C:\Users\Gavin>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04198ad3d234 centos:latest "/bin/bash" 4 minutes ago Up 4 minutes gracious_bhaskara
78b4e097b354 centos:latest "/bin/bash" 45 minutes ago Exited (0) 4 minutes ago heuristic_moore
b021ff31b514 centos "/bin/bash" 47 minutes ago Exited (0) 47 minutes ago jovial_noyce
69807b0a68d4 604d80444252 "docker-entrypoint.s…" 7 days ago Exited (0) 7 days ago redis-p2Mg


#启动CONTAINER ID 为b021ff31b514 的
C:\Users\Gavin>docker start b021ff31b514
b021ff31b514 #返回镜像ID

C:\Users\Gavin>docker ps -a # 再次查看,该容器已经启动了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04198ad3d234 centos:latest "/bin/bash" 4 minutes ago Up 4 minutes gracious_bhaskara
78b4e097b354 centos:latest "/bin/bash" 46 minutes ago Exited (0) 4 minutes ago heuristic_moore
b021ff31b514 centos "/bin/bash" 48 minutes ago Up 6 seconds jovial_noyce
69807b0a68d4 604d80444252 "docker-entrypoint.s…" 7 days ago Exited (0) 7 days ago redis-p2Mg

容器停止运行—小结

exit 
docker stop containerid #等待任务执行完后退出
docker kill containerid #强制停止

移除容器

docker rm containerid

这个跟移除镜像还有一些区别的;
移除镜像-----docker rmi 镜像id (强制移除 -f)
移除容器—docker rm containerid

举个例子—>>

C:\Users\Gavin>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04198ad3d234 centos:latest "/bin/bash" 31 minutes ago Exited (137) 24 seconds ago gracious_bhaskara
78b4e097b354 centos:latest "/bin/bash" About an hour ago Exited (0) 31 minutes ago heuristic_moore
b021ff31b514 centos "/bin/bash" About an hour ago Exited (0) 3 seconds ago jovial_noyce
69807b0a68d4 604d80444252 "docker-entrypoint.s…" 7 days ago Exited (0) 7 days ago redis-p2Mg

C:\Users\Gavin>docker rm 78b4
78b4

C:\Users\Gavin>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04198ad3d234 centos:latest "/bin/bash" 34 minutes ago Exited (137) 3 minutes ago gracious_bhaskara
b021ff31b514 centos "/bin/bash" About an hour ago Exited (0) 2 minutes ago jovial_noyce
69807b0a68d4 604d80444252 "docker-entrypoint.s…" 7 days ago Exited (0) 7 days ago redis-p2Mg

批量删除容器

docker rm $(docker ps -aq)

查看日志
docker logs 命令

C:\Users\Gavin>docker logs --help

Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
--details Show extra details provided to logs # 显示logs 信息
-f, --follow Follow log output # 跟踪logs 输出
--since string Show logs since timestamp (e.g.
2013-01-02T13:23:37Z) or relative (e.g. 42m for 42
minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps #显示时间戳
--until string Show logs before a timestamp (e.g.
2013-01-02T13:23:37Z) or relative (e.g. 42m for 42
minutes) #显示某个时间戳之前的logs

演示— 启动容器,每个两秒打印一个helloworld

C:\Users\Gavin>docker run -d centos:latest /bin/bash -c "while true ; do echo hello ; sleep 2 ; done"
7c951ef91ec7460db261608d5d43cfddb5a382179f0b0bf6f77d7b924b999023
#查看日志文件
C:\Users\Gavin>docker logs -t -f --tail 3 7c95
2022-06-28T12:26:17.444398246Z hello
2022-06-28T12:26:19.447820400Z hello
2022-06-28T12:26:21.451393878Z hello
2022-06-28T12:26:23.455383238Z hello
2022-06-28T12:26:25.459504216Z hello
2022-06-28T12:26:27.463079919Z hello

docker run -d centos:latest /bin/bash -c "while true ; do echo hello ; sleep 2 ;done "

/bin/bash ---->>是的容器运行不会直接退出, -c 执行一个循环,打印hello ,sleep 是睡眠时间

查看容器中运行的进程

docker top 容器id

C:\Users\Gavin>docker top 7c95
UID PID PPID C STIME TTY
TIME CMD
root 8287 8267 0 12:26 ?
00:00:00 /bin/bash -c while true ; do echo hello ; sleep 2 ; done
root 8745 8287 0 12:40 ?
00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 2

Docker入门_Docker_24

查看容器信息细节
docker inspect containerid

Docker入门_docker_25


回顾时刻---->>

#启动已有容器
C:\Users\Gavin>docker start 76369
76369
#查看logs
C:\Users\Gavin>docker logs -f -t --tail 3 76369
2022-06-28T12:50:58.331784997Z hello
2022-06-28T12:51:00.335214600Z hello
2022-06-28T12:51:02.339013948Z hello
2022-06-28T12:51:04.342478253Z hello
2022-06-28T12:51:06.346319569Z hello
2022-06-28T12:51:08.350361931Z hello
^C
C:\Users\Gavin>

进入运行的容器
docker exec
当容器在后台运行时我们想要进入一个后台运行的容器

在容器中打开新的终端,并且可以启动新的进程

C:\Users\Gavin>docker exec --help

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
-d, --detach Detached mode: run command in the background # 分离模式:在后台运行命令
--detach-keys string Override the key sequence for detaching a
container 覆盖分离的容器的键值对
-e, --env list Set environment variables 设置环境变量
--env-file list Read in a file of environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format:
<name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container

C:\Users\Gavin>docker exec -it 76369 /bin/bash

C:\Users\Gavin>docker exec -it 76369 /bin/bash #进入一个后台运行的容器
[root@76369433528c /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@76369433528c /]#

可以直接执行某些命令而不进入容器

C:\Users\Gavin>docker exec -it 76369 ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr

docker attach containerid
直接进入容器启动命令的终端,不会启动新的进程–即还是原来的进程

C:\Users\Gavin>docker attach 76369
hello
hello
hello
hello
hello
hello

文件的复制

有时需要从容器中拷贝内容到宿主机中

docker cp 容器ID:容器内路径 目的地路径

#启动容器---
docker start 76369
#进入容器
docker exec -it 76369 /bin/bash

#创建一个文件 hello.txt
[root@76369433528c local]# touch hello.txt
[root@76369433528c local]# ls
bin games include lib64 sbin src
etc hello.txt lib libexec share
[root@76369433528c local]# vi hello.txt
#复制文件到宿主机
docker cp 容器ID:容器内路径 目的地路径
C:\Users\Gavin>docker cp 76369:/usr/local/hello.txt /hello

小结:
Docker镜像加载原理:
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
Bootfs(boot file system)主要包含Bootloader和Kernel, Bootloader主要是引导加载Kernel, Linux
刚启动时会加载Bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系
统是一样的,包含Boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用
权已由bootfs转交给内核,此时系统也会卸载bootfs。
Rootfs (root file system) ,在Bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc
等标准目录和文件。Rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。