文章目录
Docker技术简介
Docker是一个虚拟化平台( 官网https://www.docker.com/),诞生于 2013 年初,基于 Google 公司的 Go 语言进行实现。可以通过虚拟化方式,为应用提供可运行的容器。基于这种方式,可更快地打包、测试以及部署应用程序。
Docker基本操作
启动docker服务: systemctl start docker
停止docker服务: systemctl stop docker
重新启动Docker服务: systemctl restart docker
查看Docker状态: systemctl status docker
设置Docker开机自启: systemctl enable docker
禁用Docker开机自启: systemctl disable docker
查看Docker信息: docker info
查看docker info中具体key的信息: docker info | grep 'Docker Root Dir:'
Docker镜像加速
由于国内网络问题,需要配置加速器来加速
修改配置文件 /etc/docker/daemon.json
下面命令直接生成文件 daemon.json
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服务
# 重新加载docker配置
sudo systemctl daemon-reload
#重启docker服务
sudo systemctl restart docker
Docker镜像操作
Docker 镜像是一组静态磁盘文件,可以任意下载、复制、分发。从镜像可以运行启动容器(Docker的虚拟计算机)。
从镜像仓库 https://hub.docker.com 下载镜像:
下载镜像: docker pull 镜像名(repository:tag)
浏览镜像文件: docker images
查看镜像详情: docker inspect 镜像名或镜像id
查看镜像历史: docker history 镜像名
删除镜像文件: docker image rm 镜像名或镜像id
docker rmi 镜像名或镜像id
导出镜像文件:
# 把两个镜像 redis:latest 和 centos:8 导出,并压缩到 imgs.gz
docker save redis:latest centos:8 | gzip > imgs.gz
导入镜像操作:
# 要在 imgs.gz 文件所在目录下执行
docker load -i imgs.gz
docker load < imgs.gz
运行镜像文件:
#基于镜像,启动容器运行
docker run 镜像名
Docker容器操作
从一个镜像可以运行启动一个或多个容器
所谓容器,我们可以理解为是一个虚拟的计算机,其中运行着操作系统,操作系统中运行着我们部署的应用
`创建并启动容器`
docker run -it xxxx bash
1)xxxx - 镜像名, 或 image id 的前几位,
2)-it 这是两个参数(-i表示交互式操作, -t 表示终端)
3) bash 表示进入操作终端,基于交互式进行相关操作(例如执行linux相关指令)
`启动一个临时容器`
docker run -d --rm --name tmp --restart=always 镜像名
1)--rm 在容器停止时自动删除容器
2)--name 每个启动的容器都可以指定一个名称
3)--restart=always 容器可以随系统自动启动
把容器的 server.xml 复制到宿主机的 /root/ 目录下
docker cp tmp:/usr/local/tomcat/conf/server.xml /root/
后台运行启动容器: docker run -d 镜像名
查看docker运行中的容器: docker ps
查看docker中的容器: docker ps -a
查看容器详情: docker inspect 容器名或容器id
查看容器日志信息: docker (container) logs 802 #802为容器id
停止运行的容器: docker (container) stop 802
重新启动容器: docker (container) restart 802
进入指定容器(后台运行时): docker exec -it 802 bash
删除容器: docker (container) rm 802 #删除运行中的容器,需要添加 -f 参数
删除所有停止状态容器: docker container prune
删除所有容器: docker rm -f $(docker ps -aq)
查看tomcat镜像历史
docker history tomcat
启动容器时覆盖 ENTRYPOINT 和 CMD
覆盖 CMD:
以 tomcat 镜像为例,镜像中设置的默认命令是 catalina.sh run
,可以任意指定命令覆盖这个默认命令,这里执行 ls -a -l
来测试:
docker run tomcat ls -a -l
覆盖 ENTRYPOINT:
–entrypoint:设置运行的命令,不许写在镜像名称 tomcat 的后面,注意,这里不能添加命令的参数;
镜像名称 tomcat 后面的内容会覆盖 CMD
docker run --entrypoint ls tomcat -a -l
两项设置的内容连接起来作为一个完整的命令 ls -a -l
Docker数据挂载
目录挂载
在启动容器时,以目录直接挂载的方式进行数据操作
docker run -it -v /usr/app:/opt/app centos:7 bash
1)/usr/app:为宿主机目录
2)/opt/app: 为启动容器的一个目录
3)-v 用于指定挂载目录,如果本地目录(宿主机目录)不存在, Docker 会自动为你按照挂载目录进行目录的创建。(通过 -v 参数可以挂载文件、目录和数据卷)
数据卷挂载
数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,默认会一直存在,即使容器被删除(实际上也是通过主机目录进行挂载
)
创建数据卷: docker volume create container-vol
查看所有数据卷: docker volume ls
查看指定数据卷的信息: docker (volume) inspect container-vol
查询的结果:
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/container-vol/_data",
"Name": "container-vol",
"Options": {},
"Scope": "local"
}
]
把数据卷 container-vol 挂载到容器的 /root 目录:
docker run -it -v container-vol:/root centos:7 bash
删除数据卷(如果数据卷被容器使用则无法删除): docker (volume) rm container-vol
清理无主数据卷: docker volume prune
容器互联(网络)
Docker 中存在多个容器时,容器与容器之间经常需要进行通讯,例如nacos访问mysql,redis集群中各个节点之间的通讯
Docker 中容器与容器之间进行通讯的解决方案一般有两种:
第一种:两个容器通过宿主机进行通讯(容器中的端口会映射到宿主机上)
第二种:两个容器之间直接通过虚拟网络进行连接,但是需要我们在docker中创建网络
端口映射
docker run -d -p 80:8080 tomcat
虚拟网络
在 Docker 中可以创建任意多个虚拟网络,容器之间可以通过虚拟网络互联互通,创建虚拟网络时宿主机也会连接到虚拟网络
新建网络: docker network create (-d bridge) t-net #-d driver,网络类型,默认 bridge
列出所有网络: docker network ls
查看网络信息: docker inspect 网络名或网络id
查看宿主机新建的虚拟网卡: ifconfig
查询的结果:
br-ef94bf92552d: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.255.0 broadcast 172.18.0.255
inet6 fe80::42:eeff:fe8d:afdf prefixlen 64 scopeid 0x20<link>
ether 02:42:ee:8d:af:df txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1102 (1.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
新建两个容器 app1 和 app2,连接到虚拟网络 t-net:
docker run -d --name app1 --net(work) t-net tomcat
docker run -d --name app2 --net(work) t-net tomcat
查看两个容器的虚拟网络ip:
docker inspect app1 #172.18.0.2
docker inspect app2 #172.18.0.3
从宿主机ping两个容器:
ping 172.18.0.2
ping 172.18.0.3
从容器访问另一个容器,可以使用容器名称访问,容器内部实现了解析环境:
docker exec -it app1 ping app2
Dockerfile及镜像制作
Dockerfile (注意文件的大小写)是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,类似于一个批处理文件,用来设置镜像的构建流程,我们通常会基于此文件创建docker镜像
制作Sentinel镜像
- 准备工作
centos:7镜像
jdk-8u51-linux-x64.tar.gz
sentinel-dashboard-1.8.0.jar
说明: 通过docker images指令查看centos:7是否存在
,然后将 jdk-8u51-linux-x64.tar.gz,sentinel-dashboard-1.8.0.jar放在/root/setup/sentinel目录(目录不存在的话自己创建) - 构建Sentinel镜像
第一步:在sentinel所在目录创建Dockerfile文件,并添加如下内容:
# 选择基础镜像
FROM centos:7
# jdk 和 sentinel 文件添加到镜像的 /usr/local/ 目录下
# ADD 指令会自动解压文件
ADD jdk-8u51-linux-x64.tar.gz sentinel-dashboard-1.8.0.jar /usr/local/
# 设置环境变量
# 通过echo $PATH查看环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
PATH=/usr/local/jdk1.8.0_51/bin:$PATH
# EXPOSE 8080 对外暴露的服务端口,只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 这个声明有两个好处:
# 1.帮助镜像使用者理解这个镜像服务的端口,以方便配置映射
# 2.在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口
EXPOSE 8080
# 设置启动命令
# 只设置 CMD 是常见的用法,如: CMD ["catalina.sh", "run"]
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.0.jar"]
第二步:使用 Dockerfile 构建镜像(在Dockerfile所在目录执行docker指令)
docker build -t sentinel:8 ./ #不要丢掉这里的点
第三步:后台运行sentinel容器
docker run -d --name sentinel8181 -p 8181:8080 sentinel:8 #-p用于指定端口映射
第四步:查看sentinel容器
docker ps -a
docker logs sentinel8181