Docker笔记

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.repo
CentOS-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引擎

官网: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.icon-default.png?t=N7T8https://docs.docker.com/engine/install/centos/

Docker笔记_第1张图片

安装依赖

yum -y install gcc gcc-c++ yum-utils

Docker笔记_第2张图片

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笔记_第3张图片

查看Docker版本

docker version

测试第一个Docker容器  hello-world

docker run hello-world

Docker引擎命令

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

卸载Docker引擎

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

Docker笔记_第4张图片

Docker笔记_第5张图片

Docker笔记_第6张图片

或者vim /etc/docker/daemon.json

在/etx/docker下会生成这么个文件

Docker笔记_第7张图片

Docker笔记_第8张图片

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容器命令

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笔记_第9张图片

docker exec -it nginx1 /bin/bash

docker exec -it nginx1 /bin/sh    

Docker笔记_第10张图片

但是 注意  我下载了Tomcat镜像  相同方式启动  是可以启动的   原因是它提供了服务启动了Tomcat

如果容器有应用启动

查看日志

docker logs tomcat1

Docker笔记_第11张图片

Docker文档的使用

其实上面这些命令官方文档都有

Docker笔记_第12张图片

Docker笔记_第13张图片

镜像下载

Docker笔记_第14张图片

Docker笔记_第15张图片

Docker笔记_第16张图片

例如搜索mysql

Docker笔记_第17张图片

支持的版本

Docker笔记_第18张图片

下载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笔记_第19张图片

在宿主主机中执行  在宿主主机中执行  在宿主主机中执行

docker cp 容器ID或者容器名字:/容器内路径 目的主机路径

docker cp dockercentos1:/a.txt /usr/local/develop  注意容器要启动着 不然无法复制

Docker笔记_第20张图片

从宿主机拷贝文件到容器

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

Docker笔记_第21张图片

COMMIT镜像提交到本地

下载的centos没有vim命令  安装上  然后提交到本地生成新的镜像,作为以后的base镜像

Docker笔记_第22张图片

启动centos镜像的容器 并且命名为dockercentos1

docker run -it --name=dockercentos1 centos /bin/bash

Docker笔记_第23张图片

没有vim命令

如果你用的是ubuntu

使用下面两个命令

apt-get update

apt-get install vim

我这里用的是centos

yum install vim

Docker笔记_第24张图片

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(可以先设置下面三个  就不会有图中报错)

Docker笔记_第25张图片

export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
export LC_ALL=C.UTF-8
 

5.yum update -y

Docker笔记_第26张图片

6.yum -y install vim

Docker笔记_第27张图片

Docker笔记_第28张图片

在宿主机中执行命令:

docker commit -m "add vim cmd" -a "hrui" 0a70439e6291 hruicentor

或者是

docker commit -m "add vim cmd" -a "hrui" dockercentos1 hruicentor:v1  后面可以加个版本号

0a70439e6291是容器运行ID 或者 也可以写成原容器运行的名字

Docker笔记_第29张图片

查看镜像文件(发现体积大了很多,以后优化)

docker images

Docker笔记_第30张图片

注意  docker images  是查看镜像文件    docker ps -a 是查看所有运行过的容器

   docker rmi xxx是删除镜像文件   docker rm xxx是删除运行过的容器

现在hruicentos镜像就是centos镜像的迭代  而且这种迭代可以慢慢往上叠加

Docker笔记_第31张图片

本地镜像发布到阿里云

命令都有,照着抄

Docker笔记_第32张图片

在宿主机上操作 根据自己的抄 有示例

Docker笔记_第33张图片

Docker笔记_第34张图片

Docker笔记_第35张图片

从阿里云拉取镜像

照抄 写个版本号

发现上传后ESC服务器多了好几个ID相同的镜像 应该是上传后备份的  删除了

从服务器镜像仓库拉

Docker笔记_第36张图片

Docker私有库搭建

拉去镜像

docker pull registry

Docker笔记_第37张图片

Docker笔记_第38张图片

创建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
 

Docker笔记_第39张图片

不知道 现在要用sh命令进去

docker exec -it hruiregistry /bin/sh

上传镜像到自己的私有库

先在另外一台服务器演示也需要Docker环境

注意下面操作在另外一台有Docker环境(已经安装运行Docker引擎)的服务器

docker引擎已经安装好

下载centos镜像

Docker笔记_第40张图片

上面演示过vim安装 这里重复演示下docker容器中ifconfig安装 然后将新的镜像提交本地仓库(这里的本地仓库指代本地镜像仓库),再提交到私有仓库

docker run -it --name=hruicentos1 centos /bin/bash  这种运行方式会直接进入容器

Docker笔记_第41张图片

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笔记_第42张图片

设置密码什么一会再说

Docker笔记_第43张图片

推送格式

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

Docker笔记_第44张图片

原因是不支持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笔记_第45张图片

重启docker引擎

systemctl restart docker

推送

docker tag hruicentos2 123.123.23.2132:5001/hruicentos2    注意是自己的私服IP

docker push 123.123.123.123:5001/hruicentos2    注意是自己的私服IP

Docker笔记_第46张图片

curl -XGET http://xxx,123,xx,123:5001/v2/_catalog  查看 注意写上自己的私服IP

Docker笔记_第47张图片

上传后本地也有该镜像

Docker笔记_第48张图片

从私服下载镜像

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笔记_第49张图片

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笔记_第50张图片

这里的同步是相互的,宿主机在该目录创建的也会同步到容器

举个特殊的例子  如果宿主机的某个目录与容器目录绑定着  容器停止运行  我往宿主机与容器绑定的目录里存放些东西     再次启动容器   容器绑定的目录下也会有这些文件  双向同步

docker inspect 是一个 Docker 命令,用于获取有关 Docker 对象(容器、镜像、网络等)详细信息的 JSON 格式输出。该命令可以提供关于容器、镜像、卷、网络等各种 Docker 对象的配置和状态信息。

docker inspect 容器ID/容器名字
Docker笔记_第51张图片

Docker笔记_第52张图片

容器数据卷的读写权限(限制的是容器 不是宿主机)

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.Tomcat

一般步骤分为:1.搜索镜像  2.拉取镜像 3.查看镜像 4.启动镜像  5.停止镜像  6.移出镜像

很多时候可以直接从第四不开始,因为找不到镜像文件的话,docker会默认从Docker Hub上下载镜像资源 

可以通过

vim /etc/docker/daemon.json

来修改

比如配置阿里云镜像加速器

Docker笔记_第53张图片

这样就默认会阿里云镜像里下载资源镜像

不想用可以删除掉

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

Docker笔记_第54张图片

2.Mysql

这里用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

ip a  查看IP
Docker笔记_第55张图片

mysql -uroot -p123456
Docker笔记_第56张图片

用Navicat连接

第一种(需要开通安全组3307)

Docker笔记_第57张图片

第二种 先用SSH  再在常规填写内网

Docker笔记_第58张图片

Docker笔记_第59张图片

一般选择第二种方式,毕竟安全组开端口不如内部访问来的方便,安全组端口能少开则少开

如果用第二种方式  那也完全没必须 -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没有该问题

我这里居然好的

Docker笔记_第60张图片

这应该是

我上面设置了这个原因?

export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
export LC_ALL=C.UTF-8

事实上这个很明显是不对的

show variables like 'character%';
 

Docker笔记_第61张图片

因做了容器卷映射  所以我在服务器映射里添加文件就会自动在容器里添加

Docker笔记_第62张图片

vim /usr/mysql/conf/my.cnf

Docker笔记_第63张图片

[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%';

Docker笔记_第64张图片

我现在删除了mysql容器

Docker笔记_第65张图片

重新启动服务

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笔记_第66张图片

3.Redis

其实内部使用觉得不需要对外映射

docker run -d -p 6379:6379 --name redis1 redis:6.0.8

Docker笔记_第67张图片

docker exec -it redis1 /bin/bash

以上只是普通玩的,生产上不能这么玩

新建一个目录

mkdir /app

mkdir /app/redis

将一个全新的redis.conf拖到该文件夹下  方便以后修改

Docker笔记_第68张图片

修改配置文件几个地方

1.开启或不开启密码随自己  requirepass  选择

2.将bind 127.0.0.1注释掉   允许外连接    必须

3.将daemonize设置为no                          必须

vim /app/redis/redis.conf
Docker笔记_第69张图片

Docker笔记_第70张图片

Docker笔记_第71张图片

Docker笔记_第72张图片

把保护模式关了

Docker笔记_第73张图片

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

Portainer(轻量级可视化工具)

1.监控   2.统计

portainer是一款轻量级的应用,提供图形化界面管理Docker环境,包括单机环境和集群环境(集群建议K8S)

官网:https://www.porainer.io

Install Portainer CE with Docker on Linux - Portainer Documentationicon-default.png?t=N7T8https://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

你可能感兴趣的:(docker,笔记,容器)