什么是Docke,部署dockers,和基本操作命令

Docker简介

什么是容器

  • 容器是用来装东西的,Linux 里面的容器是用来装应用的;

  • 容器就是将软件打包成标准化单元,以用于开发、交付和部署;

  • 容器技术已经成为应用程序封装和交付的核心技术;

  • 容器原理:容器技术的核心,由以下几个内核技术组成:

    • Cgroups (Control Groups) :资源管理
    • SELinux:安全 (是针对于文件系统,文件的管理措施)
    • NameSpace:命名空间

命名空间

  • 是指可以对系统资源空间进行分割隔离的技术
  • 例如:创建一个虚拟机,在虚拟机里的所有操作,都不会对真实机造成影响。
  • 命名空间分为六大类,可以从各个方面来对系统资源空间进行隔离;
    • UTS:主机名隔离
    • NETWORK:网络隔离
    • MOUNT:文件系统隔离
    • USER:用户隔离
    • PID:进程隔离
    • IPC:信号向量隔离

Docker 的优缺点

  • 优点

    • 相比于传统的虚拟化技术,容器更加简洁高效
    • 传统虚拟机需要给每个 VM 安装操作系统
    • 容器使用的共享公共库和程序
  • 缺点

    • 容器的隔离性没有虚拟机强
    • 共用Linux内核,安全性有先天缺陷

在这里插入图片描述
Docker

使用Vmware的克隆以下机器,配置如下

主机名IP地址内存CPU
docker-0001192.168.8.1072G2
docker-0002192.168.8.1082G2

docker-0001配置IP地址和主机名

[root@template ~]# hostnamectl set-hostname docker-0001
[root@docker-0001 ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses  192.168.8.107/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254  connection.autoconnect yes
[root@docker-0001 ~]# nmcli connection up ens160
[root@docker-0001 ~]# dnf clean all
[root@docker-0001 ~]# dnf repolist
[root@docker-0001 ~]# dnf -y install lrzsz

docker-0002配置IP地址和主机名

[root@localhost ~]# hostnamectl set-hostname docker-0002
[root@docker-0002 ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.108/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254  connection.autoconnect yes
[root@docker-0002 ~]# nmcli connection up ens160
[root@docker-0002 ~]# dnf clean all
[root@docker-0002 ~]# dnf repolist
[root@docker-0002 ~]# dnf -y install lrzsz

Docker安装

docker安装(两台主机都要安装,以docker-0001为例)

开启路由转发,docker是通过虚拟交换机来进行通讯的,需要开启路由转发的功能

[root@docker-0001 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@docker-0001 ~]# sysctl -p              #sysctl -p 让配置立刻生效(否则需要重启虚拟机)

2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹上传至虚拟机docker-0001和虚拟机docker-0002的/root

命令说明
docker version查看服务器与客户端版本
docker info查看 docker 服务配置信息
[root@docker-0001 ~]# dnf remove podman					#卸载冲突的软件包
[root@docker-0001 ~]# dnf remove runc
[root@docker-0001 ~]# dnf -y install lrzsz
[root@docker-0001 ~]# cd /root/docker
[root@docker-0001 ~]# dnf -y localinstall *.rpm			#安装docker
[root@docker-0001 docker]# systemctl start docker		#启动服务
[root@docker-0001 docker]# systemctl enable docker		#将服务设置为开机自启
[root@docker-0001 docker]# docker version				#查看版本

Docker镜像管理

什么是镜像

  • 镜像是启动容器的核心

  • 在Docker 中容器是基于镜像启动的

  • 镜像采用分层设计,使用 COW 技术

在这里插入图片描述

  • 容器本身是没有操作系统,和宿主机共用一个操作系统;

  • 容器是docker(容器的管理工具)使用镜像文件来启动的;

  • 镜像是启动容器的模板,镜像中存放的是应用程序(服务软件),例如: 有一个http的镜像文件,在这个镜像中就存放的是http的所有文件和变量;

  • 用户使用镜像启动容器时,会生成一个独立于镜像的容器层,并不会对镜像层产生任何影响;

  • 而且容器采用了cow(写时复制)的技术,用户可以使用一个镜像文件创建多个容器,互不干扰;

  • 镜像采用分层技术:

    • 用户可以根据自己的需求来制作镜像,例如:在镜像的第一层定义应用程序的变量,在镜像的第二层修改配置文件,在镜像的第三层进行应用软件的部署;
    • 分层做好镜像后,用户使用镜像启动容器时,可以选择根据镜像的哪一层来启动,类似快照还原;
  • 镜像来源

    • 镜像可以从官方镜像仓库下载https://hub.docker.com
    • 自己制作

添加镜像加速器

  • docker-0001和docker-0002都做此操作
  • 使用华为云的镜像加速器,每个人的都不一样
    在这里插入图片描述
    docker-0001操作
[root@docker-0001 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["这里配置镜像仓库加速器地址"],
    "insecure-registries":[]
}
[root@docker-0001 ~]# systemctl restart docker 
[root@docker-0001 ~]# docker info
...
 Registry Mirrors:
  https://5af9fd904da541d2b1e38ab2771311a9.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false

docker-0002操作

[root@docker-0002 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["这里配置镜像仓库加速器地址"],
    "insecure-registries":[]
}
[root@docker-0001 ~]# systemctl restart docker 
[root@docker-0001 ~]# docker info
...
 Registry Mirrors:
  https://5af9fd904da541d2b1e38ab2771311a9.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false

镜像管理

镜像管理命令说明
docker images查看本机镜像
docker pull 镜像名称:标签下载镜像
docker save 镜像名称:标签 -o 文件名备份镜像为tar包
docker load -i 备份文件名称导入备份的镜像文件
docker history 镜像名称:标签查看镜像的制作历史
docker search 关键字搜索镜像
[root@docker-0001 ~]# docker images          #还没有导入镜像,所以没有镜像
[root@docker-0001 ~]# docker search busybox
NAME     DESCRIPTION   			STARS  	OFFICIAL   AUTOMATED
busybox   Busybox base image.  	2010   	[OK] 
[root@docker-0001 ~]# docker pull busybox

查看镜像

[root@docker-0001 ~]# docker images
REPOSITORY     TAG      IMAGE ID       CREATED       SIZE
busybox        latest   6858809bf669   4 weeks ago   1.232 MB
#REPOSITORY  镜像名称
#TAG         镜像标签
#IMAGE ID    镜像ID号
#CREATED     镜像创建时间
#SIZE        镜像大小

镜像的备份与恢复

  • docker save 镜像名称:镜像标签 -o 备份文件夹(tar格式)
  • 恢复镜像(导入镜像):docker load -i 备份文件名称

docker-0001导出镜像(备份)

[root@docker-0001 ~]# docker save busybox:latest  -o /root/busybox.tar
#导出镜像busybox,需要指定名字和标签,导出到/root目录下,名称为busybox.tar
#名称和路径可以随意指定

拷贝备份镜像到docker-0002上

[root@docker-0001 ~]# scp /root/busybox.tar  192.168.8.108:/root/

docker-0002恢复镜像

[root@docker-0002 ~]# docker load -i busybox.tar 
[root@docker-0002 ~]# docker images 

2024-AI大模型Java全链路工程师环境资料/第四模块/myos.tar.xz上传至虚拟机docker-0001

[root@docker-0001 ~]# docker load -i myos.tar.xz				#导入镜像
[root@docker-0001 ~]# docker images 							#查看镜像
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myos         php-fpm   f70bdfd2042c   15 months ago   275MB
myos         nginx     10dc658da2fe   15 months ago   274MB
myos         latest    1de38c85c2d1   15 months ago   4.67MB
myos         httpd     9245e660f88f   15 months ago   299MB
myos         8.5       621bfd7f9b46   15 months ago   249MB
busybox      latest    beae173ccac6   2 years ago     1.24MB
rockylinux   8.5       210996f98b85   2 years ago     205MB

案例

  • 将rockylinux:8.5导出为rockylinux.tar,并在docker-0002上完成导入
  • docker-0001看镜像rockylinux:8.5的制作历史
[root@docker-0001 ~]# docker save rockylinux:8.5 -o rockylinux.tar		#导出镜像
[root@docker-0001 ~]# scp rockylinux.tar root@192.168.8.108:/root
[root@docker-0002 ~]# docker load -i rockylinux.tar 					#导入镜像
[root@docker-0002 ~]# docker images 									#查看镜像
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
rockylinux   8.5       210996f98b85   2 years ago   205MB
[root@docker-0001 ~]# docker history rockylinux:8.5			#由下到上,镜像可以分为3层 

Docker容器管理

容器管理命令说明
docker run -it(d) 镜像名称:标签创建容器
docker ps查看容器的信息
docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id启动、停止、重启容器
docker exec -it 容器ID 启动命令在容器内执行命令
docker cp 路径1 路径2拷贝文件:路径格式(本机路径、容器ID/路径)

运行容器

docker-0001使用myos:8.5启动容器

[root@docker-0001 ~]# docker run -it myos:8.5					#不加d选项直接进入容器
[root@9ddb443b9dac /]# exit
[root@docker-0001 ~]# docker run -itd myos:8.5					#加上d选项将容器放后台
d20df0c33f45e0b243afc5de3f5f3c6c41ef08ac343b2ca49f90d472c6dd4514
[root@docker-0001 ~]# 

docker-0001使用myos:nginx启动容器并放在后台运行

[root@docker-0001 ~]# docker run -itd myos:nginx 
0910a365ee6398a48bdfd0e191c758a5a24effb371b9e20e8efa12095e7dad24

查看容器

[root@docker-0001 ~]# docker ps
[root@docker-0001 ~]# docker ps -a			#ps -a 查看创建的所有的容器(运行的和已经停止的)
[root@docker-0001 ~]# docker ps -q			#ps -q 查看运行中容器的ID值
[root@docker-0001 ~]# docker ps -aq			 #ps -aq查看所有容器的id,用于脚本对容器的管理

删除容器(容器ID不能照抄,每个人都不一样)

[root@docker-0001 ~]# docker rm d20df0c33f

删除正在使用的容器时,会报错,无法删除,需要先停止容器,再执行删除命令

[root@docker-0001 ~]# docker stop 512567e6f64f		#停止容器
[root@docker-0001 ~]# docker rm 512567e6f64f

删除所有的容器:支持命令行重录,前一个命令的结果$(docker ps -aq)可以作为后一个命令的参数

[root@docker-0001 ~]# docker rm -f $(docker ps -aq)		#$()用来获取命令的执行结果

容器启动、停止、重启

[root@docker-0001 ~]# docker run -itd  nginx:latest 
[root@docker-0001 ~]# docker stop 38b8ee2a8754				#停止容器
[root@docker-0001 ~]# docker start 38b8ee2a8754				#启动容器			
[root@docker-0001 ~]# docker restart 38b8ee2a8754			#重启容器

查看镜像、容器信息

[root@docker-0001 ~]# docker inspect myos:8.5				#查看镜像信息
[root@docker-0001 ~]# docker inspect myos:nginx				#查看镜像信息
[root@docker-0001 ~]# docker inspect 38b8ee2a8754			#查看容器信息

拷贝文件

  • docker cp 本机文件路径 容器id:容器内路径(上传)

  • docker cp 容器id:容器内路径 本机文件路径(下载)

在第一个终端中执行

[root@docker-0001 ~]# docker run -itd --name xy myos:nginx 		#后台运行一个容器名字叫xy
[root@docker-0001 ~]# docker exec -it xy pwd					#查看容器工作目录

将容器内的数据拷贝至宿主机

[root@docker-0001 ~]# docker cp xy:/usr/local/nginx/html /opt/
[root@docker-0001 ~]# ls /opt/									#验证

将宿主机的数据拷贝至容器内部(/usr/local/nginx/html)

[root@docker-0001 ~]# docker cp  /etc/shells xy:/usr/local/nginx/html
[root@docker-0001 ~]# docker exec -it xy ls						#验证

其他管理命令

管理命令说明
docker rm 容器ID删除容器
docker logs 容器ID查看容器日志
docker tag 镜像ID:标签 镜像名称:新的标签创建新的镜像名称和标签
docker rmi 镜像名称:标签删除镜像(必须先删除该镜像启动的所有容器)
[root@docker-0001 ~]# docker rm 9ddb4		#根据容器ID删除容器
[root@docker-0001 ~]# docker rm -f xy		#根据容器名删除容器(-f可强制删除运行中的容器)
[root@docker-0001 ~]# docker rm -f $(docker ps -aq)		#删除所有容器
[root@docker-0001 ~]# docker run -itd --name xy myos:nginx		#运行容器
[root@docker-0001 ~]# docker logs xy 							#查看日志(不一定有)
  • 删除镜像,但是镜像不能有运行的容器
[root@docker-0001 ~]# docker rmi busybox:latest					#删除镜像busybox:latest
[root@docker-0001 ~]# docker images								#查看是否删除
  • 对myos:8.5镜像制作标签linux:latest
[root@docker-0001 ~]# docker tag 621bfd7f9b46 linux:latest
[root@docker-0001 ~]# docker images

进入容器

  • docker exec -it 容器id 命令

  • docker attach 容器id

  • exec不会以上帝进程的身份进入容器,所以退出容器的时候容器不会停止

[root@docker-0001 ~]# docker run -it myos:8.5 			#使用myos:8.5进入容器
[root@fa35a4ae902f /]# exit								#退出以后容器处于停止状态
[root@docker-0001 ~]# docker ps -a
[root@docker-0001 ~]# docker start fa35					#启动容器
[root@docker-0001 ~]# docker exec -it fa35 /bin/bash
[root@fa35a4ae902f /]# exit								#再次退出容器还是处于运行状态
[root@docker-0001 ~]# docker ps							#查看验证
  • attach 以上帝进程的身份,进入容器内部,当执行exit退出容器时,会结束整个容器,通常用于在测试时,查看报错信息,可以按快捷键Ctrl p q退出容器,但不关闭容器;
[root@docker-0001 ~]# docker attach fa35
[root@fa35a4ae902f /]# exit								#退出已停止
exit
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND     
  • 在对容器的使用过程中,都是使用exec,新开一个进程的方式进入容器,进行操作;
  • 而attach 往往应用于调试,终端输出的情况;

自定义镜像

  • 镜像采用分层设计
  • 创建读写层
  • 修改配置
  • 重新打包
    在这里插入图片描述
  • 2024-AI大模型Java全链路工程师环境资料/第四模块/yum.tar.gz上传至虚拟机docker-0001和虚拟机docker-0002的/root

docker-0002使用rockylinux:8.5创建容器

[root@docker-0002 ~]# docker run -itd --name linux rockylinux:8.5
[root@docker-0002 ~]# docker cp yum.tar.gz linux:/root			#将yum客户端文件上传至容器
[root@docker-0002 ~]# docker exec -it linux /bin/bash			#进入容器

容器内部操作

[root@c92f2ba78f95 /]# rm -rf /etc/yum.repos.d/				#删除容器中原有yum客户端文件
[root@c92f2ba78f95 /]# tar -xf /root/yum.tar.gz -C /etc/	#释放新的客户端文件
[root@c92f2ba78f95 /]# ls /etc/yum.repos.d/					#验证
[root@c92f2ba78f95 /]# dnf clean all
[root@c92f2ba78f95 /]# dnf repolist -v
[root@c92f2ba78f95 /]# dnf install -y net-tools vim-enhanced tree bash-completion #装包
[root@c92f2ba78f95 /]# dnf install -y net-tools iproute procps-ng psmisc		  #装包
[root@c92f2ba78f95 /]# exit

docker-0002操作,打包新的镜像

[root@docker-0002 ~]# docker stop linux
[root@docker-0002 ~]# docker commit linux mylinux:latest
[root@docker-0002 ~]# docker images

测试验证 ,使用新镜像创建容器

[root@docker-0002 ~]# docker run -it mylinux:latest			#运行容器
[root@65b44ca03a4a /]# ifconfig eth0						#命令可以用
[root@65b44ca03a4a /]# pstree								#命令可以用

容器与应用

  • docker-0002机器使用mylinux:latest创建容器,并在容器中部署tomcat服务
  • 2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹上传至虚拟机docker-0001和虚拟机docker-0002的/root
[root@docker-0002 ~]# docker run -itd --name tomcat mylinux:latest 		#后台运行容器
[root@docker-0002 ~]# docker cp apache-tomcat-9.0.6.tar.gz tomcat:/root	#拷贝tomcat至容器
[root@docker-0002 ~]# docker exec -it tomcat /bin/bash					#进入容器
[root@6c4f3e02470b /]# dnf -y install java-1.8.0-openjdk				#安装jdk
[root@6c4f3e02470b /]# cd /root
[root@6c4f3e02470b ~]# tar -xf /root/apache-tomcat-9.0.6.tar.gz			#安装tomcat
[root@6c4f3e02470b ~]# mv apache-tomcat-9.0.6 /usr/local/tomcat
[root@6c4f3e02470b ~]# /usr/local/tomcat/bin/startup.sh					#启动服务
[root@6c4f3e02470b ~]# ss -nutlp | grep java

容器中编写测试脚本

[root@6c4f3e02470b ~]# vim /usr/local/tomcat/webapps/ROOT/time.jsp
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: <%=new java.util.Date()%> <!--通过基类调用系统时间-->
        </center>
    </body>
</html>
[root@6c4f3e02470b ~]# ifconfig eth0					#查看容器IP地址			
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
[root@6c4f3e02470b ~]# exit								#退出容器
[root@docker-0002 ~]# curl http://172.17.0.2/time.jsp
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: Thu May 09 18:55:26 UTC 2024 <!--通过基类调用系统时间-->
        </center>
    </body>
</html>
  • 19
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值