Docker笔记-docker attach dockercentos1    进不去

时间:2024-02-17 11:46:45

镜像下载

下载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