docker
建议更换yum源
Docker
一、 Docker 简介
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205091616609-136856396.png)
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205091644486-1002734153.png)
3 Docker 特点
3.1 效率高
3.2 职责明确
3.3 结构完整
3.4 契合微服务架构
4 Docker 架构
4.1 Docker daemon(Docker 守护进程)
4.2 Client(Docker 客户端)
4.4 Container(容器)
4.5 Registry(仓库)
二、 Docker 安装与启动
1 安装
1.1 下载 docker-ce repo
1.2 安装依赖
1.3 安装 docker-ce
2 启动
2.1 启动命令
2.2 关闭命令
2.3 查看 Docker 状态
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092023542-879183054.png)
三、 镜像加速器配置
1 访问阿里云
2 进入控制台
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092103405-1137861975.png)
3 搜索镜像加速器
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092113755-1346164124.png)
4 选择对应的 OS 并配置
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092124245-1406664071.png)
#创建文件
mkdir -p /etc/docker
#编辑daemon.json
vim /etc/docker/daemon.json
# 编辑内容
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
# 重启容器
systemctl restart docker
5 验证镜像加速器配置
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092139865-1279820545.png)
四、 Docker 镜像操作
1 什么是 Docker 镜像
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092157732-241927277.png)
2 列出镜像
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092211512-1853547880.png)
3 搜索镜像
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092310446-1891524811.png)
4 拉取镜像
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092325671-2066635482.png)
5 删除镜像
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092344892-504725019.png)
五、 Docker 容器操作
1 新建容器
1.1 options 常见参数说明
2 新建并启动容器
3 列出启动容器
3.1 options 参数说明
4 与运行中的容器交互
docker exec -it id /bin/bash
5 停止容器
6 启动容器
7 强制停止容器
8 暂停容器
9 恢复容器
10 删除容器
11 查看容器日志
12 查看容器中运行的进程
13 查看容器内部详情
14 复制容器数据到宿主机
从主机复制到容器 docker cp host_path containerID:container_path
从容器复制到主机 docker cp containerID:container_path host_path
六、 Docker File 管理
1 使用本地命令构建镜像
1.1 下载 JDK 镜像
1.2 创建构建文件
1.2.1 语法解释
1.3 构建镜像
1.4 启动
2 使用 IDEA 构建镜像
2.1 修改 Docker 服务配置
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092719719-1329150098.png)
2.2 重启 docker 服务
2.3 IDEA 项目 POM 依赖
新增 plugin 插件配置: <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <imageName>projects/eureka:1.0</imageName> <!--指定镜像名称 仓库/镜像名:标 签--> <baseImage>openjdk:latest</baseImage> <!--指定基础镜像--> <dockerHost>http://192.168.89.128:2375</dockerHost> <!-- 指定服务器仓库地址 --> <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器 启动执行的命令 --> <exposes> <expose>8761</expose><!-- 发布端口 --> </esposes> <resources> <resource> <targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 --> <directory>${project.build.directory}</directory> <!-- 指定要复制的根目录, 这里是 target 目录 --> <include>${project.build.finalName}.jar</include> <!-- 指定需要拷贝的文件, 这里指最后生成的 jar 包 --> </resource> </resources> </configuration> </plugin>
2.4 新增 IDEA 启动配置
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092811142-696817493.png)
![](https://img2020.cnblogs.com/blog/1504650/202012/1504650-20201205092828724-1382839903.png)
七、 阿里云镜像仓库
1 push 镜像
2 pull 镜像
八、 本地镜像仓库
1 搭建本地仓库
1.1 下载本地仓库镜像
1.2 修改 Docker Service 配置
1.3 修改 Docker Daemon 配置
1.4 重启 Docker 服务
1.5 启动容器
1.6 容器启动状态
docker container ls -a
1.7 浏览器查看本地仓库
3 pull 镜像
九、 Docker 容器的生命周期
1 状态介绍
1.1 圆形
1.2 长方形
1.3 菱形
1.3.1 killed by out-of-memory(因内存不足被终止)
1.3.2 container process exited(异常终止)
十、 Docker 的数据管理
1 数据卷管理
2 数据卷容器管理
2.1 创建数据卷容器
2.2 创建容器并使用数据卷容器
2.3 测试
2.3.1 访问 eureka1 容器并在共享目录中写入数据
2.3.2 访问 eureka2 容器并读取共享目录中的数据
3 数据备份
3.1 创建宿主机备份目录
3.2 通过容器备份数据
4 数据还原
4.1 删除容器中的数据文件
4.2 通过容器还原备份数据
![](https://img2022.cnblogs.com/blog/1504650/202209/1504650-20220921113310640-1738505515.png)
docker Compose -容器编排
什么是docker compose
定义: Compose 项目是docker官方的开源项目,负责实现对docker容器集群的快速编排。
快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器进行按照指定顺序启动。
![](https://img2022.cnblogs.com/blog/1504650/202209/1504650-20220921154740232-1908355905.png)
4.2.安装DockerCompose
Compose 安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 v2.2.2。
Docker Compose 存放在 GitHub,不太稳定。
你可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose version
cker-compose version 1.24.1, build 4667896b
注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
4.3.部署微服务集群
需求:将之前学习的cloud-demo微服务集群利用DockerCompose部署
实现思路:
① 查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名
③ 使用maven打包工具,将项目中的每个微服务都打包为app.jar
④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
4.3.1.compose文件
查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:
内容如下:
version
可以看到,其中包含5个service服务:
-
nacos
:作为注册中心和配置中心-
image: nacos/nacos-server
: 基于nacos/nacos-server镜像构建 -
environment
:环境变量-
MODE: standalone
:单点模式启动
-
-
ports
:端口映射,这里暴露了8848端口
-
-
mysql
:数据库-
image: mysql:5.7.25
:镜像版本是mysql:5.7.25 -
environment
:环境变量-
MYSQL_ROOT_PASSWORD: 123
:设置数据库root账户的密码为123
-
-
volumes
:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
-
-
userservice
、orderservice
、gateway
:都是基于Dockerfile临时构建的
查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:
查看微服务目录,可以看到都包含Dockerfile文件:
内容如下:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
4.3.2.修改微服务配置
因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。
如下所示:
spring
4.3.3.打包
接下来需要将我们的每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是app.jar,因此我们的每个微服务都需要用这个名称。
可以通过修改pom.xml中的打包名称来实现,每个微服务都需要修改:
<build>
<!-- 服务打包的最终名称 -->
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包后:
编译打包好的app.jar文件,需要放到Dockerfile的同级目录中。注意:每个微服务的app.jar放到与服务名称对应的目录,别搞错了。
user-service:
order-service:
gateway:
4.3.5.部署
最后,我们需要将文件整个cloud-demo文件夹上传到虚拟机中,理由DockerCompose部署。
上传到任意目录:
部署:
进入cloud-demo目录,然后运行下面的命令:
docker-compose up -d
docker network详解
其他项目调用这个项目就在后面指定一下add-host
--add-host solr.dtmaster.cn:172.18.0.50
1、docker network --help
#帮助命令后显示下面信息 [root@localhost /]# docker network --help Usage: docker network COMMAND Manage networks Options: --help Print usage Commands: connect Connect a container to a network create Create a network disconnect Disconnect a container from a network inspect Display detailed information on one or more networks ls List networks prune Remove all unused networks rm Remove one or more networks Run 'docker network COMMAND --help' for more information on a command.
- connect 将某个容器连接到一个docker网络
- create 创建一个docker局域网络
- disconnect 将某个容器退出某个局域网络
- inspect 显示某个局域网络信息
- ls 显示所有docker局域网络
- prune 删除所有未引用的docker局域网络
- rm 删除docker网络
2、创建自定义docker局域网络
docker network create mynet
然后pull两个镜像使用新创建的网络
3、pull镜像和运行镜像
#pull之前先设置docker镜像加速,国外pull速度很慢,参考:
https://blog.csdn.net/wangyue23com/article/details/110194399
docker pull redis
docker pull nginx
#运行redis容器
docker run -itd --name redis --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 80:80 --network mynet --network-alias nginx --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
运行容器时候加入命令 --network mynet --network-alias redis,
代表当然容器要加入到mynet局域网络中
4、docker 查询网络信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#查看mynet的详细信息,发现redis和nginx已在Containers容器内,属于当前mynet网络
[root@localhost /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "8453b7b1d246f1ad54e27033928bbb8e7842ca96b4315fad720688af206b69c6",
"Created": "2020-12-13T22:50:55.566207522-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"87ff63bb819a823578bed89a67527009d9fee31a92de9d50e5d635b97cc18664": {
"Name": "redis",
"EndpointID": "19a04279300025dc936d206a287b1e31d04b339298b445694452a5f4326f7051",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"c75ff4ac770fd04a1c6daa05a82533555038e3b0f8e15c3b1ee29e26c14a0131": {
"Name": "nginx",
"EndpointID": "4ccc014edcfd7be443c75491cc32aa0745561cfd45903e204e8d3e7afa94a4fe",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
5、验证ping命令是否容器之间网络交互
#进入redis命令行,使用ping nginx命令验证能够连接成功**使用ping命令之前,需要给docker安装ping,自行百度**
docker exec -it redis bash
root@822f249e7d90:/# ping nginx
PING nginx (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: icmp_seq=0 ttl=64 time=0.071 ms
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.100 ms
同样也可以不指定网络,直接启动容器,然后使用docker network connect接入网络。
#将容器删掉重新创建
docker stop nginx
docker rm -f nginx
docker stop redis
docker rm -f redis
6、使用docker network connect
#运行nginx和docker容器
docker run -itd --name redis -p 6379:6379 redis
docker run -d --name nginx -p 80:80 --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
使用docker network connect命令连接网络
#加入nginx到mynet网络
[root@localhost /]# docker network connect mynet nginx
#加入redis到mynet网络
[root@localhost /]# docker network connect mynet redis
#查看mynet网络包含的容器,会发现两个容器都加入当前网络了,后面使用ping命令是能够ping通容器名称的。
[root@localhost /]# docker network inspect mynet
7、docker network disconnect
#将nginx移除mynet局域网络
docker network disconnect mynet nginx
使用docker network 很方便的维护和管理docker网络,方便容器之间ip和端口交互。
-p指令有哪些用法?
大家用的最多的可能就是-p 80:80事实上,还有其他用法:
-p 8080:80
将容器的TCP80端口映射到宿主机的8080端口
-p 192.168.1.100:8080:80
将容器的TCP80端口映射到IP地址为192.168.1.100宿主机的8080端口
-p 8080:80/udp
将容器的UPD80端口映射到宿主机的8080端口
-p 8080:80/tcp -p 8080:80/udp
同时映射TCP和UDP端口 作者:小可ThinkPHP学堂 https://www.bilibili.com/read/cv17601617 出处:bilibili