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 - Community Version: 26.1.4 API version: 1.45 Go version: go1.21.11 Git commit: 5650f9b Built: Wed Jun 5 11:32:04 2024 OS/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 the executable that produces the output you are currently reading. #docker守护进程从镜像创建容器,可执行的程序 4. The Docker daemon streamed that output to the Docker client, which sent it to 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 其下的镜像的所有层都是readonly Docker将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
标签:容器,01,docker01,镜像,docker,root,alpine From: https://www.cnblogs.com/ludingchao/p/18251162