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
相关推荐
隔振消音专家1 分钟前
冷水机组振动传导影响及专业化减振适配治理方案
大数据·运维
Brilliantwxx3 分钟前
【Linux】 软件包管理器(yum)+ Vim使用
linux·运维·服务器·开发语言·编辑器·vim
skywalk81637 分钟前
在FreeBSD的Uubntu兼容环境下安装Reasonix
linux·运维·freebsd
^yi22 分钟前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
Kina_C39 分钟前
LVS-NAT 负载均衡实验从环境搭建到规则持久化
linux·运维·服务器·负载均衡·lvs
Android洋芋1 小时前
PrintFriendly网页文章转PDF插件工具及技术分析
运维·服务器·pdf·网页转pdf
Elastic 中国社区官方博客1 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
RoboWizard1 小时前
金士顿高速闪存盘 单双接口适配多元存储需求
大数据·运维·人工智能·智能手机·云计算
hkj88081 小时前
Ubuntu 20.04 安装 OpenJDK 17
linux·运维·ubuntu
sulikey2 小时前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器