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

相关推荐
李小星同志6 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c18 分钟前
MFC 使用细节
笔记·学习·mfc
NiNg_1_23420 分钟前
使用Docker Compose一键部署
运维·docker·容器
萠哥啥都行25 分钟前
Linux安装Docker以及Docker入门操作
运维·docker·容器
王哲晓26 分钟前
Linux通过yum安装Docker
java·linux·docker
Jhxbdks30 分钟前
C语言中的一些小知识(二)
c语言·开发语言·笔记
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
汀、人工智能1 小时前
修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
docker·容器
微刻时光1 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
吃面不喝汤662 小时前
如何配置和使用自己的私有 Docker Registry
运维·docker·容器