概述

  1. 地址

官网
仓库

  1. 三件套
    1. 镜像(类)
    2. 容器(对象)
    3. 仓库(存放对象的地方)
  2. 自述
    1. Docker镜像(Image)就是一个只读的模板镜像可以用来创建 Docker容器一个镜像可以创建很多容器
    2. docker引擎,用来跑一个个的容器,容器由镜像生成,每个容器里面包含了最少量的Linux数据以及权限以保证运行。
    3. docker使用宿主机的内核,而不需要加载操作系统的OS内核,所以更快

      安装篇

      安装官网地址

      准备

      卸载旧版本

      1. sudo yum remove docker \
      2. docker-client \
      3. docker-client-latest \
      4. docker-common \
      5. docker-latest \
      6. docker-latest-logrotate \
      7. docker-logrotate \
      8. docker-engine

      yum安装gcc相关

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

      安装需要的软件包

      yum -y install yum-utils
      

      设置yum仓库地址

      如果本身网络就快就不用了,如果比较慢可以尝试添加 ```shell yum-config-manager —add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

//查看可用的yum仓库 yum repolist enabled/disabled/all

如果搞错了可以[参考这个处理](https://www.cnblogs.com/coolruo/articles/13891885.html)。或者直接删除资源库:在`/etc/yum.repos.d/`下手动删除对应repo文件即可
<a name="uHTDW"></a>
### yum生成缓存
```shell
yum makecache all

安装docker引擎

也可以安装特定版本,这里默认安装最新版的

yum install docker-ce docker-ce-cli containerd.io

使用

启动docker

systemctl start docker

ps -fe | grep docker

docker version

#docker开机自启
systemctl enable docker.service

运行镜像

docker run hello-world
//运行之后自动结束,相当于java -jar 没有加上 nohup

#docker重启之后自动运行
docker update --restart=always nacos
docker run --name nacos-standalone  --restart=always -e MODE=standalone -p 8848:8848 -d nacos/nacos-server

image.png

阿里云镜像加速器

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://2g80csq7.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

卸载

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

命令篇

帮助启动类命令

启动docker:                systemctl start docker
停止docker:                systemctl stop docker
停止之后如果使用docker命令视图访问docker,则会自启动,此时使用一下命令可以保证不会自启动:  systemctl stop docker.socket
重启docker:                systemctl restart docker
查看docker状态:     systemctl status docker
开机启动:                 systemctl enable docker
查看docker概要信息:            docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档:    docker 具体命令--help

镜像命令

docker images
docker images -a(包含历史镜像)
docker search xxx
docker search xxx --limit 5
docker pull xxx(默认最新版本,同docker pull xxx:latest)
docker pull xxx:tag(指定tag,相当于指定版本号)
docker system df(查看镜像/容器/数据卷所占的空间)

删除单个 docker rmi -f 镜像ID
删除多个 docker rmi -f 镜像名1:TAG 镜像名2:2:
删除全部 docker rmi -f $(docker images -qa)

版本号码查找:https://hub.docker.com/
image.png


image.png


QQ截图20220224210335.png

docker虚悬镜像是什么?

仓库名、标签都是none的镜像,没有用的,建议删除!

其他的

docker commit
docker push

容器命令

用ubuntu演示交互式容器(-it)

docker pull ubuntu
docker run -it ubuntu /bin/bash (运行ubuntu不需要端口)

docker ps 列出所有在运行的容器

docker run -it --name=myu1 ubuntu bash

docker ps
docker ps -a 列出所有的容器,包含历史
docker ps -l 列出最近创建的容器
docker ps -n 列出最近创建的n个容器
docker ps -q 只显示容器编号
docker run --help

退出容器:
1. exit:容器会停止
1. ctrl+p+q:容器不会停止

启动已经停止的容器:
docker ps -n 5
docker start 容器id/容器名字

重启容器:
docker restart 容器id/容器名字
停止容器:
docker stop 容器id/容器名字
强制停止容器
docker stop 容器id/容器名字

删除已经停止的容器:
docker rm 容器id/容器名字   (1.正在运行的容器不让删除  2.docker rmi是删除镜像,docker rm是删除容器)
docker rm -f 强制删除,不管是否运行

删除多个容器(慎用):
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

用redis演示守护式容器(-d)

docker run -d ubuntu
docker ps 容器启动之后发现没有交互动作自动关闭!这种必须用-it运行

docker pull redis:6.0.8
docker run -it redis:6.0.8 /bin/bash    如果ctrl+c则直接关闭了进程,这种必须要用-d运行
docker run -d redis:6.0.8

docker logs 容器id (查看日志)
docker top 容器id(查看容器内的进程情况)

docker ps
docker inspect 容器id(查看容器内部细节)

docker exec -it 容器id bash(进入到正在运行的容器,exit之后容器不会停止,建议使用)
docker attach 容器id(进入到正在运行的容器,exit之后容器会停止)

docker cp 5e85e9aac9ea:/home/hello.txt /tmp  (从容器拷贝文件到宿主机)
docker cp /hello.txt 5e85e9aac9ea:/home/hello.txt123  (从宿主机拷贝文件到容器)

docker export 5e85e9aac9ea > redis_back.tar (容器备份成一个镜像压缩文件)

#将备份的镜像压缩文件导入,重新运行该镜像的一个容器
docker rm -f 5e85e9aac9ea
cat redis_back.tar | docker import - atguigu/redis:0.0.1
docker images
docker run -it 097709ac16cf bash (exit之后容器停止,ctrl+p+q退出容器仍然运行)

docker镜像分层

UnionFS联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual
filesystem)。 Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用
比如说有多个镜像都从相同的 base镜像构建而来,那么Docker Host只需在磁盘上保存一份 base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层

加强版镜像

1.运行一个ubuntu容器,此时vi无法使用
docker run -it ubuntu /bin/bash

2.安装vi,之后可以使用vi命令
apt-get update
apt-get -y install vim

3.ctrl+p+q 退出容器,此时容器依然在运行

4.使用容器生成新的带有vim的镜像
docker commit -m="vim add ok" -a="qinmeng" 49ea1994ee8e atguigu/myubuntu:2.0

5.查看镜像列表,发现多了一个atguigu/myubuntu:2.0
docker images

6.使用新的镜像运行一个容器,此容器可以使用vi
docker run -it --name='myubuntu' 0d44bca1580b /bin/bash

7.ctrl+p+q 退出容器,此时容器依然在运行

8.查看容器列表,发现多了一个name为myubuntu的容器
docker ps

本地镜像发布到阿里云

image.png

构建镜像

  1. docker commit… 创建一个带有vim的镜像ubuntu
  2. dockerfile

    发布到阿里云

  3. 登录阿里云获取脚本

    1. aliyun.com
    2. 控制台
    3. 产品与服务
    4. 容器镜像服务(可从快捷入库添加)
    5. 实例列表(创建个人实例)
    6. 进入个人实例
    7. 创建命名空间 atchengdu
    8. 创建命名空间下的镜像仓库(选择本地仓库)
    9. 创建仓库成功之后获得脚本
  4. 根据脚本推送镜像到阿里云

    1. 再次之前已经将容器commit成一个本地镜像了
    2. docker login --username=19980429089 registry.cn-hangzhou.aliyuncs.com 密码提示: 1q
    3. docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]
    4. docker push registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]

      从阿里云拉去镜像

  5. docker login --username=199****9089 registry.cn-hangzhou.aliyuncs.com

  6. docker pull registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]

    本地镜像发布到私有库

    image.png

    搭建私有库

    ```shell docker pull registry

//默认情况,仓库被创建在容器的/var/liblregistry目录下,建议自行用容器卷映射,方便于宿主机联调 docker run -d -p 5000:5000 -v /zzyyuse/myregistryl:/tmp/registry —privileged=true registry

-P使用随机端口,-p使用指定端口

<a name="mHaXP"></a>
## 创建一个带有ifconfig的ubuntu镜像
```shell
docker run -it --name='ubuntu_with_ifconfig' ubuntu /bin/bash

apt-get update
apt-get install net-tools
ifconfig
ctrl+p+q

docker commit -m='ubuntu with ifconfig' -a 'qinmeng' ed52d724b051 myubuntu:2.0.ifconfig
docker images

发布到私有库

#查看仓库里面有哪些镜像
curl -XGET http://172.16.10.199:5000/v2/_catalog

docker tag myubuntu:2.0.ifconfig 172.16.10.199:5000/myubuntu:2.0.ifconfig
docker iamges 发现多了一个符合私服格式的镜像,接下来就要推送它到私服

因为docker默认不支持http请求,所以
vi etc/docker/daemon.json 新增逗号和一行:
,"insecure-registries": ["172.16.10.199:5000"]

重启docker
systemctl restart docker
docker run -d -p 5000:5000 -v /zzyyuse/myregistryl:/tmp/registry --privileged=true registry
curl -XGET http://172.16.10.199:5000/v2/_catalog

发布
docker push 172.16.10.199:5000/myubuntu:2.0.ifconfig
curl -XGET http://172.16.10.199:5000/v2/_catalog

拉取
docker pull 172.16.10.199:5000/myubuntu:2.0.ifconfig

image.png

数据卷

Docker挂载主机目录访问如果出现cannot open directory : Permission denied
解决办法:在挂载目录后多加一个—privileged-true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用—privleged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

添加自定义的容器卷

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
-v:表示天机自定义的容器卷;/zzyyuse/myregistry/是宿主机的目录,/tmp/registry是dockers容器的目录。默认情况,仓库被创建在容器的/var/liblregistry目录下,建议自行用容器卷映射,方便于宿主机联调

#启动带有容器卷的容器,-v可以挂载多个目录映射
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

将运用与运行的环境打包镜像,run后形成容器实例运行﹐但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能保存数据在docker中我们使用卷。

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接实时生效,爽
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

    数据卷案例测试

    ```shell docker run -it —name=’my_ubuntu’ —privileged=true -v /home/docker_tmp/:/home/docker_data ubuntu

容器内新建、修改文件再宿主机可以看到同步的数据;宿主机内的新建、修改在docker里面可以看到同步的数据。

/home/docker_tmp/ 宿主机目录查看 /home/docker_data ubuntu 容器目录查看

停止容器再启动不影响数据的同步

查看容器的数据卷映射信息,Mounts一栏

docker inspect [容器id]

```shell
docker run -it --name='my_ubuntu' --privileged=true -v /home/docker_tmp/:/home/docker_data:rw ubuntu
#容器卷目录后面:rw表示容器内可读可写,不加默认也是可读可写
#容器卷目录后面:ro表示容器内只读(read only),我们一般使用默认

容器卷的共享

docker run -it --name='my_ubuntu1' --privileged=true -v /home/docker_tmp/:/home/docker_data ubuntu

docker run -it --name='my_ubuntu2' --privileged=true --volumes-from my_ubuntu1 ubuntu

此时发现宿主机/home/docker_tmp、容器my_ubuntu1的/home/docker_data、容器my_ubuntu2的/home/docker_data可以实现数据共享,容器停止再次启动也不会影响

docker常规安装

常规步骤

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止容器
  • 移除容器

    安装tomcat

    ```shell 到hub.docker.com查找,docker search tomcat不太好找 docker pull tomcat docker images docker run -d —name=’tomcat_latest’ -p 8080:8080 tomcat

    此时访问不到猫

    docker exec -it 5595a959e3ab bash ls -l

    webapps里面是空的

    rm -rf webapps cp -r webapps.dist/ webapps

    此时可以访问到猫 http://172.16.10.199:8080/ 注意端口要开或者要关闭防火墙

cd logs cat catalina.2022-02-24.log 发现tomcat是10版本的!!!

exit; docker ps docker rm -f 5595a959e3ab docker images docker rmi -f tomcat

```shell
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
#可以访问猫

安装MySQL

简单安装

docker pull mysql:5.7    在hub.docker.com搜索镜像名称、tag可以找到
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7
#注意要ps -fe | grep mysql查看宿主机上是否装了Mysql,端口是否为3306,如果是则使用其他端口做映射
docker exec -it 4959ad7a85aa bash
mysql -uroot -p

image.png

存在的问题

  1. 远程工具navicate可以直接连上MySQL,但是5.7的字符编码有问题,需要设置一下
  2. 数据库备份问题

    生产环境安装

  3. 数据卷

    docker run -d -p 3306:3306 --privileged=true -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
    
  4. 字符编码 ```shell /home/mysql/conf/my.cnf

[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8

重启MySQL docker restart mysql

此时客户端连接之后插入中文数据不会乱码

SHOW VARIABLES LIKE ‘ character% ;


3. 实例删除之后数据仍在
```shell
#容器中建一些数据
#手残删除了MySQL的容器
docker rm -f 4e2a15837876

#重新启动一个MySQL容器
docker run -d -p 3306:3306 --privileged=true -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

mysql -uroot -p
#发现目录映射一致的情况下,mysql的数据不会丢失

安装redis

docker pull redis:6.0.8

mkdir -p /app/redis
cd /app/redis
vi redis.cnf   通过其他地方上传一个文件,并作修改

docker run -p 6379:6379 --name my_redis --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 表示启动使用指定配置文件
docker ps
>>可选
#requirepass foobared

>>允许redis的外地连接,必须注释掉
#bind 127.0.0.1
>>保护模式关闭,外地可以连接
protected-mode no

>>daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器
一直启动失败
daemonize no

>>可选:开启redis数据持久化
appendonly yes
docker exec -it d40ac0e8eb36 bash
redis-cli
select 15   成功
select 16   报错

修改/app/redis/redis.conf,将database改为10,重启redis
vi /app/redis/redis.conf
database 10
docker restart my_redis
docker exec -it d40ac0e8eb36 bash
redis-cli
select 15   报错
select 9    成功

安装nginx