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

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

或者vim /etc/docker/daemon.json

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

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文档的使用

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

镜像下载

例如搜索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私有库搭建

拉去镜像

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 inspect 容器ID/容器名字

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

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

来修改

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

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

不想用可以删除掉

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

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

mysql -uroot -p123456

用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 数据还在 原因就是配置了容器卷映射

3.Redis

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

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 必须

vim /app/redis/redis.conf

把保护模式关了

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

Portainer(轻量级可视化工具)

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

相关推荐
plusplus16819 分钟前
Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市
云原生·容器·kubernetes
m0_515790412 小时前
【深度学习实战(55)】记录一次在新服务器上使用docker的流程
docker
Moonnnn.2 小时前
【51单片机学习】AT24C02(I2C)、DS18B20(单总线)、LCD1602(液晶显示屏)
笔记·单片机·学习·51单片机
qq_312920112 小时前
K8s存储类(StorageClass)设计与Ceph集成实战
ceph·容器·kubernetes
Nazi62 小时前
kubeadm部署k8s集群环境搭建
云原生·容器·kubernetes
Brilliantee4042 小时前
藏在 K8s 幕后的记忆中枢(etcd)
容器·kubernetes·etcd
草明2 小时前
docker stats 增加一列容器名称的显示
java·开发语言·docker
B612 little star king2 小时前
UNIKGQA论文笔记
论文阅读·人工智能·笔记·自然语言处理·知识图谱
焯集新人4 小时前
K8S高可用集群
云原生·容器·kubernetes
楚禾Noah4 小时前
【通用常识】YAML 中的高阶语法
运维·docker·容器