概述
- 地址
- 三件套
- 镜像(类)
- 容器(对象)
- 仓库(存放对象的地方)
- 自述
- Docker镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker容器,一个镜像可以创建很多容器。
- docker引擎,用来跑一个个的容器,容器由镜像生成,每个容器里面包含了最少量的Linux数据以及权限以保证运行。
- docker使用宿主机的内核,而不需要加载操作系统的OS内核,所以更快
安装篇
安装官网地址准备
卸载旧版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \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
阿里云镜像加速器
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/

docker虚悬镜像是什么?
其他的
容器命令
用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
本地镜像发布到阿里云
构建镜像
- docker commit… 创建一个带有vim的镜像ubuntu
-
发布到阿里云
登录阿里云获取脚本
- aliyun.com
- 控制台
- 产品与服务
- 容器镜像服务(可从快捷入库添加)
- 实例列表(创建个人实例)
- 进入个人实例
- 创建命名空间 atchengdu
- 创建命名空间下的镜像仓库(选择本地仓库)
- 创建仓库成功之后获得脚本
根据脚本推送镜像到阿里云
- 再次之前已经将容器commit成一个本地镜像了
docker login --username=19980429089 registry.cn-hangzhou.aliyuncs.com密码提示: 1qdocker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]docker push registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]从阿里云拉去镜像
docker login --username=199****9089 registry.cn-hangzhou.aliyuncs.comdocker pull registry.cn-hangzhou.aliyuncs.com/atchengdu/myubuntu:[镜像版本号]本地镜像发布到私有库
搭建私有库
```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
数据卷
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中我们使用卷。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效,爽
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷案例测试
```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 -lwebapps里面是空的
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
存在的问题
- 远程工具navicate可以直接连上MySQL,但是5.7的字符编码有问题,需要设置一下
-
生产环境安装
数据卷
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字符编码 ```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 成功
