这篇文章主要记录了我学习 Docker 的过程,这是第一篇文章,主要包括 Docker 的基础概念、安装、常用命令等,希望可以帮助到大家~
目录
- Docker 入门实战,看这一篇就够了(一)
- Docker 入门实战,看这一篇就够了(二)
一、Docker 概述
Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础设施。
Docker 能做什么?
- 快速、一致地交付您的应用程序
- 响应式部署和扩展
- 在相同硬件上运行更多工作负载
Docker 架构
Docker 使用客户端-服务器架构。Docker Client 与 Docker Daemon 通信,后者负责构建、运行和分发 Docker 容器的繁重工作。
- Client:客户端,负责与 Docker Daemon 进行通信,用户通过 Docker Clinet 与 Docker Daemon 进行交互。
- Docker Daemon:服务端,Docker 主机上的守护进程,监听 Docker API 请求并管理 Docker 对象。
- Images:镜像,它包含了容器运行时所需要的所有基础文件和配置信息,是一个只读的模板。
- Containers:容器,镜像的可运行实例。
- Registry:仓库,类似代码仓库,用来存储和分发 Docker 镜像。
容器与虚拟机的区别?
容器是应用层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。与 VM 相比,容器占用的空间更少(大小通常为MB级别),占用的资源更少,启动速度也更快,可以运行更多的应用程序。
虚拟机 (VM) 是物理硬件的抽象,可将一台服务器变成多台服务器。管理程序允许多个虚拟机在单台机器上运行。每个 VM 都包含完整的操作系统、应用程序、必要的二进制文件和库等(大小通常为GB级别),占用的资源更多,启动速度也更慢。
二、Docker 安装
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
注意:这里的旧版本是指非 docker-ce 的版本。
设置存储库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这里使用的阿里云的地址,没有使用官方提供的 地址,防止出现无法访问的问题。
安装 Docker
安装最新版本的 Docker Engine 和 containerd,执行如下命令:
sudo yum install docker-ce docker-ce-cli containerd.io
如果需要安装指定版本的 Docker Engine,可以先列出仓库中的可用版本:
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable
然后选择并安装指定版本:
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
其中 <VERSION_STRING> 填 20.10.9 这一部分。
启动并验证 Docker
启动 Docker 引擎:
systemctl enable docker --now
验证 Docker 版本信息:
docker version
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:45:41 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.12
API version: 1.41 (minimum version 1.12)
Go version: go1.16.12
Git commit: 459d0df
Built: Mon Dec 13 11:44:05 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
运行 hello-world 验证 Docker 引擎是否正确安装:
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a
Status: Downloaded newer image for hello-world:latest
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 引擎、CLI 和 Containerd 软件包:
sudo yum remove docker-ce docker-ce-cli containerd.io
主机上的镜像、容器、卷或自定义配置文件不会自动删除。要删除所有镜像、容器和卷:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
阿里云镜像加速
登录阿里云的 镜像加速器,找到对应的镜像加速器地址进行配置,然后重启服务。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [""]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
执行 docker info 命令,看到 Registry Mirrors 对应的镜像地址正确,则代表配置成功。
三、Docker 常用命令
镜像命令
拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 拉取最新版本镜像
docker pull tomcat:latest
# 等同 docker pull tomcat:latest
docker pull tomcat
# 拉取指定版本镜像
docker pull tomcat:8.5.75
详情访问官网:docker pull
列出镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
# 列出本地所有镜像(默认会隐藏中间镜像,可以使用 -a 查看中间镜像)
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8.5.75 77cfff2e1fe4 3 days ago 679MB
tomcat latest fb5657adc892 7 weeks ago 680MB
hello-world latest feb5d9fea6a5 4 months ago 13.3kB
# 只显示镜像ID
docker images -q
77cfff2e1fe4
fb5657adc892
feb5d9fea6a5
- REPOSITORY:镜像仓库名
- TAG:镜像标签名
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
详情访问官网:docker images
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 通过镜像ID删除单个
docker rmi feb5d9fea6a5
# 通过镜像ID删除多个
docker rmi feb5d9fea6a5 16ecd2772934
# 通过仓库名:标签名删除
docker rmi hello-world:latest
# 强制删除(镜像存在容器实例则无法删除,需要强制删除)
docker rmi -f feb5d9fea6a5
# 删除全部镜像
docker rmi -f $(docker images -qa)
详情访问官网:docker rmi
容器命令
列出容器
docker ps [OPTIONS]
# 列出运行中容器
docker ps
# 列出所有容器(已运行 + 未运行)
docker ps -a
# 只显示容器ID
docker ps -q
- CONTAINER ID:容器ID
- IMAGE:镜像名
- COMMAND:执行命令
- CREATED:创建时间
- STATUS:状态
- PORTS:端口映射
- NAMES:容器名
详情访问官网:docker ps
新建并启动容器
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
在启动容器的时候必须指定是以 后台模式 运行,还是以默认的 前台模式 运行:
- -d:以后台模式运行容器,并返回容器ID
- -i:即使未连接,也要保持 STDIN 打开,通常与 -t 连用
- -t:分配一个伪输入终端,通常与 -i 连用
docker run -it centos
[root@df1fa6afc492 /]#
执行命令后,可以发现进入了一个新的终端界面,我们可以通过这个新的终端界面执行命令,与容器内部进行交互。由于这是一个前台模式启动的容器,在我们断开远程连接或者执行 exit 命令之后容器就会停止。
docker run -d centos
9c1e6c0e3f6b6bf3e0d9a07006cb38e9d143d2bc7464536eea113ff80d44cc1e
执行命令后,可以发现只返回了一个容器ID,但是执行 docker ps 命令并没有发现运行中容器,执行 docker ps -a 发现容器已经停止,这是因为 centos 容器最后执行的命令不会常驻在前台,执行完容器就关闭了。
其他常用参数:
- --name="customName":指定容器名称
- -p hostPort:containerPort:指定端口映射
# 指定容器名称启动
docker run -d --name="redis01" redis
# 指定容器名称+指定端口映射启动
docker run -d --name="redis02" -p 6000:6379 redis
详情访问官网:docker run
删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 删除镜像
docker rm 170cd1689660
# 强制删除(镜像运行中只能强制删除)
docker rm -f 170cd1689660
# 删除全部
docker rm -f $(docker ps -aq)
详情访问官网:docker rm
容器状态管理
# 启动容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 停止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 强制停止容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
详情访问官网:docker start、docker stop、docker restart、docker kill、
导入导出容器
docker export [OPTIONS] CONTAINER
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 导出容器
docker export 2d1444c6d626 > mycentos.tar
# 导入容器
docker import mycentos.tar mycentos:1.0.0
详情访问官网:docker export、docker import
容器文件复制
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 从宿主机复制到容器
docker cp /tmp/centos.txt 80772c7abcb7:/tmp
# 从容器复制到宿主机
docker cp 80772c7abcb7:/tmp/docker.txt /tmp
详情访问官网:docker cp
进入容器
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker attach [OPTIONS] CONTAINER
# 进入容器,并开启一个新的终端,可以用 exit 退出
docker exec -it 80772c7abcb7 /bin/bash
# 直接进入容器,使用 exit 会退出容器本身
docker attach 80772c7abcb7
详情访问官网:docker exec、docker attach
查看容器信息
docker logs [OPTIONS] CONTAINER
docker top CONTAINER [ps OPTIONS]
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 查看容器日志
docker logs 80772c7abcb7
# 查看容器内运行的进程
docker top 80772c7abcb7
# 查看容器的元数据
docker inspect 80772c7abcb7
详情访问官网:docker logs、docker top、docker inspect
四、Docker 镜像与容器
镜像
镜像,它包含了容器运行时所需要的所有基础文件和配置信息,是一个只读的模板。
镜像是由一系列的镜像层(layer)组成,每一层代表了镜像构建过程中的一次提交,当我们需要修改镜像内的某个文件时,只需要在当前镜像层的基础上新建一个镜像层,并且只存放修改过的文件内容。
分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。
Docker 镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)。
容器
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。
Docker 镜像层都是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作 容器层,容器层之下的都叫 镜像层。
提交镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# 将容器提交为镜像
docker commit 0571cbee88da mycentos:1.0.1
详情访问官网:docker commit
重命名镜像
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 重命名镜像
docker tag mycentos:1.0.1 mycentos:1.0.2
这个时候会发现同一个镜像 ID 指向了两个不同的 TAG,只需要根据 镜像仓库名:标签名 删除旧的 TAG 即可。
详情访问官网:docker tag