docker的基本管理和应用

1、概念

docker是一个开源的应用容器引擎,基于go语言开发的。

docker是运行在linux的容器化工具,可以理解为轻量级的虚拟机。

可以在任何主机上轻松创建的一个轻量级、可移植的、自给自足的容器

2、设计的理念

鲸鱼------宿主机

集装箱------独立运行的容器,相互隔离的容器,一个容器就是一个独立运行的应用程序

3、容器化的特点

1、灵活,最复杂的程序也可以实现容器化

2、轻量级,容器利用和共享主机内核

3、可互换,可以即时部署升级,即时更新

4、便携性,可以在本地构建,也可以部署到云,可以在任何地方运行

5、可扩展(依赖于k8s)

容器是在linux上运行,与其他容器共享主机内核以及主机的资源,独立运行,相互隔离的进程(应用程序)

容器运行时占用一定的资源,但是不占用其他任务的资源

4、docker和虚拟机之间的区别

docker 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗50%
性能 接近原生性能 只有80%
系统支持数量 上千个(理论上) 部署就几十个
隔离性 资源隔离 完全隔离
安全性 安全性差 安全性高

5、linux的命名空间

docker使用内核技术的两个重要的技术:

1、namespace实现资源隔离

2、cgroup实现资源限制

资源隔离:linux有6项隔离

namespace命名空间

1、UTS:主机名和域名,通过在UTS命名空间创建进程这个进程可以看到自己的主机名和域名,与宿主机的其他进程进行分割

2、IPC:信号量、消息队列、共享内存,进程就可以拥有独立的通信资源,不受其他的进程影响

3、PID:进程编号,每个程序在系统中都有一个唯一标识(pid),使用不同的pid可以保证进行之间不发生冲突

4、network	:网络设备、网络端口等,在network空间中,每个进程都有自己的独立的端口号,靠端口号可以实现网络访问的隔离

5、mount:挂载点(文件系统),每一个进程使用不同的文件系统挂载点,不同的mount的文件系统互不干扰

6、user:用户和用户组,在user空间中,每个进程都有独立的用户和用户组,每个用户之间可以互相不受影响

6、docker的核心概念

1、镜像

是创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器。在镜像当中,已经封装好了程序运行需要的代码、库、运行时间、环境变量以及配置文件等

2、容器

基于镜像运行起来的进程就是容器,容器之间互相独立、互相隔离

3、仓库

保存镜像的地方

公有仓库(docker hub 阿里云)

私有仓库,不对外提供访问,自己使用

7、工作流程

8、安装

bash 复制代码
systemctl stop firewalld
setenforce 0

#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2  

#添加阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装docker
yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io

#重启
systemctl restart docker
systemctl enable docker

#查看版本号
docker version

#显示docker系统的详细信息
docker info

#设置加速站点
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://tqozyo9i.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

#拉取nginx镜像
docker pull nginx

#修改配置文件
vim /etc/docker/daemon.json

{
	"registry-mirrors": ["https://hub.littlediary.cn/"]

}

#重新加载systemd的配置,重启docker
systemctl daemon-reload
systemctl restart docker

#拉取其他的镜像
docker pull centos:7
docker pull nginx:1.18
docker pull nginx:1.22

9、常用命令

9.1镜像相关操作

bash 复制代码
#拉取镜像
docker pull

#查看与nginx相关的镜像
docker search nginx

#查看本地计算机上所有的 docker 镜像
docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    a72860cb95fd   7 weeks ago     188MB
nginx        1.22      0f8498f13f3a   16 months ago   142MB
centos       7         eeb6ee3f44bd   2 years ago     204MB
nginx        1.18      c2c45d506085   3 years ago     133MB

#根据image id查看镜像的详细信息
docker inspect +image id

docker的文件系统
overlayFS:联合文件系统,用于docker等容器技术之中
把多个文件系统层叠在一起,形成一个统一的文件系统
LowerDir:底层目录
包含底层的文件系统,也是容器运行的基础环境的文件系统,是根文件系统
UpperDir:可写层
容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写操作,这些修改不影响底层的文件系统,达到容器内容的可写性
MergeDir:合并目录
把底层目录和可写层以及其他目录组成联合视图,也就是容器使用的文件系统
WorkDir:工作目录
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理

#删除镜像
docker rmi -f +image id
如果不加-f,镜像被容器使用,且容器正在运行,-f才能删除

#给镜像重新打标签
docker tag nginx:1.18 nginx:web
(将nginx的tag由1.18变为web)
nginx        1.18      c2c45d506085   3 years ago     133MB
nginx        web       c2c45d506085   3 years ago     133MB
根据image id删除镜像,那么nginx:1.18和nginx:web都会被删除

#把nginx:web这个镜像导出opt目录,保存成文件名 nginx1.18.tar
docker save -o /opt/nginx1.18.tar nginx:web

#导入镜像
方法一:docker load -i /opt/nginx1.18.tar
方法二:docker load < /opt/nginx1.18.tar

9.2容器相关操作

前提是必须要有镜像

bash 复制代码
#创建容器
docker create -it nginx:web
-i:容器和用户之间可以进行交互
-t:开启一个伪终端供用户操作
-it:开启一个终端让用户可以用交互式会话访问容器进行操作

#查看所有容器,包括未运行的容器
docker ps -a

#只查看运行起来的容器
docker ps

CONTAINER ID   IMAGE       COMMAND                   CREATED          STATUS    PORTS     NAMES
71487d4a37f9   nginx:web   "/docker-entrypoint...."   10 seconds ago   Created             jovial_gould

CONTAINER:容器的唯一标识
IMAGE:容器默认运行的命令
CREATED:容器暴露的端口
NAMES:容器的名称。系统随机分配的,也可以指定容器的名称
STATUS:创建成功,不是运行。UP表示运行状态,Exited表示停止运行,Created表示创建成功

容器的生命周期:
拉取镜像------创建容器------修改镜像------重启容器------停止容器------删除容器------删除镜像

#运行容器
docker start 容器名/container id
#停止
docker stop 容器名/container id

#创建容器,本地没有的镜像会自动拉取,然后再运行
docker run -it +镜像
容器内部如果没有命令执行,容器会自动终止运行;如果有命令,执行完指定命令之后容器也会终止运行
容器要长期运行、稳定运行,必须要有一个持续的可执行命令

docker run -itd --name test1 centos:7 /bin/bash
-itd
d:后台运行,指定后台运行的命令,这样创建完成之后,即便有-it,也不会进入容器,而是停留在宿主机的界面
--name:指定名称
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
865c9e375ccd   centos:7   "/bin/bash"   9 seconds ago   Up 8 seconds             test1

#进入容器内部查看
docker exec -it 容器名称/容器id /bin/bash

#运行nginx
docker run -itd --name nginx1 nginx:1.22

CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS     NAMES
6644684bf9f6   nginx:1.22   "/docker-entrypoint...."   4 seconds ago    Up 3 seconds    80/tcp    nginx1

#查看容器的ip地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' +容器名/id
进入容器的网络命名空间,获取ip地址

#查看容器内部的日志输出
docker logs -f +容器名
---------------------------------------------------------------------------------------------------------------------------------------
docker run -itd --name nginx2 nginx:1.22 /bin/bash

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
172.17.0.4

#无法访问
curl: (7) Failed connect to 172.17.0.4:80; 拒绝连接
容器创建的时候会有一个默认的输出或者指令
/bin/bash------------------默认执行的命令覆盖,虽然nginx在运行,但运行的不再是nginx的指令,而是/bin/bash
---------------------------------------------------------------------------------------------------------------------------------------

#端口映射,本地端口和容器端口进行映射
-P:随机指定宿主机的端口和容器的端口进行映射,端口号从32768开始

docker run -itd --name nginx4 -P nginx:1.22

CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                                     NAMES
fd506d16894b   nginx:1.22   "/docker-entrypoint...."   5 seconds ago    Up 4 seconds    0.0.0.0:32768->80/tcp, :::32768->80/tcp   nginx4
宿主机端口:32768
nginx端口:80

-p:指定端口,宿主机的端口不能被占用

docker run -itd --name nginx5 -p 81:80 nginx:1.22

CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                                     NAMES
3f45633e224f   nginx:1.22   "/docker-entrypoint...."   6 seconds ago    Up 6 seconds    0.0.0.0:81->80/tcp, :::81->80/tcp         nginx5
宿主机端口:81
容器端口:80

#把宿主机的文件复制到容器当中
docker cp /opt/index.html 容器名/id:/usr/share/nginx/html

#把容器的文件复制出来
docker cp 容器名/id:/etc/nginx/nginx.conf /opt

#导出容器
docker export -o /opt/nginx7.tar 容器名/id

#导入容器
docker import nginx7.tar -- nginx:7

#删除容器
docker rm -f 容器名

#批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop

#批量删除所有容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm

#批量删除镜像
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash

#删除none镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi
相关推荐
会掉头发2 分钟前
Linux进程通信之共享内存
linux·运维·共享内存·进程通信
我言秋日胜春朝★5 分钟前
【Linux】冯诺依曼体系、再谈操作系统
linux·运维·服务器
全能全知者27 分钟前
docker快速安装与配置mongoDB
mongodb·docker·容器
饮啦冰美式36 分钟前
22.04Ubuntu---ROS2使用rclcpp编写节点
linux·运维·ubuntu
wowocpp36 分钟前
ubuntu 22.04 server 安装 和 初始化 LTS
linux·运维·ubuntu
Lign1731442 分钟前
ubuntu unrar解压 中文文件名异常问题解决
linux·运维·ubuntu
大霞上仙1 小时前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
Karoku0662 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子2 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
布值倒区什么name2 小时前
bug日常记录responded with a status of 413 (Request Entity Too Large)
运维·服务器·bug