Docker基础笔记
1.概述
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.repo
sudo 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
3.Docker基本操作
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 <<EOF > /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-world
5.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 prune
6.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为容器的id
7.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
8.Docker镜像安装
安装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 nacos
9.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成功则可以网络互通