1. Docker中的容器
lxc --> libcontainer --> runC
2. OCI和OCF
OCI(Open Container-initiative):
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- 包含两个规范
运行时的规范(runtime-spec) 镜像规范(image-spec)
OCF(Open Container Format): runC 是一个 CLI (command-line interface)工具,用于根据 OCI 规范生成和运行容器
- 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护进程
- runC 建立在 libcontainer 之上,同样的容器技术为数百万个 Docker Engine 安装提供支持
- runC直接与容器所依赖的cgroup/linux kernel等进行交互,负责为容器配置cgroup/namespace等启动容器所需的环境,创建启动容器的相关进程。
3. Docker原理图
Docker pull向Docker daemon发送指令,告诉Docker daemon要拉取某一个镜像,Docker daemon首先会检查本机镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作。如果不存在下一步它会到Docker的仓库中找我们要拉取的镜像,如果找到了就会有Docker仓库传送到本机。
Docker run:首先把命令发送到Docker daemon,Docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个Docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成Docker容器。
4.Docker镜像与镜像仓库的关系
我们可以发现Docker镜像仓库的名字是Registry而不是repository?因为在Docker中仓库的名字是以应用的名称命名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也就是进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
5. Docker对象
当你使用 Docker 时,您正在创建和使用图像、容器、网络、卷、插件和其他对象。
- 镜像
镜像是一个只读模板,其中包含创建 Docker 容器的说明 通常,一个镜像基于另一个镜像,并带有一些额外的自定义 你可以创建自己的镜像,也可以仅使用其他人创建并在仓库中发布的镜像 - 容器
容器是镜像的可运行实例。 你可以使用 Docker API 或 CLI 创建、运行、停止、移动或删除容器。 你可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新镜像。
6. 安装及使用Docker
6.1 Docker安装
//配置yum仓库,我们配置阿里云的源
[root@localhost ~]
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
enabled=1
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
安装过程略...
6.2 Docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
我们使用阿里云加速器
//启动docker就能生成/etc/docker目录
[root@localhost ~]
[root@localhost ~]
key.json
[root@localhost ~]
> {
> "registry-mirrors": ["https://1gnt5vnf.mirror.aliyuncs.com"]
> }
> EOF
//重启docker
[root@localhost ~]
[root@localhost ~]
6.3 Docker常用的操作
命令 | 功能 |
---|
docker search | 在Docker Hub中搜索镜像 | docker pull | 从仓库中提取镜像或存储库 | docker images | 列出镜像 | docker create | 创建一个新的容器 | docker start | 启动一个或多个已停止的容器 | docker run | 在新容器中运行命令 | docker attach | 附加到运行容器 | docker ps | 列出容器 | docker logs | 提取容器的日志 | docker restart | 重新启动容器 | docker stop | 停止一个或多个运行中的容器 | docker kill | 杀死一个或多个正在运行的容器 | docker rm | 删除一个或更多的容器 | docker exec | 在正在运行的容器中运行命令 | docker info | 显示系统范围的信息 | docker inspect | 返回有关Docker对象的低级信息 |
[root@localhost ~]
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7eba5930496d9bbe375fdf71603e610ad737d2b2
runc version: v1.0.0-0-g84113ee
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-257.el8.x86_64
Operating System: CentOS Stream 8
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 780.3MiB
Name: minion2
ID: KILY:JJ2B:TIKH:ZWX5:SLZI:2Y62:PK4O:4TDG:U3ET:JD7Q:6DNH:IPSD
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://1gnt5vnf.mirror.aliyuncs.com/
Live Restore Enabled: false
//查看版本信息
[root@localhost ~]
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:56:24 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:48 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.8
GitCommit: 7eba5930496d9bbe375fdf71603e610ad737d2b2
runc:
Version: 1.0.0
GitCommit: v1.0.0-0-g84113ee
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker hub地址 https://hub.docker.com/
示例:
//以拉去tomcat为例
[root@localhost ~]
Using default tag: latest
latest: Pulling from library/tomcat
627b765e08d1: Pull complete
c040670e5e55: Pull complete
073a180f4992: Pull complete
bf76209566d0: Pull complete
f10db7ba7580: Pull complete
5b2f970878fa: Pull complete
ed434bfebf18: Pull complete
f6c437110aa9: Pull complete
a772951f83db: Pull complete
752225c3768e: Pull complete
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
//查看镜像是否拉取成功
[root@localhost ~]
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 46cfbf1293b1 4 days ago 668MB
//创建一个容器
[root@localhost ~]
b3b0780aa2f83ea105dad83848005b8f2018346155511167324cc07c2b136513
//查看容器
[root@localhost ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//这样是看不到的,因为容器没有启动
//我们可以加上-a查看
[root@localhost ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3b0780aa2f8 tomcat "catalina.sh run" 51 seconds ago Created beautiful_khayyam
//启动这个docker,通过这个ID来启动
[root@localhost ~]
b3b0780aa2f8
//然后再查看
[root@localhost ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3b0780aa2f8 tomcat "catalina.sh run" 2 minutes ago Up 6 seconds 8080/tcp beautiful_khayyam
//查看一些低级信息
[root@localhost ~]
[
{
"Id": "b3b0780aa2f83ea105dad83848005b8f2018346155511167324cc07c2b136513",
"Created": "2021-07-27T15:19:50.39117496Z",
"Path": "catalina.sh",
"Args": [
"run"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5004,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-27T15:21:58.39777026Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
此处省略N行...
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ccd198f93c2c43c7c3530d12cf2c38ebb955caf37530b2205f01217cb8d069b7",
"EndpointID": "2bd299dcafaa115c32490ee97fc3db74e22c32c04e143aca305352c8c09b256a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
//通过上面的ip是可以访问的
[root@localhost ~]
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:
//在正在运行的容器中运行命令
[root@localhost ~]
/usr/local/tomcat
//直接通过it选项进入交互模式
[root@localhost ~]
root@f723b18dc53c:/usr/local/tomcat
/usr/local/tomcat
//通过-d选项来运行
[root@localhost ~]
f723b18dc53c610ddff2513988f2643933212c5d5d95af64c45cbe5ee7461aec
//查看日志
[root@localhost ~]
7. docker event state
|