Docker是一个虚拟化的平台,可以通过虚拟化的方式,为应用提供可运行的容器。基于这种方式可以快速打包、测试、部署应用程序。
docker核心对象
镜像(image) :docker镜像是一个特殊的文件系统,可以打包应用的运行环境与应用程序,通过docker启动镜像可以将应用程序在一个容器中启动起来。
docker镜像是高度精简的,镜像中的操作系统不包含内核,容器都是共享宿主机(如centos)的内核。
容器(container):容器可以理解为运行镜像的一个载体,基于镜像创建、启动,运行镜像中的文件。当一个程序通过docker发布、部署成功并运行后,那么这个应用就叫做容器化应用。
架构图
架构图说明:
- Docker Host是我们的docker宿主机(就是安装了docker的操作系统)
- Registry是docker拉取镜像的远程仓库,提供大量的镜像供下载,下载完成之后保存在Images中
- Docker Daemon是docker的服务线程,处理Docker客户端命令。
- Images 是Docker本地的镜像仓库,可以通过docker images查看镜像文件。
docker运行机制
docker pull 1)客户端将指令发送给docker daemon 2)docker daemon 先检查本地images中有没有相关的镜像 3)如果本地没有相关的镜像,则向镜像服务器请求,将远程镜像下载到本地
docker run 1) 检查本地是否存在指定的镜像,不存在就从公有仓库下载 2) 利用镜像创建并启动一个容器 3) 分配一个文件系(简版linux系统),并在只读的镜像层外面挂载一层可读写层 4) 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去 5) 从地址池配置一个 ip 地址给容器 6) 执行用户指定的应用程序2.安装
本地安装
-
下载离线docker安装包
https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz
-
下载离线安装工具(docker.bash,install.sh)
https://github.com/Jrohy/docker-install/
-
将下载好的资源放在一个目录下,导入linux目录下
/root/setup/docker
-
执行安装操作
# 进入/root/setup/docker 文件夹 cd /root/setup/docker # 为 install.sh添加执行权限 chmod +x install.sh # 安装 ./install.sh -f docker-20.10.6.tgz
-
检查安装
docker info
在线安装
-
安装一组yum工具
sudo yum install -y yum-utils
-
设置yum的仓库地址
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
更新yum缓存
sudo yum makecache fast #yum 是包管理器
-
安装最新版的docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
Docker基本操作
#启动docker systemctl start docker #查看docker状态 systemctl status docker #设置开机自启 systemctl enable docker #禁用开机自启 systemctl disable docker #重新启动docker systemctl restart docker #查看docker信息 docker info docker indo | grep "Docker Root Dir" #查询部分信息 #停止docker服务 systemctl stop docker
设置Docker镜像加速
cat </etc/docker/daemon.json { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/var/lib/docker" } EOF
加速设置完成后重启docker,systemctl restart docker
4.Docker镜像操作#下载镜像 docker pull hello-world #浏览镜像文件 docker images #查看镜像详情 docker inspect hello-world #查看镜像历史 docker history hello-world #导出镜像文件 docker save hello-world | gzip > hello-world.tar.gz #删除镜像文件 docker image rm hello-world #导入镜像文件 docker load < hello-world.tar.gz #运行镜像文件 docker run hello-world5.Docker容器操作
#下载镜像 docker pull centos:7 #查看镜像 docker images #创建并启动容器,(-i表示交互式操作, -t 表示终端),bash 表示进入操作终端,基于交互式进行相关操作 docker run -it centos:7 bash #退出 exit #查看所有的容器 docker ps -a #查看正在运行的容器 docker ps #查看容器的日志 docker container logs 214 #停止或重启容器 docker container stop 214 docker container restart 214 #进入指定容器,214为容器id前三位(容器未运行不可进入) docker exec -it 214 bash #删除容器 docker container rm 214 #强制删除运行中的容器 docker container rm -f 214 #清除所有处于终止的状态容器(谨慎使用) docker container prune6.Docker数据管理操作
数据卷(volumes):数据卷是一个可以供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,默认会一致存在。
#创建数据卷 docker volume create container-vol #查看所有数据卷 docker volume ls #查看指定数据卷的信息 docker volume inspect container-vol #启动挂载数据卷的容器 docker run -it -v container-vol:/root centos:7 bash #把数据卷挂载到容器的root目录 #删除数据卷 docker volume rm container-vol #清除无主数据卷 docker volume prune
挂载主机目录(bind mounts):可以直接使容器目录与挂载主机目录,相互绑定共享资源。
#启动挂载容器 docker run it -v /usr/app:/opt/app centos:7 bash #查看挂载目录信息 docker inspect 91a #91a为容器的id7.Dockerfile与镜像制作
制作JDK镜像
准备工作
- centos:7 镜像
- jdk压缩包: jdk-8u51-linux-x64.tar.gz
- 将jdk压缩包放在/root/setup/jdk/目录下
创建Dockerfile文件
-
进入jdk压缩包所在目录,创建并编辑文件Dockerfile
vim Dockerfile #按i进行编辑,编辑完毕esc,然后:wq保存退出 #文件内容 FROM centos:7 ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH CMD ['bash'] -
创建jdk镜像文件
在Dockerfile所在目录执行docker build命令
docker build -t jdk:8 . #不要丢掉这里的点,-t表示镜像标识(镜像名),是tag单词的缩写.
-
运行JDK镜像文件
docker run -it jdk:8 bash
进入容器之后,echo $PATH查看环境变量,java -version查看JDK版本
-
基于jdk运行sentinel启动
-
将sentinel拷贝到/root/servers/目录中
-
基于jdk:8镜像启动运行sentinel服务(服务启动后可在宿主机通过localhost:8180进行访问
-
docker run -d -p 8180:8080 --name sentinel -v /root/servers:/usr/sca jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.1.jar
-
制作Sentinel镜像
准备工作:
-
centos:7
-
jdk8压缩包, jdk-8u51-linux-x64.tar.gz
-
sentinel-dashboard-1.8.0.jar
jdk8与sentinel-dashboard-1.8.0.jar放在/root/setup/sentinel/目录
构建sentinel镜像
-
在jdk8中添加Dockerfile文件,编辑
FROM centos:7 ADD jdk-8u51-linux-x64.tar.gz /usr/local/ ADD sentinel-dashboard-1.8.1.jar /usr/local/ ENV JAVA_HOME=/usr/local/jdk1.8.0_51 PATH=/usr/local/jdk1.8.0_51/bin:$PATH EXPOSE 8080 ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"]EXPOSE表示对外暴露的服务端口,ENTRYPOINT中写的是你容器启动时候要执行的指令
-
使用Dockerfile构建镜像
docker build -t sentinel:8 . #不要丢掉小点
-
后台运行sentinel容器
docker run -d --name sentinel8181 -p 8181:8080 sentinel:8 #-d 表示后台运行,-p用于指定端口映射,sentinel:8为镜像文件名
-
查看sentinel容器
docker ps
-
访问sentinel服务
在window系统中访问Linux系统的sentinel服务:192.168.126.128:8181/#/login
安装mysql数据库
-
拉取指定版本mysql
docker pull mysql:8.0.23
-
检查mysql镜像docker images
-
启动运行mysql
sudo docker run -p 3306:3306 --name mysql -v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files -v /usr/local/docker/mysql/conf:/etc/mysql -v /usr/local/docker/mysql/logs:/var/log/mysql -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23
-
登录mysql数据库
#进入容器 sudo docker exec -it mysql bash #登录mysql mysql -uroot -p
-
停止启动mysql
#停止mysql服务 docker stop mysql #启动mysql服务 docker start mysql #设置mysql开机自启动,docker启动mysql也启动 docker update mysql --restart=always
安装Redis数据库
-
下载镜像文件
docker pull redis
-
准备配置文件,启动redis
#创建Redis配置文件目录 mkdir -p /usr/local/docker/redis01/conf #创建文件redis.config touch /usr/local/docker/redis01/conf/redis.conf #创建Redis实例并启动 sudo docker run -p 6379:6379 --name redis01 -v /usr/local/docker/redis01/data:/data -v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf #查看正在运行的进程 docker ps
-
访问redis服务器
#进入redis docker exec -it redis01 bash #检查redis版本 redis-server -v redis-cli -v #登录redis 默认不需要密码 redis-cli
-
停止和启动redis服务
#停止redis docker stop redis01 #启动redis服务 docker start redis01 #重启redis服务 docker restart redis01
安装Nginx代理
#下载镜像 docker pull nginx #查看镜像 docker images #创建数据卷 docker volume create nginx-vol #查看数据卷对应的宿主机目录 docker inspect nginx-vol #启动nginx docker run --name nginx -p 80:80 -v nginx-vol:/etc/nginx -d nginx
数据卷对应的nginx容器的目录为nginx的默认解压目录,以后需要更改nginx配置只需要在数据卷中的目录进行修改即可。
docker stop nginx docker start nginx docker restart nginx
安装Nacos组件
#1.下载nacos docker pull nacos/nacos-server:1.4.1 #2.mysql执行nacos的sql的脚本文件 #将nacos-mysql.sql文件拷贝到mysql容器对应的挂载目录下 #在Linux中启动登录mysql #进入mysql容器 docker exec -it mysql bash #登录mysql mysql -uroot -p #通过source命令运行sql文件 source /etc/mysql/nacos-mysql.sql #这里的/etc/mysql为容器中的一个目录(要选择你自己挂载的目录) #创建并启动nacos容器(账号密码要使用自己宿主机的ip,数据库的密码) docker run -e TZ="Asia/Shanghai" -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_DATAbase_NUM=1 -e MYSQL_SERVICE_HOST=192.168.126.129 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -e MYSQL_SERVICE_DB_NAME=nacos_config -p 8848:8848 --name nacos --restart=always -d nacos/nacos-server:1.4.1 #重启容器即开机自启nacos --restart=always #检查nacos服务 docker ps #若未成功启动nacos,查看日志信息 docker container logs nacos
window客户端访问http://ip:port/nacos,测试nacos
#停止nacos docker stop nacos #启动nacos docker start nacos #重启nacos docker restart nacos9.Docker容器互联
两个容器之间进行连接,
-
可以通过宿主机进行连接通讯(容器的端口会映射到宿主机上)
-
两个容器通过虚拟网络进行连接
#新建网络 docker network create -d bridge t-net #t-net为自己起的网络名称 #查看网络信息 docker network ls docker inspect t-net #创建容器并加入网络进行互联通讯 docker run -it --name app1 --network t-net centos:7 docker run -it --name app2 --network t-net centos:7 #测试网络互通 在容器app1中,ping app2检查与app2的通讯 在容器app2中,ping app1检查与app1的通讯 ping成功则可以网络互通



