目录
一、初识Docker
1.1 什么是Docker?
1.2 Docker和虚拟机区别
1.3 Docker的基本概念
二、Docker镜像的操作
三、Docker容器命令
四、数据卷
五、宿主机文件系统
六、自定义镜像
6.1 什么DockerFile?
七、DockerCompose集群
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- docker将应用的函数库、依赖、配置和应用打包在一起。
- docker将每个应用放到一个隔离容器中运行,使用沙箱技术避免互相干扰。
Docker如何解决开发、测试、生产环境有差异的问题?
- docker将用户程序和所要调用的系统函数库一起打包。
- docker运行直接基于打包的库函数,借助Linux内核来运行。
Docker就是一个快速交付应用、运行应用的技术。
1、启动速度不同
docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。
2、性能损耗不同
docker 需要的资源更少,docker 在操作系统级别进行虚拟化,docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化。
镜像(Image):docker将应用程序及所需的依赖、函数库、配置等文件打包在一起。
容器(Container):镜像中的应用程序运行后形成的进程。docker对容器做隔离。
DockerHub:docker镜像托管平台。
docker架构:
服务端是docker守护进程,负责处理docker指令、管理镜像和容器。
客户端是通过命令或RestAPI向docker服务端发送指令。
# 构建docker守护进程镜像
docker build
# 从dockerhub拉取镜像
docker pull
# 运行镜像
docker run
Docker CE 支持 64 位版本 CentOS7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。对于刚入门的初级Java开发工程师CentOS6升级到CentOS7版本比较麻烦,建议直接CentOS6彻底删除,重新安装CentOS7版本。
检查并卸载旧版本的docker:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
需要虚拟机联网,安装yum-util工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
更新本地镜像源
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
安装docker社区版
yum install -y docker-ce
安装完docker后,在启动docker需要修改防火墙配置的应用端口。在个人虚拟机上直接关闭防火墙,在企业中不能这么做。
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
启动docker服务
systemctl start docker
查看docker
systemctl status docker # 激活状态active (running)
docker -v # docker的版本
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
由于docker官网镜像相对较慢,设置国内的镜像,如:阿里云、腾讯云、华为云等。
https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pr040oay.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
我们可以发现我们常说的“ubuntu”镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,
同时在这个 Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。
Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。
常见镜像操作命令
学docker的命令不需要特别记忆这些命令,关键是正确使用帮助文档
docker --help
需求1:从dockerhub拉取一个nginx镜像。
1. 去镜像仓库搜索nginx镜像
2. 拉取需要的镜像。
docker pull nginx
3. 查看拉取的镜像。
docker images
需求2:用docker save 将nginx 镜像导出到磁盘,再通过load加载回来。
1. 帮助命令
docker save --help
2. 导出到本地
3. 从磁盘导入
删除nginx镜像
docker rmi nginx:latest
加载镜像到本地
docker load -i nginx.tar
需求3:到dockerhub搜索并拉取redis镜像。
1. 搜索dockerhub搜索redis镜像。
2. 拉取镜像。
docker pull redis
3. 查看redis镜像的名称和版本。
docker images
4. 打包redis镜像
docker save -o redis.tar redis:latest
5. 删除本地的redis镜像
docker rmi redis:latest
6. 重新加载redis。
docker load -i redis.tar
案例1:创建并运行一个nginx容器。
dockerhub查看nginx容器运行命令。
docker run \
--name spnginx \ # nginx名字
-p 8080:80 \ # 宿主机端口:容器端口
-d nginx # 后台运行
docker ps # 查看容器运行进程
通过浏览器外部访问nginx效果
docker logs spnginx # 查看日志
docker logs -f spnginx # 持续跟踪日志
案例2:进入nginx容器,修改html内容,添加提示内容。
# 进入容器和终端交互
docker exec -it spnginx bash
从官网获取静态网页的目录地址
FROM nginx
COPY static-html-directory /usr/share/nginx/html
# Place this file in the same directory as your directory of content ("static-html-directory")
修改html的内容,这是不推荐的。vi命令在容器内不存在。
sed -i 's#Welcome to nginx#计算机学院#g' index.html
sed -i 's###g' index.html
通过浏览器外部访问容器内nginx的静态文件
docker stop spnginx # 停止容器
docker ps -a # 查看所有容器包括挂掉的容器
docker start spnginx # 启动容器
docker pause spnginx # 暂停容器
docker unpause spnginx # 恢复容器
docker rm -f spnginx # 强制运行中的删除容器
docker rm myNginx # 正常删除容器
案例3:创建并运行一个redis容器,并支持数据持久化。进入redis容器,执行redis-cli客户端命令,存入num = 123456。
docker run \
--name m-h-redis \ # redis容器名字
-d redis redis-server \ # 后台运行
--appendonly yes # AOF持久化
docker ps # 查看运行的容器
docker exec -it m-h-redis bash # 进入redis客户端交互
redis-cli # 连接客户端
----------------------------------------------------
docker exec -it m-h-redis redis-cli # 直接进入redis客户端交互
容器和数据耦合度高
- 不便于修改容器内的数据。
- 对容器内的数据进行修改是不可复用的。
- 维护容器及容器内的数据是困难的。
数据卷的常用命令
docker volume create html # 创建数据卷
docker volume inspect html # 查看数据卷挂载的位置
docker volume ls # 查看所有的数据卷
docker volume rm html # 删除数据卷
docker volume prune -f html # 删除数据卷
案例1:创建nginx容器,修改容器内html目录内的index.html的内容。
1创建容器并挂载数据卷到容器内的html目录。
docker run --name m-h-nginx -p 8080:80 -v html:/usr/share/nginx/html -d nginx
进入html数据卷所在位置,并修改html的内容。
docker volume inspect html
cd /var/lib/docker/volumes/html/_data
vi index.html
通过浏览器的外部访问数据卷关联容器。
数据卷挂载通过-v html:/usr/share/nginx/html命令参数进行创建,如果容器中没有可运行的数据卷就会自动创建。
案例2:创建并运行mysql容器,将宿主机目录直接挂载到容器。
通过filezilla文件传输工具上传mysql.tar文件包到虚拟机/usr/etc
加载mysql.tar镜像
docker load -i mysql.tar # 加载mysql镜像
docker images # 查看镜像
创建/usr/etc/mysql/conf配置文件夹
创建/usr/etc/mysql/data数据文件夹
mkdir -p /usr/etc/mysql/conf # 多级目录创建
mkdir -p /usr/etc/mysql/data # 多级目录创建
通过filezilla文件传输工具上传hmy.cnf到/usr/etc/mysql/conf
创建并运行mysql容器
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /usr/etc/mysql/conf/hmy.cnf:etc/mysql/conf.d/hmy.cnf \
-v /usr/etc/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
启动mysql容器
docker start mysql # 启动mysql容器
doker ps # 查看容器运行
在navicat连接可视化工具表面连接成功
数据卷和宿主机文件系统的对比
1. 数据卷挂载耦合度低,由docker管理目录,但是相对不好找。
2. 目录挂载耦合度较高,由自己管理目录,目录容易查找。
镜像就是将应用程序及所需要的系统函数库、环境、配置和依赖打包而成。
什么DockerFile
Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。 Dockerfile 是一个文本文档,其中包含了用户创建镜像的所有命令和说明。
1. 创建空文件夹。
mkdir docker-demo
2. 上传docker-demo.jar、dockerfile文件、jdk8.tar.gz到docker-demo文件夹。
3. 构建镜像。
docker build -t javaweb:1.0 .
4. 运行
docker run --name web -p 8090:8090 -d javaweb:1.0
什么是DockerCompose?
Docker Compose 是用来做Docker 的多容器控制,是一个用来把 Docker 自动化的东西。有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。
DockerCompose安装
1. 上传docker-compose
2. 修改文件权限
chmod +x /usr/local/bin/docker-compose
3. 自动补全
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
案例:将cloud-demo微服务集群部署到DockerCompose