docker的基础,安装与使用
概念
微服务环节指不在是以完整的以物理机为基础的服务软件,而是借助于宿主机的性能,以小量的形式,单独部署的应用。
docker是一个开源的应用容器引擎,基于go语言开发的,使用时apache2.0的协议。
docker是在linux里面运行的容器化的开源工具。是一种轻量级的虚拟机。
鲸鱼是宿主机
集装箱:一个个独立的应用。每个应用之间都是互相隔离和独立的。
docker的设计的宗旨
- 封装
- 发布
- 部署
- 运行
- 销毁
容器的生命周期:达到一次封装,多次运行的目的。
可移植,可扩展,兼容性的目的,随时随地都可以快速的部署和使用docker的应用。
docker是在linux上运行,与其他的容器共享主机的内核,包括其他的资源(çpu,内存,硬盘),但是每个docker应用都是独立的进行
为什么能做到独立进行
- linux的命名空间
namespace
可以实现资源的隔离。 - cgroup 可以实现对docker应用程序的资源限制。
namespace
namespace是linux内核的一种特性,允许将一组系统资源进行隔离,使得一个命名空间中的进程看起来像在系统重拥有独立的资源。
namespace有6个命名空间
- UTS 系统调用的参数 clone_newuts
隔离的内容:主机名和域名,在每个应用中,都能看到自己的主机名和域名,与其他进程分隔开。 - PID 进程隔离
隔离内容:进程编号,当运行应用之后,每个应用都有自己的独立的进程编号的空间,每个程序之间不会发生冲突 - network 网络隔离
隔离内容:每个应用启动之后,都有自己的独立的网络空间,隔离网络设备,端口,和网络栈 - mount 隔离文件系统
隔离内容:隔离文件系统,每个应用挂载之后都有自己独立的文件系统挂载点,这些挂载点互不冲突,也不会互相干扰 - IPC 隔离通信资源
隔离内容:隔离的是信号量,消息队列和共享内存,在ipc隔离当中,每个进程之间都有独立的通信资源。 - user 隔离用户和用户组
隔离内容:用户和用户组,每个用户和组都是独立的命名空间,不同的用户和组之间是隔离开的。
docker的核心概念
- 仓库:docker的仓库是用来保存镜像的地方,也是获取镜像和上传镜像的目的地
- 镜像:docker的镜像是创建容器基础,一个镜像就类似于一个可执行的,包含源码的二进制包,包括容器运行的参数,设置,环境变量和配置文件。打包好的可运行程序。
- 容器:容器是基于镜像创建的运行的实例
安装和基本的使用方法
安装
# step 1: 安装必要的一些系统工具
apt-get install ca-certificates curl gnupg
# step 2: 信任 Docker 的 GPG 公钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Step 3: 写入软件源信息
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Step 4: 安装Docker
apt-get update
apt -y install docker-ce=5:24.0.1-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.1-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin
root@u1:~# vim /etc/docker/daemon.json
root@u1:~# systemctl daemon-reload
root@u1:~# systemctl restart docker
root@u1:~# docker pull nginx:1.22
1.22: Pulling from library/nginx
f1f26f570256: Pull complete
fd03b214f774: Pull complete
ef2fc869b944: Pull complete
ac713a9ef2cc: Pull complete
fd071922d543: Pull complete
2a9f38700bb5: Pull complete
Digest: sha256:fc5f5fb7574755c306aaf88456ebfbe0b006420a184d52b923d2f0197108f6b7
Status: Downloaded newer image for nginx:1.22
docker.io/library/nginx:1.22
root@u1:~# docker pull ubuntu:22.04
22.04: Pulling from library/ubuntu
6414378b6477: Pull complete
Digest: sha256:0e5e4a57c2499249aafc3b40fcd541e9a456aab7296681a3994d631587203f97
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04
docker的基本命令
docker images:查看当前已经下载到本地的镜像
- REPOSITORY:应用的名称
- TAG:标签,镜像的标签,应用的版本
- IMAGE ID:镜像在本地的唯一标识
- CREATED:发布在镜像仓库的时候
- SIZE:镜像的大小
docker inspect 镜像id:查看镜像的详细信息
镜像下载完之后保存在/var/lib/docker
- overlay2:镜像的联合文件系统
- lowerDir:镜像的底层文件系统,整个镜像根文件系统(运行载体)
- upperDir:可写层,用户可以自定义的在底层文件系统上进行修改,但是这些修改又不影响根文件系统,容器可以实现读写
- mergedDir:合并目录,就是用户看到容器的内的一个视图,
- WorkDir:工作目录,进行写操作,可以使overlay2更新和跟踪对于文件系统的修改。
docker tag nginx:1.22 nginx:test1
给nginx:1.22做了一个副本。
镜像的组成:
nginx:1.22
镜像名 标签
docke rmi -f nginx:1.22 删除镜像-----慎用
docker save -o /opt/centos.tar centos:7
把本地镜像导出到指定位置,保存为指定名称(.tar)
docker load -i centos.tar
把镜像导入本地
容器
如何基于镜像创建容器
docker run -itd ubuntu:22.04
run:如果本地不存在指定的镜像,他会自动取仓库拉取指定的镜像然后再创建容器
-i:表示容器开启标准输入,接受用户输入的指定
-t:生成一个伪终端tty,用户可以进入容器的内部
-d:容器创建完之后进入后台运行。
docker ps:查看状态是running的容器
docker ps -a:查着所有状态的容器,包括运行和停止以及报错的容器。
出现exit的原因:
容器启动之后,都会有一个执行的命令,如果该命令执行完毕之后没有其他的可执行内容,那么容器会立刻退出进入终止状态。
进入容器内部操作
- docker exec -it 容器id/名称 /bin/bash
- docker exec -it 容器id/名称 bash
#自定义容器名称
docker run -itd --name nginx1 nginx:test1
docker exec -it nginx1 bash
#都会自定义容器的名称,用指定的名称已进入容器,容器的名字在本机是唯一的
容器本质:基于镜像的配置和环境,创建了一个基于linux系统的,在这个系统当中安装了指定应用的小型的虚拟机。
容器和宿主机之间的交换
#容器的文件复制到宿主机
docker cp nginx1:/var/log/nginx/access.log /opt/
#宿主机的文件复制到容器内部
docker cp sources.list nginx1:/etc/apt
#查看容器的标准输出:查看容器的日志
docker logs -f nginx1
#-f 动态查看容器的日志
端口映射
-P:指定宿主机的随机端口和容器内的端口进行映射,从32768开始–65535
-p:需要人工指定宿主机的端口和容器进行映射 只要指定端口宿主机没有被占用都可以使用。
docker run itd --name test2 -P nginx:test1
docker run -itd --name nginx2 -p 82:80 nginx:test1
其它命令
docker rm -f
#强制删除容器
容器是基于镜像创建的,但是容器一旦运行,镜像不再是依赖条件,镜像可以删除,不影响部署的容器。
#查看容器ip
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
#查看容器的pid号
docker inspect -f '{{.State.Pid}}' centos2
批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
#批量清理所有后台已经停止的容器
docker rm $(docker ps -a -q)