docker基本管理和应用

docker是什么?

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

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

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

设计理念

鲸鱼-------------------->宿主机

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

容器化的特点

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

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

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

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

5、可扩展(依赖于k8s)

容器是什么

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

轻量级,容器运行时占用的资源,但是不占用其他任务的资源

docker和虚拟机的区别

docker 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗50%
性能 接近原生性能 只有80%
系统支持数据 上千个(理论上)正常几十个 部署也就几十个
隔离性 资源隔离 完全隔离
安全性 安全性差 安全性高
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空间当中,每个进程都有独立的用户和用户组。每个用户之间可以互相不受影响。

docker的核心概念

1、镜像

镜像时创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器。

在镜像当中,已经封装好了程序运行需要的代码,库,运行时间,环境变量以及配置文件。

2、容器

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

3、仓库

用来保存镜像的地方。共有仓库(docker hub 阿里云)。

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

工作流程

上传镜像--------拉取镜像---创建容器

安装docker

复制代码
[root@docker2 opt]# yum install -y yum-utils device-mapper-persistent-data lvm2 
[root@docker2 opt]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@docker2 opt]# yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io
#阿里云官网复制
[root@docker1 docker]# mkdir -p /etc/docker
[root@docker1 docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://jvzk7vuy.mirror.aliyuncs.com"]
> }
> EOF
{
  "registry-mirrors": ["https://jvzk7vuy.mirror.aliyuncs.com"]
}
[root@docker1 docker]# systemctl daemon-reload
[root@docker1 docker]# systemctl restart docker
[root@docker1 docker]# vim /etc/docker/daemon.json 
{
​
    "registry-mirrors": ["https://hub.littlediary.cn/"]
​
}
[root@docker1 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
​
​

docker的文件系统

查看文件系统

复制代码
查看文件系统
[root@docker1 docker]# docker inspect (imageID)
​
#文件系统里的重要信息
overlayFS:联合文件系统。用于docker等容器技术之中。
​
把多个文件系统层叠在一起,形成一个统一的文件系统
​
LowerDir:底层目录
​
包含的底层文件系统,容器运行的基础环境的文件系统。根文件系统
​
UpperDir:可写层
​
容器可以在底层文件系统的基础上进行修改,即容器内部发生写操作。这些修改不影响底层的文件系统。
​
达到容器内部的可写性
​
MergedDir:合并目录
​
把底层目录和可写层以及其他目录组成联合目录。也就是容器使用的文件系统。
​
WorkDir:工作目录
​
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理。
​
​

删除镜像

复制代码
删除镜像
[root@docker1 docker]# docker rmi -f (imageID)
如果不加-f,镜像被使用,且容器正在进行。才能删除。
#有重复可以删版本
[root@docker1 docker]# docker rmi -f 版本
#把nginx:1.18导出到/opt/下nginx1.18.tar
[root@docker1 docker]# docker save -o /opt/nginx1.18.tar nginx:1.18
#把/opt/下的文件导入
[root@docker1 docker]# docker load -i nginx1.18.tar
​

容器操作:前提是必须要有镜像

复制代码
[root@docker1 opt]# docker create -it nginx:1.18
-i  容器和用户之间可以进行交互
-t  开启一个伪终端,用户操作
-it  开启一个终端,让用户可以用交互式会话访问容器,进行操作
fbd0272801f428ebcf5ac697923060a7b56393011860300e41b7b7f277371ba4
[root@docker1 opt]# docker ps -a 
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS    PORTS     NAMES
fbd0272801f4   nginx:1.18   "/docker-entrypoint.…"   8 seconds ago   Created             unruffled_napier
​
CONTAINERID:容器的唯一的标识
IMAGE:  容器所依赖的镜像
command: 容器默认运行的命令
CREATED:容器的创建时间
ports:容器暴露的端口
NAMES:容器的名称,系统随机分配的。也可以指定容器的名称
STATUS:创建成功,不是运行。Up,表示运行状态。Exited:停止运行 Created:创建成功

容器的生命周期

拉取镜像---创建容器---修改镜像---重启容器---停止容器---删除容器---删除镜像

复制代码
[root@docker1 opt]# docker ps -a 
#查看所有容器,包括未运行的容器
[root@docker1 opt]# docker ps
#只查看运行的容器
[root@docker1 opt]# docker run
#本地没有的镜像,他会自动拉取然后再运行

直接进入容器

复制代码
[root@docker1 opt]# docker run -it centos:7
[root@c194306b4b60 /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@c194306b4b60 /]# exit
exit
[root@docker1 opt]# 
​

容器内部如果没有命令执行,容器会自动终止运行。

如果有命令,执行完命令之后,容器也会终止运行。

容器要长期运行,稳定运行,必须要有一个可执行的持续的命令。

复制代码
#自动拉取nginx:1.18,名字是nginx1
[root@docker1 opt]# docker run -itd --name nginx1 nginx:1.18 
158ad2622ba165560dfeae20e1e23b5a64391cea9e4f3fa9a22713012affce84
#查询docker的ip地址
[root@docker1 opt]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
172.17.0.2
​
-itd
d:后台运行,指定后台运行的命令,这样我们创建完整之后,即便是有-it也不会进入容器,
进入容器内部查看:
docker exec -it 容器名称/容器的id /bin/bash bash
'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
进入容器的network命令空间,获取它的ip地址
#动态查看日志
[root@docker1 opt]# docker logs -f nginx1
​

创建的时候会有一个默认的输出或者命令

/bin/bash---------默认的执行命令覆盖,虽然nginx正在运行,但是运行的不再是nginx的进程,而是/bin/bash

端口映射

本地端口和容器端口映射

复制代码
#-P 随机指定宿主机的端口和容器的端口进行映射 端口号从32768开始
[root@docker1 opt]# docker run -itd --name nginx3 -p 81:80 nginx:1.22
7f77b2ac050d98a3f29e8eb5ffa6d7c569fd566e4b656f1cd1c00f6d3105abe9
[root@docker1 opt]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS                               NAMES
7f77b2ac050d   nginx:1.22   "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   nginx3
​

面试题

怎么向容器中复制文件

复制代码
#把宿主机文件复制到容器
[root@docker1 opt]# docker cp /opt/index.html nginx1:/usr/share/nginx/html
​

怎么把容器文件复制出来

复制代码
[root@docker1 opt]# docker cp 158ad2622ba1:/etc/nginx/nginx.conf /opt/
Successfully copied 2.56kB to /opt/
[root@docker1 opt]# ls
containerd  index.html  nginx1.18.tar  nginx.conf
​

导出容器

复制代码
[root@docker1 opt]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS     NAMES
158ad2622ba1   nginx:1.18   "/docker-entrypoint.…"   18 minutes ago   Up 18 minutes   80/tcp    nginx1
[root@docker1 opt]# docker export -o /opt/nginx1.tar 158ad2622ba1
[root@docker1 opt]# ls
containerd  index.html  nginx1.18.tar  nginx1.tar  nginx.conf

怎么删除容器

复制代码
[root@docker1 opt]# docker rm -f nginx1
nginx1
​

docker的命令

复制代码
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           #批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi     #删除none镜像
​
docker rm $(docker ps -a -q)        #批量清理后台停止的容器
复制代码
#批量删除
[root@docker1 opt]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
不在运行的容器就会被删除,在运行的删除不掉。

运行容器

复制代码
创建容器
[root@docker1 opt]# docker create -it nginx:1.22
e95499a02b18e60d75cb6b5fdc36bc9f74a2a34cfa66d49fc58a280350e0053e
#查看容器运行状态
[root@docker1 opt]# docker ps -a  
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                               NAMES
e95499a02b18   nginx:1.22   "/docker-entrypoint.…"   3 seconds ago    Created                                             objective_herschel
#启动容器
[root@docker1 opt]# docker start e95499a02b18
e95499a02b18
#查看容器是否运行起来
[root@docker1 opt]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                               NAMES
e95499a02b18   nginx:1.22   "/docker-entrypoint.…"   46 seconds ago   Up 11 seconds   80/tcp                              objective_herschel              #up表示正在运行
​

容器在运行时删不掉,只有先停容器再删镜像

1、6个命令空间隔离

2、docker pull nginx:1.22 #获取镜像到仓库

3、docker imagres #查看仓库所有镜像

4、docker pull 上传

5、docker run -itd --name xxx -p 81:80 nginx:1.22 /bin/bash

6、docker logs -f 查看日志

7、docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 获取容器ip地址

8、docker cp /opt test1:/opt 宿主机到容器

docker cp test1:/opt /opt 容器到宿主机

9、docker save -o /opt/nginx.tar nginx:1.22 #导出nginx版本

docker load -i /opt/nginx.tar #导入nginx版本到容器

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

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

11、删除镜像 docker rmi -f

删除容器 docker rm -f

相关推荐
青木沐1 小时前
Jenkins介绍
运维·jenkins
WTT00111 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
日记跟新中2 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
明 庭2 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
BUG 4042 小时前
Linux——Shell
linux·运维·服务器
大霞上仙3 小时前
Linux 多命令执行
linux·运维·服务器
冷心笑看丽美人3 小时前
探索 Samba 服务器:搭建跨平台文件共享的桥梁
运维·服务器