Docker简介
一个项目,开发和上线两套环境,应用环境配置费时费力,而且容易出问题。为了解决这问题,所谓开发即运维,就是开发人员使用 Docker 来解决 “它在我的机器可以正常运行” 的问题,它会将运行程序的相关配置打包(打包成 一个镜像),然后直接搬移到新的机器上运行。从而保证系统稳定性,提高部署效率。
Docker的基本组成:
- 镜像(image) :Docker镜像就好比是个模板,可以通过这个模板来创建容器服务
- 容器(container) :独立运行一个或者一个组应用通过镜像来创建的
- 仓库(repository) :仓库就是存放镜像的地方
Docker官网镜像搜索 : https://hub.docker.com
Docker官网:http://www.docker.com
Docker安装
Docker官方建议在Ubuntu中安装,因为 Docker 是基于Ubuntu发布的,由于很多公司的环境都使用的是 CentOS ,如果安装到 CentOS 上,需要注意Docker 要求 CentOS 系统的内核版本高于 3.10 ,需要安装 64位 CentOS7.x 以上的版本。
查看系统内核
# 系统内核版本,需要3.10以上
uname -r
卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装前提
# 查看CentOS的版本,确定在CentOS7版本以上
cat /etc/redhat-release
# 更新yum软件包索引(方便我们后续下载快些)这个通常会使用yum makecache 生成缓存,用来提升搜索安装软件的速度
yum makecache fast
# 安装gcc -- 可以没有
yum -y install gcc
yum -y install gcc- c++
安装相关插件
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置Docker的镜像仓库-使用阿里源
# 使用阿里源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学源
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 国外镜像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
进行安装
sudo yum install docker-ce docker-ce-cli containerd.io
# 查看源中可使用版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本的docker
yum install docker-ce-20.10...el7 (这个是上面的版本号)
安装最新版本的 Docker CE
yum install docker-ce # (快速安装)
#安装中出现下面提示, 输入 y 然后回车
或者
#安装docker相关的 docker-ce 社区版 而ee是企业版 (官网推荐的安装)
yum install docker-ce docker-ce-cli containerd.io
Docker基本命令
启动与停止Docker服务
# 查看docker版本:
# 有客户端的版本和服务端的版本(Version)有版本号就代表安装成功
docker version
# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker
# 查看服务是否自动启动(enabled是 disabled否)
systemctl list-unit-files|grep docker.service
# 开机自动启动docker:
systemctl enable docker
# 开机不自动启动docker:
systemctl disable docker
# 重写加载配置(一般设置了systemctl需要重新加载配置)
systemctl daemon-reload
# 查看docker的进程:
ps - ef|grep docker
# 查看docker概要信息:
docker info
# Docker帮助命令:
docker --help
卸载Docker服务
# 卸载前需要停止docke
systemctl stop docker
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
或
yum remove -y docker-ce # (快速安装的卸载)
# 删除资源
rm -rf /var/lib/docker # /var/lib/docker 是docker的默认工作路径!
rm -rf /var/lib/containerd
配置国内镜像加速器
1、登录阿里云找到容器服务,搜索镜像服务,找到镜像加速器

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,如果不存在则手动创建,文件加入上面的地址内容。然后重启docker服务,
#配置镜像加速器,通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.aliyuncs.com"]
}
EOF
#重载此配置文件
sudo systemctl daemon-reload
#重启 docker
sudo systemctl restart docker
镜像命令
Docker官网镜像搜索 : https://hub.docker.com
#查看所有本地主机上的镜像
docker images
#搜索镜像
docker search
#搜索出来的镜像就是STARS大于3000的mysql镜像
docker search mysql --filter=STARS=3000
#拉取镜像 (如果不写标签名,默认就是latest)
docker pull 镜像名:标签名
#删除镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id
#删除全部镜像
docker rmi `docker images -q`
#查看镜像/容器/数据卷所占的空间
docker system df
#会展示,type类型(分为镜像/容器/本地卷/缓存)、总数、活跃的数量、大小(MB)、对应的可伸缩性
Docker虚悬镜像是什么?
仓库名和标签都是<none>
的镜像,就是虚悬镜像,我们需要删除掉。
# 查看虚悬镜像
docker image ls -f dangling=true
# 删除它们
docker image prune
# 输入y ,就可以全部删除掉
容器命令
查看容器
#查看全部容器
docker ps -a
#查看正在运行容器:
docker ps
#查看最近创建的容器:
docker ps -l
#查看停止的容器
docker ps -f status=exited
启动/停止/删除容器
#启动容器
docker start 容器id
#重启容器
docker restart 容器id
#停止当前正在运行的容器
docker stop 容器id
#强制停止当前容器
docker kill 容器id
#删除指定容器
docker rm 容器id
#删除多个容器(谨慎使用)
docker rm -f ${docker ps -a -q}
退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出
新建容器并启动
# 语法:docker run [OPTIONS] 镜像名:标签名
# 创建容器后,马上会启动容器,并进入容器
例子:docker run -it --name=容器名 镜像名:标签名 /bin/bash
# 创建容器后,后台进行运行,并返回容器id,-d:就代表后台运行 -p 端口映射
例子:docker run -it --name=容器名 -d -p 8080:80 镜像名:标签名
容器数据卷
数据卷就是目录或者文件,目的就是数据持久化,不会因为删除容器,而删除掉挂载的数据卷。
# Docker一般挂载主机如果出现cannot open directory... 需要配置 --privileged=true
# 数据目录挂载
docker run -it -v /宿主机绝对路径目录:/容器内目录 --privileged=true --name=容器名 镜像名
# 目录挂载只读(Read-only)权限(容器里只能看不能修改)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro --name=容器名 镜像名
# 查看数据卷是否挂载成功,在Mounts可以看到映射文件
docker inspect 容器id
# 在“Mounts”:[{"Type:""bing","Source":"/tmp/xxx","Destination":"/tmp/xxx",...}]
# 容器之间的继承 , 首先创建出一个容器(父类容器名)
docker run -it --volumes-from 父类容器名 --privileged=true --name=容器名 镜像名
创建守护式容器
# 创建一个守护式容器(后台运行的容器)
docker run -d --name=容器名 镜像名:标签名
登录容器
# 登录已经启动的容器方式,一般退出已启动的容器再进入该容器中
docker exec -it 容器名称|容器id /bin/bash
# 注意,此时使用exit退出容器,不在导致容器的停止,而用attach进入容器,会导致容器停止
拷贝文件
# 将宿主机文件拷贝到容器内
docker cp 要拷贝的宿主机文件或目录 容器id:容器文件或目录
# 从容器内文件拷贝到宿主机
docker cp 容器id:要拷贝的容器文件或目录(容器内的路径) 宿主机文件或目录
例子:docker cp 123dd: /tmp/a.txt /home
注意:文件拷贝 docker cp 命令 均在宿主机中操作(当前主机)
导入导出容器
#导出 (导出容器的内容作为tar归档文件)
docker export 容器id > 文件名.tar
#导入
cat 文件名.tar | docker import - 镜像用户/镜像名:版本号
#例子:docker import - red/redis:6.0
#执行完,docker images 可查看到 red/redis 的镜像,版本号是6.0
#进行创建容器 docker run -it (上面的镜像id) /bin/bash
#此时的容器,里面的内容就是文件名.tar里的内容
常用其他命令
# 查看容器中进程信息,会跟top命令一样的效果
docker top 容器id
# 查看日志
docker logs 容器id
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
# 查看容器内部细节
docker inspect 容器id
# 查看容器IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
# 查看当前docker运行状态 (查看CPU状态)
docker stats
镜像操作
镜像是通过分层来进行继承
# 提交容器成为镜像,把当前容器里的内容,打成一个镜像,方便其他人使用
docker commit -m=“描述信息” -a="作者名字" 容器id 目标镜像名:[版本号]
# 例子:
docker commit -m=“描述123” -a="yan" 7xx..容器ID tomcatNew:1.3
# 得到上面的镜像,我们可以通过该镜像进行创建容器
docker run -it --name=容器名 tomcatNew:1.3 /bin/bash
本地镜像发布到阿里云仓库
-
登录阿里云
-
找到容器镜像服务
-
创建命名空间
-
创建镜像仓库
然后下一步,选择本地仓库,进行点击创建镜像仓库按钮。
创建完可以看到很多操作命令,可根据指令执行,可通过镜像仓库的列表页,点击管理,进行查看命令。
- 将本地镜像推送到阿里云镜像仓库
# 1.登录阿里云Docker Registry, 密码为开通服务时设置的密码
docker login --username=用户名 registry.cn-xxx(每个人地址不一样)
# 上面的出现succeeded,代表连接阿里云成功
# 2.标记此镜像为阿里云仓库的镜像
docker tag [镜像id] registry.cn-xxxx.xxx.com/命名空间/仓库名称:[镜像版本号]
# 3.提交
docker push registry.cn-xxxx.xxx.com/命名空间/仓库名称:[镜像版本号]
- 将阿里云的镜像拉取到本地
# 1.登录阿里云Docker Registry, 密码为开通服务时设置的密码
docker login --username=用户名 registry.cn-xxx(每个人地址不一样)
# 2.进行拉取镜像
docker pull registry.cn-xxxx.xxx.com/命名空间/仓库名称:[镜像版本号]
Docker Registry
它是私有库,进行搭建docker私有库:
# 1.下载镜像 (相当于本地有一个docker hub)
docker pull registry
# 2.创建本地私有服务器容器
docker run -d -p 5000:5000 -v /xxx/my_registry/:/tmp/registry --privileged=true registry
# 默认仓库创建容器是/var/lib/registry目录下,我们这里指定创建在/xxx/my_registry/目录下
# 3.我们可以操作一些镜像,进行更改内容,创建出新的镜像
docker commit -m=“描述123” -a="yan" 7xx..容器ID tomcatNew:1.3
# 制作出新的镜像
# 4.我们查询私服库上有哪些镜像
curl -XGET http://IP地址:5000/v2/_catalog
# 我们会发现是空的
# 5.将新镜像tomcatNew:1.3修改私服规范的镜像:版本号,
# 最后的tomcatNew:1.3是上传到私有库Registry后自定义的镜像名字、版本号
# IP,系统会默认主机的绑定网络地址为0.0.0.0
docker tag 镜像名称:版本号(或者镜像id:版本号) IP地址:5000/镜像名称:版本号
# 例子:docker tag tomcatNew:1.3 127.0.0.1:5000/tomcatNew:1.3
# 6.修改配置文件支持http,默认是不支持的,该文件也是配置国内镜像加速器的文件
vim /etc/docker/daemon.json
# 内容:注意:格式是json格式,是有逗号的
{
"registry-mirrors": ["https://xxxxx.aliyuncs.com"],
"insecure-registries": ["IP地址:5000"]
}
# 7.进行重启docker(高版本可以不用重启),重启后,registry也需要重启,保持运行状态
systemctl restart docker
# 8.push推送私服库上
docker push IP:端口符合规范的镜像名称或ID:版本号
# 例子:docker push 0.0.0.0:5000/tomcatNew:1.3
# 9.我们查询私服库上有哪些镜像,这时会发现有镜像
curl -XGET http://IP地址:5000/v2/_catalog
# 10.将私有库上的镜像,拉到本地
docker pull IP地址:5000/符合规范的镜像名称:版本号
# 例子:docker pull 0.0.0.0:5000/tomcatNew:1.3
# 11.然后我们可以运行该镜像
docker run -it --name=容器名 镜像名:标签名 /bin/bash
部署应用
部署 MySQL
# 拉取MySQL镜像
docker pull mysql:5.7
# 创建 MySQL 容器
docker run -id --name=my_mysql -p 33306:3306 --privileged=true
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/log:/var/log/mysql
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=密码 mysql:5.7
# -d 后台启动 -p 端口映射 -v 卷挂载 -e 环境变量 -name 容器名字
# 新建my.cnf - 进行修改字符编码
cd /home/mysql/conf/
ls
vim my.cnf # mysql的配置文件,可以在mysql篇章找对应的配置文件
[client]
default_character_set=utf8
...
# 重启容器
docker restart mxg_mysql
# 进入MySQL容器, 登陆MySQL
docker exec -it mxg_mysql /bin/bash
# 登录Mysql
mysql -u root -p
部署 Nginx
# 拉取镜像
docker pull nginx
# 创建容器
docker run -d --name=nginx01 -p 3344:80 nginx
# 查看本机的状况
curl localhost:3344
# 进入容器,查看容器配置文件
whereis nginx
部署 Redis
docker pull redis:6.0.8
# 启动容器,redis-server是指定配置文件进行启动
docker run -id --name=mxg_redis -p 6379:6379 --privileged=true
-v /home/redis/redis.conf:/etc/redis/redis.conf
-v /home/redis/data:/data
redis:6.0.8 redis-server /etc/redis/redis.conf
# 需要将redis的配置文件,daemonize no,设置为no
部署 tomcat
docker pull tomcat
# 创建容器
docker run -id --name=tomcat01 -p 9095:8080 -v /usr/project:/usr/local/tomcat/webapps --
privileged=true tomcat
# 步骤:--privileged=true 如果映射的是多级目录,防止有可能会出现没有权限的问题,
# -v 映射目录:宿主机目录:容器映射目录
部署 es+kibana
docker pull elasticsearch
# 创建容器
docker run -id --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
步骤:-e ES_JAVA_OPTS 增加内存限制64兆,最大是512兆
# 查看本机的状况
curl localhost:9200
镜像操作
提交一个镜像:
提交容器成为镜像
docker commit -m=“描述信息” -a="作者名字" 容器id 目标镜像名:[版本号]
例子:
docker commit -m=“描述” -a="yan" 7..容器ID tomcatNew:1.0
使用数据卷:
# -v 两个目录进行关联挂载
docker run -it -v 主机目录:容器内的目录
# 多个容器实现数据共享 ,创建第2个容器,引用之前创建好的容器名。
docker run --.... --volumes-form 其他容器名