cp /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.bak
vi /etc/yum.repos.d/CentOS-Linux-BaseOS.repoCentOS-Base.repo
文件是 CentOS 操作系统中 yum 包管理器的源配置文件。Yum 是一个软件包管理工具,用于简化在基于 RPM 包的系统上安装、更新和删除软件包。CentOS-Base.repo
中包含了 CentOS 官方软件仓库的信息,指定了 Yum 在何处查找和下载软件包。
Docker 容器共用宿主机内核。Docker 利用 Linux 的容器技术实现,其中容器与宿主机共享同一个 Linux 内核。每个容器都运行在宿主机的用户空间,但有独立的文件系统、进程空间、网络空间等,使得它们相互隔离。
这种共享内核的设计使得 Docker 容器非常轻量且高效。容器之间的隔离是通过 Linux 内核提供的命名空间和控制组 (cgroups) 等技术来实现的。这些技术允许每个容器有自己的进程空间、网络空间、文件系统等,从而实现容器的隔离性。
Docker容器=app必须要用到的lib+app本身+后期我们自己安装的lib 当然你也可以往容器里继续塞app 但不建议
官网:Docker: Accelerated Container Application Development
官方文档:Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/
安装依赖
yum -y install gcc gcc-c++ yum-utils
Docker 官方的 YUM 软件仓库配置文件到系统,设置存储库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
也可以从阿里云下(我选择上面的)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker核心组件引擎 几一些插件
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Docker引擎
systemctl start docker
查看Docker版本
docker version
测试第一个Docker容器 hello-world
docker run hello-world
systemctl start docker 启动DOCKER
systemctl is-enabled docker 查看Docker是否自动启动
systemctl enable docker 设置Docker自动启动
systemctl start docker 启动docker
systemctl restart docker 重启docker
systemctl stop docker 停止docker
docker version
docker info
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
删除存储镜像、容器和其他相关数据
rm -rf /var/lib/docker
删除Docker引擎相关数据
rm -rf /var/lib/containerd
如果安装好了 不想用它的加速器 rm /etc/docker/daemon.json
或者vim /etc/docker/daemon.json
在/etx/docker下会生成这么个文件
docker images 列出本地主机上的所有镜像
docker images -a 列出本地主机上的所有镜像(含历史镜像)
docker search xxx 去docker hub上查某个镜像
docker search redis 默认25个
docker search --limit 5 redis 查前5个(点赞最多)redis镜像
docker rmi ID或者name 删除某个镜像
docker rmi -f ID或者name 强制删除某个镜像
docker rmi -f 镜像名:版本号 镜像名:版本号 删除多个 如果有版本号 默认:latest 即使在容器在运行也删除 强制删除
docker rmi -f $(docker images -qa) 强制删除全部镜像
docker rmi -f $(docker images -qa)和docker rmi -f $(docker images -aq) 都可以
docker ps 查看在运行的docker容器(实例)
docker ps -a 查看在运行和运行过的docker容器(实例)
以下是两种通过镜像启动容器的方式
注意 -it是交互 -d是后台
docker run -it centos /bin/bash 这样系统会自动取名
docker run -it --name=dockercentos1 centos /bin/bash 启动centos镜像的容器命名为dockercents1
docker run -d --name=dockercentos1 centos -d代表后台运行
可以去掉-it
,但这样会使容器在后台运行时不分配伪终端
docker run -it --name=dockercentos1 centos bash 这个和上面命令是一样的
docker run -it --name=dockercentos1 centos /bin/sh
需要用 docker exec -it dockercentos1 /bin/sh 进入
docker run -d --name=dockerredis1 -p 外部启动端口:内部连接端口 redis:6.0.8
docker run -d --name=dockerredis1 -p 6379:6379 redis:6.0.8 -d表示后台启动
docker run -it --name=dockerredis1 -p 6379:6379 redis:6.0.8 /bin/bash
在已经通过上面两种命令启动过的容器 可以使用下面名字
docker stop ID或者名字 停止启动过并运行中的容器(因只有运行过才有ID和Name)
docker rm ID或者名字 删除启动过已停止的容器(因只有运行过才有ID和Name)
docker rm -f ID或者名字 删除启动过在运行的容器(因只有运行过才有ID和Name)
docker start ID或者名字 启动启动过在运行的容器 (因只有运行过才有ID和Name)
容器启动后进入容器的命令 用该命令进入容器可以用ctrl+p+q退出 也可以直接exit退出
推荐:docker exec -it dockercentos1 /bin/bash
docker attach 容器ID或容器名 进入容器 可以用ctrl+p+q退出 用exit会关闭容器
注意:用docker run -d --name=dockerredis1 -p 6379:6379 redis:6.0.8启动的
docker attach dockercentos1 进不去
docker run -d --name centos1 centos
或者
docker run -d centos 一样 只不过一个指定名字 一个由Docker随机给名字
启动之后就会立即退出 原因在于容器使用后台运行,必须要有个前台进程,如果没有前台进程,Docker觉得没有用,就会立即停止 就是说没有提供任何服务 里面没有要对外提供服务的应用 就会自动停
docker exec -it nginx1 /bin/bash
和
docker exec -it nginx1 /bin/sh
但是 注意 我下载了Tomcat镜像 相同方式启动 是可以启动的 原因是它提供了服务启动了Tomcat
如果容器有应用启动
查看日志
docker logs tomcat1
其实上面这些命令官方文档都有
例如搜索mysql
支持的版本
下载centos镜像
docker pull centos 下载centos镜像
docker images 查看本地仓库所有镜像
docker ps -a 查看本地运行过的容器(包括运行中和已经停止的)
docker run -it --name=dockercentos1 centos /bin/bash 用centos镜像启动docker容器
vi a.txt 编辑a.txt文件 没有便创建
在宿主主机中执行 在宿主主机中执行 在宿主主机中执行
docker cp 容器ID或者容器名字:/容器内路径 目的主机路径
docker cp dockercentos1:/a.txt /usr/local/develop 注意容器要启动着 不然无法复制
从宿主机拷贝文件到容器
docker cp /path/to/local/a.txt dockercentos1:/tmp/a.txt
该容器是否在运行中没有关系
在宿主机执行
docker export 容器ID/容器名字 > 新的名字.tar
docker export 容器ID/容器名字 > /usr/local/develop/新的名字.tar
cat /data/abcd.tar | docker import - 新的镜像名字:版本号 版本号可以不写
cat /data/abcd.tar | docker import - xxxx 导入/data/abcd.tar 变成新的镜像 且命名为xxxx
下载的centos没有vim命令 安装上 然后提交到本地生成新的镜像,作为以后的base镜像
启动centos镜像的容器 并且命名为dockercentos1
docker run -it --name=dockercentos1 centos /bin/bash
没有vim命令
如果你用的是ubuntu
使用下面两个命令
apt-get update
apt-get install vim
我这里用的是centos
yum install vim
2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org 按下面步骤解决
1.cd /etc/yum.repos.d/
2.sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
3.sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
4.yum makecache(可以先设置下面三个 就不会有图中报错)
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
export LC_ALL=C.UTF-8
5.yum update -y
6.yum -y install vim
在宿主机中执行命令:
docker commit -m "add vim cmd" -a "hrui" 0a70439e6291 hruicentor
或者是
docker commit -m "add vim cmd" -a "hrui" dockercentos1 hruicentor:v1 后面可以加个版本号
0a70439e6291是容器运行ID 或者 也可以写成原容器运行的名字
查看镜像文件(发现体积大了很多,以后优化)
docker images
注意 docker images 是查看镜像文件 docker ps -a 是查看所有运行过的容器
docker rmi xxx是删除镜像文件 docker rm xxx是删除运行过的容器
现在hruicentos镜像就是centos镜像的迭代 而且这种迭代可以慢慢往上叠加
命令都有,照着抄
在宿主机上操作 根据自己的抄 有示例
照抄 写个版本号
发现上传后ESC服务器多了好几个ID相同的镜像 应该是上传后备份的 删除了
从服务器镜像仓库拉
拉去镜像
docker pull registry
创建registry镜像的容器
默认情况下,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便宿主机联调
端口映射到主机的5001端口,同时将/usr/local/registry/
目录挂载到容器内的/tmp/registry
路径下,并使用--privileged=true
参数,赋予容器特权。
docker run -d -p 5001:5000 -v /usr/local/registry/:/tmp/registry --privileged=true --name hruiregistry registry
不知道 现在要用sh命令进去
docker exec -it hruiregistry /bin/sh
先在另外一台服务器演示也需要Docker环境
注意下面操作在另外一台有Docker环境(已经安装运行Docker引擎)的服务器
docker引擎已经安装好
下载centos镜像
上面演示过vim安装 这里重复演示下docker容器中ifconfig安装 然后将新的镜像提交本地仓库(这里的本地仓库指代本地镜像仓库),再提交到私有仓库
docker run -it --name=hruicentos1 centos /bin/bash 这种运行方式会直接进入容器
vim安装见上面 cd /
在跟目录创建个 a.txt 编辑 保存
退出容器
在宿主机中执行 提交到本地镜像仓库
docker commit -m "add a.txt" -a "hrui" hruicentos1(原来的容器名或id) hruicentos2:可以加版本号
docker commit -m "add a.txt" -a "hrui" hruicentos1 hruicentos2
现在将这个镜像上传到自己搭建的私有库
检查远程私有镜像仓库运行情况
curl -XGET http://你的私有仓库公网IP或内网IP:5001/v2/_catalog
curl -XGET http://xxx,123,xx,123:5001/v2/_catalog 现在是空的正常(注意安全组开通5001端口,它会映射到服务器的5000端口),没有推送任何镜像 空的正常
设置密码什么一会再说
推送格式
docker tag 本地镜像名:版本 ip:端口/hongruixiugai:v1
版本可以不加
docker tag hruicentos2 ip:端口/hruicentos2
docker tag hruicentos2 123.123.23.2132:5001/hruicentos2 注意是自己的私服IP
docker push 123.123.123.123:5001/hruicentos2 注意是自己的私服IP
原因是不支持http请求
vim /etc/docker/daemon.json
docker tag hruicentos2 123.123.23.2132:5001/hruicentos2 注意是自己的私服IP
docker push 123.123.123.123:5001/hruicentos2 注意是自己的私服IP
重启docker引擎
systemctl restart docker
推送
docker tag hruicentos2 123.123.23.2132:5001/hruicentos2 注意是自己的私服IP
docker push 123.123.123.123:5001/hruicentos2 注意是自己的私服IP
curl -XGET http://xxx,123,xx,123:5001/v2/_catalog 查看 注意写上自己的私服IP
上传后本地也有该镜像
docker pull ip地址:端口号/镜像名:版本号
因上传后本地会留一份一摸一样的镜像
在执行docker pull
命令时,如果本地已经存在相同的镜像(同样的仓库、标签),那么它会检查本地镜像是否与要拉取的镜像一致。如果一致,它不会重新下载整个镜像,而是使用本地的镜像。
其他机子需要拉取
docker pull ip地址:端口号/镜像名:版本号 版本号没有可以不写
curl -XGET http://xxx,123,xx,123:5001/v2/_catalog 查看以下 注意写上自己的私服IP
有啥拉啥.......
docker容器是无法持久化保持数据的,也不应该这么讲,就是说docker容器如果被删除(区分容器和镜像),就是说原来里面的数据也没有了
docker -ps -a 可以检查到所有运行过的容器(包括在运行和以停止运行的容器)
Docker挂在宿主机目录 --privileged=true 权限问题
下面例子就是说 将容器中的/tmp/registry目录下的数据映射到宿主机目录
容器卷的目的就是这个 好处:即使容器被删除 数据也在
运行一个带有容器卷存储功能的镜像实例(容器)
就是说运行一个容器 容器名定义为centos2,镜像为centos,将容器内目录/tmp/registry2与宿主机目录registry2做映射 宿主机和容器内的registry2文件docker会自行创建
docker run -it --privileged=true -v /usr/local/registry2:/tmp/registry2 --name=centos2 centos
注意 -v 可以挂在多个 可以自己分类 分别存放什么 例如
docker run -it -v /host/path1:/container/path1 -v /host/path2:/container/path2 --name=mycontainer myimage
这里的同步是相互的,宿主机在该目录创建的也会同步到容器
举个特殊的例子 如果宿主机的某个目录与容器目录绑定着 容器停止运行 我往宿主机与容器绑定的目录里存放些东西 再次启动容器 容器绑定的目录下也会有这些文件 双向同步
docker inspect
是一个 Docker 命令,用于获取有关 Docker 对象(容器、镜像、网络等)详细信息的 JSON 格式输出。该命令可以提供关于容器、镜像、卷、网络等各种 Docker 对象的配置和状态信息。
容器数据卷的读写权限(限制的是容器 不是宿主机)
docker run -it --privileged=true -v /usr/local/registry2:/tmp/registry2 --name=centos2 centos
这个命令实际上是这样的
docker run -it --privileged=true -v /usr/local/registry2:/tmp/registry2:rw --name=centos2 centos
它默认在容器卷后面加了 :rw
如果容器卷指定:ro 只读(read only) 就是说容器对该目录没有写的权限 只能读
docker run -it --privileged=true -v /usr/local/registry2:/tmp/registry2:ro --name=centos2 centos
关于容器卷继承自己查下 都是两个容器使用一个宿主目录 其实就指定宿主机同一目录就好了
一般步骤分为:1.搜索镜像 2.拉取镜像 3.查看镜像 4.启动镜像 5.停止镜像 6.移出镜像
很多时候可以直接从第四不开始,因为找不到镜像文件的话,docker会默认从Docker Hub上下载镜像资源
可以通过
vim /etc/docker/daemon.json
来修改
比如配置阿里云镜像加速器
这样就默认会阿里云镜像里下载资源镜像
不想用可以删除掉
rm /etc/docker/daemon.json
1.搜索镜像 2.拉取镜像 3.查看镜像 这三步我就不做了 直接运行 因为找不到镜像会自动下载
docker run -it --name=tomcat1 tomcat /bin/bash 没有指定版本就是默认最新版本 好比
注意 -it是交互 -d是后台
docker run -p 8080:8080 --name=tomcat1 -d tomcat:latest -p指在后台运行
docker run -p 8080:8080 --name tomcat1 -d tomcat:latest =号可以去掉 一样的
docker exec -it tomcat1 /bin/bash
自动下载完镜像之后自动启动
http://IP:8080 访问发现访问不到
进入容器
docker exec -it tomcat1 /bin/bash
原因在于Tomcat10里webapps里面是空的,删除原来的webapps 把webapps.dist修改为webapps
如果你是7,8,9不需要改这个
rm -r webapps 删除问价夹
mv webapps.dist webapps 将webapps.dist 移动到当前目录 并改名为webapps
http://IP+8080
这里用mysql5.7演示,原因在于mysql5.7安装完成后需要修改字符集不然不能插入中文,如果你安装的是mysql8就不需要设置字符集
如果服务器本身就装了mysql 占用3306的话 那么就-p 3307:3306
docker run -d -p 3307:3306 --privileged=true -v /usr/mysql/log:/var/log/mysql -v /usr/mysql/data:/var/lib/mysql -v /usr/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
docker exec -it mysql5.7 /bin/bash
ip a 查看IP
apt-get update
apt-get install -y iproute2
用Navicat连接
第一种(需要开通安全组3307)
第二种 先用SSH 再在常规填写内网
一般选择第二种方式,毕竟安全组开端口不如内部访问来的方便,安全组端口能少开则少开
如果用第二种方式 那也完全没必须 -p 3306:3306这样
docker run -d --privileged=true -v /usr/mysql/log:/var/log/mysql -v /usr/mysql/data:/var/lib/mysql -v /usr/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
docker exec -it mysql5.7 /bin/bash
ip a
apt-get update
apt-get install -y iproute2
建库建表
mysql5.7插入中文存在问题 mysql8没有该问题
我这里居然好的
这应该是
我上面设置了这个原因?
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
export LC_ALL=C.UTF-8
事实上这个很明显是不对的
show variables like 'character%';
因做了容器卷映射 所以我在服务器映射里添加文件就会自动在容器里添加
vim /usr/mysql/conf/my.cnf
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
重启容器 宿主机执行重启mysql容器
docker restart mysql5.7
docker exec -it mysql5.7 /bin/bash
mysql -uroot -p123456
show variables like 'character%';
我现在删除了mysql容器
重新启动服务
docker run -d --privileged=true -v /usr/mysql/log:/var/log/mysql -v /usr/mysql/data:/var/lib/mysql -v /usr/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7 数据还在 原因就是配置了容器卷映射
其实内部使用觉得不需要对外映射
docker run -d -p 6379:6379 --name redis1 redis:6.0.8
docker exec -it redis1 /bin/bash
以上只是普通玩的,生产上不能这么玩
新建一个目录
mkdir /app
mkdir /app/redis
将一个全新的redis.conf拖到该文件夹下 方便以后修改
修改配置文件几个地方
1.开启或不开启密码随自己 requirepass 选择
2.将bind 127.0.0.1注释掉 允许外连接 必须
3.将daemonize设置为no 必须
把保护模式关了
docker run -p 6379:6379 --name redis1 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf 最后的redis-server /etc/redis/redis.conf指定配置文件启动前面-v /app/redis/redis.conf:/etc/redis/redis.conf已经同步了
进入容器
docker exec -it redis1 /bin/bash
redis-cli
因为设置了密码
redis-cli -a 123456 完整输入方式redis-cli -h 127.0.0.1 -p 6379 -a your_password
docker inspect 容器ID/容器名字 查看相关
docker images 查看所有镜像
docker ps -a 查看所有运行过的容器实例
docker rm 容器ID/容器名字 删除容器
docker rm -f 容器ID/容器名字 强制删除运行中的容器
docker rmi 镜像 删除镜像 默认后面带着:latest
docker rmi 镜像:具体版本 删除镜像
docker run -d --privileged=true -v /usr/mysql/log:/var/log/mysql -v /usr/mysql/data:/var/lib/mysql -v /usr/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
docker exec -it mysql5.7 /bin/bash
启动容器 进去容器 建议
前台 docker run -it --name nginx1 nginx /bin/bash 一样 docker run -it --name nginx1 nginx /bin/sh
进入 docker exec -it nginx1 /bin/bash
后台启动 docker run -d --name nginx1 nginx 或 docker run -d --name nginx1 nginx /bin/bash
docker exec -it nginx1 /bin/bash
1.监控 2.统计
portainer是一款轻量级的应用,提供图形化界面管理Docker环境,包括单机环境和集群环境(集群建议K8S)
官网:https://www.porainer.io
Install Portainer CE with Docker on Linux - Portainer Documentationhttps://docs.portainer.io/start/install-ce/server/docker/linux
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
docker ps
https://IP+9443