docker阶段01 容器化概述, Docker介绍, 安装, 镜像特性和操作, 容器操作

news/2024/10/3 23:34:32

1.容器化概述

容器: 泛指可以存放其他物品的一种容纳工具,部分和完全封闭的
单台服务器运行多个环境程序假如让不同的环境程序运行在不同环境中 容器中怎么实现:
1.通过虚拟化实现,如图,通过kvm相当于创建了多个独立的操作系统

2.通过容器实现,依赖于宿主机操作系统,更省资源。如图

容器实现名称空间隔离    NameSpace    资源隔离六个资源隔离:
PID            进程编号            2.6.24+(内核版本要求)
NET            网络设备、网络协议栈 端口等    2.26.29+(内核版本要求)
IPC            信息量 消息队列 共享内存    2.6.19+(内核版本要求)
Mount        文件系统 挂载点           2.4.19+(内核版本要求)
UTS            主机名和主机域               2.6.19+
USER        操作进程的用户和用户组        3.8+#创建docker虚拟环境
>2G        这里给4G操作速度快些
#centos7操作系统内核都是3.10以上
[root@docker01 ~]# uname -r
3.10.0-957.el7.x86_64

2.容器的历史

一个容器包含了完整的运行环境: 除了应用程序本身以外  将所需的依赖  库  二进制文件  配置文件  都统一打包到一个叫容器镜像的包中容器的优点敏捷环境    创建速度快提高生产力运行环境可移植标准化版本控制安全容器的缺点复杂性增加    平台工具管理    k8s/Mesos容器化和虚拟化区别容器相对虚拟机来说更轻量化两个都是构建一套能够不依赖于具体环境而运行的应用程序虚拟化需要 hypervisor 作为虚拟机监视器  中间层  虚拟机启动都是hypervisor 进行分配资源容器不需要hypervisor

3.Docker介绍

Docker是基于容器技术的轻量化虚拟化的解决方案
容器引擎
基于go语言实现的
Docker引入了一整套容器管理的生态系统    包括分层的镜像模型    容器的注册库    API
C/S架构        容器    镜像
容器是隔离的,但是共享操作系统和适当的库和二进制文件    bins    libs

4.Docker安装部署

企业版EE    支持12个月的技术支持        社区版CE    只支持4个月的技术支持
2017年第一季度    使用YY.MM-xx格式
Docker-1.13        老格式#环境准备,创建docker虚拟环境
4G内存    >50G硬盘[root@docker01 ~]# iptables-save
[root@docker01 ~]# getenforce
Disabled
[root@docker01 ~]# date
Sat Jun 15 06:47:02 CST 2024
[root@docker01 ~]# uname -r
3.10.0-957.el7.x86_64
[root@docker01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
#确保有源,能上网
[root@docker01 ~]# ll /etc/yum.repos.d
total 8
-rw-r--r--. 1 root root 2523 Jun 14  2023 CentOS-Base.repo
-rw-r--r--. 1 root root  664 Jun 14  2023 epel.repo#查看系统中默认docker软件
[root@docker01 ~]# yum list docker --show-duplicates
#1.13.1,是2017年的老版本(太老了)#使用存储库安装
在新主机首次安装Docker Engine之前,需要设置Docker存储库。之后,可以从存储库安装和更新Docker。
设置存储库
安装yum-util软件包(提供yum-config-manager 使用程序)并设置稳定的存储库。[root@docker01 ~]# yum install -y yum-utils
#设置存储库(官网这个测试无法访问,可以用下面国内存储库)
[root@docker01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#国内存储库(阿里云库)
[root@docker01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#执行完,查看yum是否有新的docker包
[root@docker01 ~]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.com
docker-ce-stable                                                                  | 3.5 kB  00:00:00 
(1/2): docker-ce-stable/7/x86_64/updateinfo                                       |   55 B  00:00:00 
(2/2): docker-ce-stable/7/x86_64/primary_db                                       | 152 kB  00:00:00
base/7/x86_64                          CentOS-7 - Base - mirrors.aliyun.com                        10,072
docker-ce-stable/7/x86_64              Docker CE Stable - x86_64                                      337
epel/x86_64                            Extra Packages for Enterprise Linux 7 - x86_64              13,791
extras/7/x86_64                        CentOS-7 - Extras - mirrors.aliyun.com                         526
updates/7/x86_64                       CentOS-7 - Updates - mirrors.aliyun.com                      6,149
#查看源里docker版本,这个名称是docker-ce
[root@docker01 ~]# yum list docker-ce --show-duplicates#安装最新版本
[root@docker01 ~]# yum install -y docker-ce
#也可以提前下载包安装
[root@docker01 ~]# rz
docker-ce.tar.gz
[root@docker01 ~]# tar xf docker-ce.tar.gz
[root@docker01 ~]# yum localinstall -y opt/*.rpm#启动docker,并加入开机自启动
[root@docker01 ~]# systemctl start docker.service
[root@docker01 ~]# systemctl enable docker.service

[root@docker01 ~]# mkdir -p /data/docker#配置docker (编辑时把注释删掉)
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"data-root": "/data/docker",        #指定工作目录(graph已废弃)
"storage-driver": "overlay2",    #存储驱动
"insecure-registries": ["registry.access.redhat.com","quay.io"], #仓库(这里是默认,可以加私有仓库)
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"], #镜像加速源
"bip": "172.0.181.1/24", #docker容器IP地址(格式:172主机外网ip,0.181内网后两位,最后一位必须从1开始)
"exec-opts": ["native.cgroupdriver=systemd"], #本地的驱动
"live-restore": true #docker服务以外重启时容器自启动(故障自动恢复)
}#重启,加载配置
[root@docker01 ~]# systemctl restart docker.service#检查docker版本相关信息
[root@docker01 ~]# docker version
Client: Docker Engine - CommunityVersion:           26.1.4API version:       1.45Go version:        go1.21.11Git commit:        5650f9bBuilt:             Wed Jun  5 11:32:04 2024OS/Arch:           linux/amd64
...#查看docker信息,如果有返回,说明docker没问题
[root@docker01 ~]# docker info
#默认启动docker会启动iptables,这个iptable做了一些规则,不用管
[root@docker01 ~]# iptables-save#查看docker命令
[root@docker01 ~]# docker image
#查看docker镜像(两条命令都行)
[root@docker01 ~]# docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@docker01 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE#显示所有的容器
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES#启动第一个容器
[root@docker01 ~]# docker run hello-world    #会从docker官方仓库下载
...
To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.#docker客户端联系docker守护进程2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)#docker守护进程从docker中心拉取镜像3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.#docker守护进程从镜像创建容器,可执行的程序4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.#docker守护进程将输出流发送docker客户端,你的终端#查看镜像是否被下载
[root@docker01 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB
#查看运行的容器(这里容器已经死了)
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
3c66e988f468   hello-world   "/hello"   8 minutes ago   Exited (0) 8 minutes ago             recursing_sinoussi

5.Docker镜像介绍

镜像        images
容器        container
仓库        repository    repositories    registry

镜像的结构    (查看镜像时名称显示格式)
注册表/仓库名称/镜像名称:版本号    #官方默认,可以不写注册表/仓库名称。非官方的要写
docker.io/library/hello-word:latest    #官方默认的情况真正的显示格式
${registry_name}/${repository_name}/${image_name}:${tag_name}镜像仓库
https://hub.docker.com/  == https://dockerhub.com/    #会跳转

dockerhub    是一个提供docker镜像的仓库    提供了针对每个镜像的解决方案#登录docker.io(官方镜像仓库),进去拉取镜像(即使不登录,拉取的也是官方镜像,如果是私有仓库,一定要登录)
[root@docker01 ~]# docker login docker.io
#只有登录成功,才能在这个仓库传镜像,下载镜像#退出登录
[root@docker01 ~]# docker logout#登录后,这里会存放用户登录信息
[root@docker01 ~]# cat /root/.docker/config.json#搜寻镜像
[root@docker01 ~]# docker search alpine
NAME                               DESCRIPTION                                     STARS     OFFICIAL
alpine                             A minimal Docker image based on Alpine Linux…   10883     [OK]
alpinelinux/docker-cli             Simple and lightweight Alpine Linux image wi…   11        
alpinelinux/alpine-gitlab-ci       Build Alpine Linux packages with Gitlab CI      3         
alpinelinux/gitlab-runner-helper   Helper image container gitlab-runner-helper …   7         
...
#下载镜像
[root@docker01 ~]# docker pull alpine:3.12.0    #指定版本,不加版本为最新版本
[root@docker01 ~]# docker pull alpine            #下载最新版本

[root@docker01 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB
alpine        3.12.0    a24bb4013296   4 years ago   5.57MB
#镜像上传dockhub自己的私有仓库前要打镜像(这里自定义镜像仓库名称,qls仓库名称也是用户名)
#给镜像打标签(命令中image可以省略)
[root@docker01 ~]# docker image tag a24bb4013296 docker.io/qls/alpine:v3.12.0
#注:打完tag,用查看所有镜像,会有2个镜像,实际是做了引用,删掉原镜像,有tag的镜像也能用#查看镜像,因为docker.io是官方的,所以版本显示里省略了
[root@docker01 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB
alpine        3.12.0    a24bb4013296   4 years ago   5.57MB
qls/alpine    v3.12.0   a24bb4013296   4 years ago   5.57MB#推送镜像到自己的官方仓库
[root@docker01 ~]# docker push docker.io/qls/alpine:v3.12.0     #这里可以省略docker.io#从私有仓库下载镜像
[root@docker01 ~]# docker pull docker.io/qls/alpine:v3.10.5#删除镜像(也可以通过镜像ID)
[root@docker01 ~]# docker rmi alpine:3.12.0
[root@docker01 ~]# docker rmi 5a01c029c96b
#强制删除(如果该镜像对应容器在运行,无法删除,可以强制删除)
[root@docker01 ~]# docker rmi -f hello-world:latest

7.Docker的镜像特性

Docker镜像位于bootfs(file system)或者rootfs之上    文件系统每层镜像的下面一层镜像称为其父镜像 (父子关系)第一层镜像都是Base image容器在最顶层    容器是有状态的  running(UP)  exited  其下的镜像的所有层都是readonlyDocker将readonly的fs(file system)层称之为image

8.Docker容器的基础操作

#查看本地容器的列表
[root@docker01 ~]# docker ps -all
[root@docker01 ~]# docker ps -a#启动容器    (运行镜像)
docker run
命令格式
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]选项:
-i        #表示启动一个可交互式的容器,并能持续打开进行输入(和-t一起使用)
-t        #表示使用终端关联到容器的输入输出(和-i一起使用)
-d        #将容器放入到后台运行
--rm    #退出后即删除容器
--name    #给容器起个名字

COMMAND    #在容器里执行的命令#启动一个容器(如果本地没有,先从官方下载,再启动。本地有就直接启动)
[root@docker01 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB
qls/alpine    v3.12.0   a24bb4013296   4 years ago   5.57MB
#启动容器并进入容器
#注意最小系统alpine里,只认识/bin/sh,没有/bin/bash
[root@docker01 ~]# docker run -ti docker.io/qls/alpine:v3.12.0 /bin/sh
#省略docker.io也可以,因为是默认路径
[root@docker01 ~]# docker run -ti qls/alpine:v3.12.0 /bin/sh
#退出容器,因为交互式容器会关闭
/ # exit#给容器起名字
[root@docker01 ~]# docker run -ti --name qls qls/alpine:v3.12.0 /bin/sh#放入后台运行,起个名称test
[root@docker01 ~]# docker run -ti -d --name test qls/alpine:v3.12.0 /bin/sh
759aafa1b3bfe3435921d2fdbcd3777a42bcd639505fc7aa9a8d8939218d4e55#创建一次性容器,退出后容器就没了。 docker ps -a查不到该镜像了
[root@docker01 ~]# docker run --rm -ti qls/alpine:v3.12.0 /bin/sh#启动一个非交互式后台运行容器,必须给命令,比如/bin/sh,不给控制不了(命令执行完容器就会结束)
[root@docker01 ~]# docker run -d --name qiudao qls/alpine:v3.12.0 /bin/sleep 300
de478c960115b0581d6f6b4af1ebdaafcc9a0c58f2eb5a3d9dcebd23b8d621a6
[root@docker01 ~]# docker ps -a|grep qiudao
de478c960115   qls/alpine:v3.12.0   "/bin/sh"     2 minutes ago    Exited (0) 2 minutes ago             qiudao
#容器运行的sleep任务能在宿主机搜到,但是不影响其他人
[root@docker01 ~]# ps aux|grep sleep#进入容器
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE                COMMAND     CREATED          STATUS          PORTS     NAMES
759aafa1b3bf   qls/alpine:v3.12.0   "/bin/sh"   51 minutes ago   Up 51 minutes             test
#输入容器id或者name都可以 (必须给命令,前台能够执行,才能挂住。否则进入不了)
[root@docker01 ~]# docker exec -it 759aafa1b3bf /bin/sh
[root@docker01 ~]# docker exec -ti test /bin/sh#停止容器    (输入容器id或者name都可以)
[root@docker01 ~]# docker stop test
test#启动容器
[root@docker01 ~]# docker start test
test#重启容器
[root@docker01 ~]# docker restart test#删除容器(不在运行的)
[root@docker01 ~]# docker rm 0554e547cdcc
#强制删除在运行中的容器
[root@docker01 ~]# docker rm -f test#批量删除已经死掉的容器
[root@docker01 ~]# for i in $(docker ps -a|grep -i exited|awk '{print $1}');do docker rm -f $i;done#获取所有容器id
[root@docker01 ~]# docker ps -a -q
de478c960115
79f0afb35a0c
a794ce9de251
3d3b6b604d4e
3c66e988f468
#删除所有容器
[root@docker01 ~]# docker rm -f $(docker ps -a -q)#可以在xshell里,查看下快速命令里设置批量删除快捷按钮,就不用记了

#修改/提交容器
#创建容器
[root@docker01 ~]# docker run -ti -d --name qls01 qls/alpine:v3.12.0 /bin/sh
a4704b2a191f3796f75ddfad4d041738ec9b1581eeb7fc97e468a6bdef3cb85e
#进入容器
[root@docker01 ~]# docker exec -ti qls01 /bin/sh
/ # echo "test" >> test.txt
/ # exit#提交镜像
#速度快,添加增加的内容,底层有,不需要重新做镜像(不用管镜像多大,上传镜像只上传追加部分)
[root@docker01 ~]# docker commit -p qls01 docker.io/qls123/alpine:v3.12.0_create_test.txt
sha256:5a01c029c96b41a5718efaaca89aef3b8cc2ad10e4d991e75b062f2a2694797c
[root@docker01 ~]# docker images
REPOSITORY      TAG                       IMAGE ID       CREATED         SIZE
qls123/alpine   v3.12.0_create_test.txt   5a01c029c96b   6 seconds ago   5.57MB
qls/alpine      v3.12.0                   a24bb4013296   4 years ago     5.57MB#运行一次性镜像,看里面内容
[root@docker01 ~]# docker run --rm docker.io/qls123/alpine:v3.12.0_create_test.txt /bin/cat test.txt
test#导入导出镜像#删除镜像
[root@docker01 ~]# docker rmi 5a01c029c96b#导出镜像
[root@docker01 ~]# docker save a24bb4013296 > alpine_v3.12.0.tar#导入镜像
[root@docker01 ~]# docker load < alpine_v3.12.0.tar 
#或者
[root@docker01 ~]# docker load -i alpine_v3.12.0.tar
50644c29ef5a: Loading layer  5.845MB/5.845MB
Loaded image ID: sha256:a24bb4013296f61e89ba57005a7b3e52274d8edd3ae2077d04395f806b63d83e
#导入后不认识版本和注册表信息
[root@docker01 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
<none>       <none>    a24bb4013296   4 years ago   5.57MB
#打个标签
[root@docker01 ~]# docker tag a24bb4013296 docker.io/qls123/alpine:v3.12.0
[root@docker01 ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED       SIZE
qls123/alpine   v3.12.0   a24bb4013296   4 years ago   5.57MB#查看容器的日志
[root@docker01 ~]# docker run -ti -d --name qls01 qls123/alpine:v3.12.0 /bin/sh
c703ff2732f35c7ac01b443f17c6896d3fbabf063dba10505b8dca2d390194c7
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE                   COMMAND     CREATED          STATUS          PORTS     NAMES
c703ff2732f3   qls123/alpine:v3.12.0   "/bin/sh"   29 seconds ago   Up 28 seconds             qls01
#查看日志
[root@docker01 ~]# docker logs c703ff2732f3
#实时查看日志
[root@docker01 ~]# docker logs -f c703ff2732f3

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

FASTAPI从入门到进阶

fastapi框架fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。 fastapi是建立在Starlette和Pydantic基础上的,Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包,是构建高性能Asyncio服务的理性选择。…

『手写Mybatis』实现映射器的注册和使用

前言 如何面对复杂系统的设计? 我们可以把 Spring、MyBatis、Dubbo 这样的大型框架或者一些公司内部的较核心的项目,都可以称为复杂的系统。 这样的工程也不在是初学编程手里的玩具项目,没有所谓的 CRUD,更多时候要面对的都是对系统分层的结构设计和聚合逻辑功能的实现,再…

松鼠的新家

https://www.luogu.com.cn/problem/P3258 考虑用 LCA。 注意我们不统一起点,统计终点。 最后统一然起点多一个糖果,终点较少一个。 首先处理链的情况。 然后对于一般情况:注意我们最后从下往上做差分,发现 \(s_x+=1,s_y+=1,s_p+=1,s_{pf}+=0\),符合要求。

裸函数和调用约定

一、裸函数 在正常的函数编译中,即使函数没有定义函数体的内容,编译器也依然会编译出部分汇编指令用来执行函数。但是如果定义一个裸函数 void _declspec(naked) test()编译器将不会操作这个函数,不会给其生成汇编指令(但是会在主函数中生成call和jmp指令指向这个裸函数)可…

帮猪猪修修改的代码2016年的代码记录

这是一个图片轮播的代码,但是它们的是css 动画,当时代码运行不了,我花了二天才修改,现在记录一下,凭回忆用。<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>网易科技</title> <meta name="…

input的时候, 我输入一条链接可以运行,但输入两条会报错?

大家好,我是Python进阶者。 一、前言 前几天在Python交流群【Cappuccino】问了一个Python基础的问题,问题如下:再問一個沒那麼複雜的問題,請教一下,當我改成input 的時候, 我輸入一條鏈接可以運行,但輸入兩條就會報錯,請問多於一條鏈接的輸入格式是怎樣呢? 二、实现过…

Nivdia向量数据库图检索最新标杆——CAGRA

本文连接:https://wanger-sjtu.github.io/CARGA/ CAGRA 是 N社在RAFT项目中 最新的 ANN 向量索引。这是一种高性能的、 GPU 加速的、基于图的方法,尤其是针对小批量情况进行了优化,其中每次查找只包含一个或几个查询向量。 与其他像HNSW、SONG等这类基于图的方法相似,CAGRA…

[转]32th@探索C++的模板元编程:揭秘零运行时开销的高性能编程技术@20240616

C++的模板元编程是一种强大的编程技术,它能够在编译时进行计算,生成高效的代码,而且不需要任何运行时开销。这种技术被广泛应用于高性能计算、游戏开发、金融等领域,是C++程序员必须掌握的技能之一。本文将深入探讨C++模板元编程的原理和实现方式,并通过代码案例来展示其强…