SpringCloud(十) - Docker
1、Docker安装
1.1 卸载旧版本(否者会安装出错)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.2 安装一些需要的环境
yum install -y yum-utils device-mapper-persistent-data lvm2
1.3 Docker CE 镜像源站
Docker CE 镜像源站 # yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.3 安装最新版本
sudo yum install docker-ce
1.4 查看版本信息
docker
docker -v
1.5 配置 腾讯云 Docker 镜像源加速镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
EOF
1.6 Docker 基础命令
配置开机启动# systemctl enable docker
启动docker# systemctl start docker
查看docker信息# docker info
关闭docker# systemctl stop docker
重新docker# systemctl reload docker
1.7 hello-world
docker run hello-world
2、Docker 核心操作命令
2.1 镜像操作
2.1.1 查看镜像
列出本机上所有的镜像# docker images
参数
-a 列出本地所有的镜像
-q 只显示镜像ID
--digests 显示镜像摘要信息
REPOSITORY:表示镜像的仓库源名称
TAG:镜像的标签,同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,latest最新
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
2.1.2拉取镜像
2.1.2.1 搜索需要的镜像
dockerhub:https://hub.docker.com/search?q=mysql
2.1.2.2 找到需要的版本
2.1.2.3 复制命令 执行
2.1.3 删除镜像
docker rmi -f 镜像名/镜像ID
docker rmi -f $(docker images -aq) 删除全部镜像
2.2 容器操作
2.2.1 根据镜像创建并启动容器
docker run [OPTIONS] IMAGE #根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
OPTIONS说明:
--name=“容器新名字”:为容器指定一个名称
--rm:退出时删除容器
-d:后台运行容器,并返回容器ID,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-p:指定端口映射
实例:
docker run -itd --name mysql01 -p 3306:3306 mysql:5.7.30
此命令会创建容器,但是启动容器失败,命令不完整,下面实战会重新使用
因为我们服务器上本来就安装有mysql所以需要停止mysql服务
service mysqld stop
如果不能停止可以参考:https://blog.csdn.net/weixin_29009881/article/details/113280951
2.2.2 列出所有容器
docker ps 列出所有正在运行的容器
带参
-a 列出所有的容器
-l 列出最近创建的容器
-n 3 列出最近创建的3个容器
-q 只显示容器ID,先启动容器
--no-trunc 显示当前所有正在运行的容器完整信息
2.2.3 容器启动,停止,删除
docker start 容器ID或容器名称 #启动容器
docker restart 容器ID或容器名称 #重新启动容器
docker stop 容器ID或容器名称 #停止容器
docker kill 容器ID或容器名称 #强制停止容器
docker rm 容器ID或容器名称 #删除容器
docker rm -f 容器ID或容器名称 #强制删除容器
docker rm -f $(docker ps -a -q) #删除多个容器
2.2.4 查看容器日志
docker logs -f -t --since="日期" --tail 容器ID或容器名称
实例:
docker logs -f -t --since="2022-01-10" --tail=10 mysql01
-f : 查看实时日志
-t : 查看日志产生的日期
--since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志
--tail=10 : 查看最后的10条日志
2.2.5 进入和退出容器
2.2.5.1 进入容器
方式一(推荐):
docker exec -it 容器名/容器ID /bin/bash
# /bin/bash 交互路径,因为载入容器后运行bash ,docker中必须要保持一个进程的运行。打开一个shell交互窗口,可以操作。
示例:docker exec -it mysql01 /bin/bash
方式二:
docker attach 容器名/容器ID
#前提是容器启动后,必须是启动了终端交互窗口,才可以直接用,比如此命令,进入mysql容器,默认就不能直接打开终端
示例:docker attach mysql01
2.2.5.2 退出容器
方式一(推荐):
ctrl + p + q # 执行此命令容器都不会被关闭
# 注意:有的浏览器会占用这个快捷键
方式二:
exit # 直接退出 执行此参数 容器会被关闭
2.2.6 拷贝文件
# 无论容器是否开启 都可以进行相互拷贝
docker cp 容器ID/名称:容器内路径 容器外路径 # 从容器内 拷出
docker cp 容器外路径 容器ID/名称:容器内路径 # 从外部 拷贝文件到容器内
3、Docker 实战
3.1 Docker容器-MySQL
3.1.1 拉取镜像
docker pull mysql:5.7.30
3.1.2 命令启动
# 先删除之前那个没有配置初始密码的mysql01
docker run -itd --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.7.30
# 注意:
# 指定初始密码,容器启动成功,就可以直接进行登录操作
# 端口映射 -p 外部服务器端口:容器端口
3.1.3 查看容器
docker ps
3.1.4 进入容器
dockerexec -it mysql01 /bin/bash
3.1.5 登录服务
mysql -uroot -proot
# 如果服务没有启动,就先启动服务 service mysql start
3.1.6 测试远程连接
3.2 Docker容器-Redis
3.2.1 拉取镜像
docker pull redis:5.0.14
3.2.2 命令启动
docker run -itd --name redis01 -p 6379:6379 redis:5.0.14
3.2.3 查看容器
docker ps -a
3.2.4 进入容器
docker exec -it redis01 /bin/bash
3.2.5 登录服务
cd /usr/local/bin/ # 进入redis安装目录
redis-cli # 进入服务端
ping
3.2.6 测试远程连接
3.3 Docker 图形化工具 Portainer
参考链接:https://blog.csdn.net/m0_67900727/article/details/123550536
3.3.1 拉取镜像
docker pull portainer/portainer
3.3.2 运行Portainer容器
docker run -p 9000:9000 -p 8000:8000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/portainer/data:/data \
-d portainer/portainer
第一次登录的时候需要创建管理员账号,访问地址:http://192.168.5.78:9000/
3.3.3 访问
4、自定义提交镜像
4.1 docker commit
运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像,这时候我们就需要使用 commit 命令来构建一个新的镜像;
4.1.1 拉取一个tomcat镜像并创建运行容器
docker pull tomcat:8.5.78-jdk8-corretto # 拉取镜像
docker run -itd -p 8080:8080 --name tomcat01 tomcat:8.5.78-jdk8-corretto # 创建并运行容器
# 访问端口8080,发现访问404
docker exec -it tomcat01 /bin/bash
进入tomcat的安装目录,进入webapps目录,会发现 下一个文件都没有 ,访问肯定404
文件都在webapps.dist
将webapps.dist下的内容拷贝到webapps目录下
cp -r webapps.dist/* webapps/
4.1.2 打包成新镜像
docker commit -m="第一次打包镜像,tomcat首次访问404" -a="KH96" tomcat01 tomcat:8.5.78-kh9x
语法:
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag
4.1.3 用新的镜像创建新的容器
docker stop tomcat01 # 停止tomcat01容器
docker rm -f tomcat01 # 删除tomcat01容器
docker images -a # 查看我们新打包的镜像
# 重新创建并运行新的容器 tomcat02
docker run -itd -p 8080:8080 --name tomcat02 tomcat:8.5.78-kh9x
# 再次测试访问
可以看到tomcat服务的首页;
4.2 Dockerfile
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
4.2.1 常用命令
4.2.1.1 FROM (from)
语法: FROM <image> 或者 FROM <image>:<tag>
含义: 基础image,必须写在第一行,指定在哪个基础镜像上创建镜像,可以是官方远程仓库中的,也可以本地仓库。
4.2.1.2 MAINTAINER (maintainer)
语法: MAINTAINER <name>
含义: 申明作者,用于将image的作者相关的信息写入到image中,辅助使用,一般放FROM命令后面
4.2.1.3 WORKDIR (workdir)
语法: WORKDIR <path>
含义: 设置容器的工作目录,之后的命令RUN 、CMD 、ENTRYPOINT命令都是基于此工作目录,如果不存在则会创建目录,也可以在 docker run命令中用 -w参数覆盖掉WORKDIR指令的设置
注意:为了避免出错,推荐WORKDIR指令中只使用绝对路径,进入容器后默认也是此目录
4.2.1.4 ADD (add)
语法: ADD <src> <dest>
<src>相对被构建的源目录的相对路径,也可以是一个远程的文件url;
<dest> 是container中的绝对路径
含义:它的基本作用是从宿主机系统的文件系统上复制文件到目标容器的文件系统。
1)如果源是一个URL,那该URL的内容将被下载并复制到容器中。
2)如果如果文件是可识别的压缩格式,则docker会帮忙解压缩。
3)如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的path目录下,默认当前目录。
4)ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。
4.2.1.5 ENV (env)
语法: ENV <key> <value>
含义: 用于设置环境变量,在image中设置一个环境变量。
注意: 设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
4.2.1.6 RUN (run)
语法: RUN <command>
含义: 它接受命令作为参数并用于创建镜像,并在镜像构建的过程中执行。
注意: RUN可以运行任何被基础image支持的命令,RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
4.2.1.7 CMD (cmd)
语法: CMD ["executable","param1","param2"]
CMD command param1 param2
含义:用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
区别:CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
4.2.1.8 ENTRYPOINT (entrypoint)
语法: ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
含义:这个命令和CMD功能一样。指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
指令的使用分为两种情况:
独自使用: 如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖,只有最后一个CMD或者ENTRYPOINT有效。
# CMD指令将不会被执行,只有ENTRYPOINT指令被执行
CMD echo “Hello, World!”
ENTRYPOINT ls -l
CMD指令配合使用: 和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。
FROM centos
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
4.2.1.9 USER (user)
语法: USER <user>
含义: 设置指令,设置启动容器的用户,默认是root用户。
4.2.1.10 EXPOSE (expose)
语法: EXPOSE <port> [<port>...]
含义: 暴露容器内部端口,可以设置多个
例如: EXPOSE 5000,暴露的是容器内部端口,不是主机端口,如果外部想使用这个端口需要在运行时映射。
docker run -d -p 127.0.0.1:8080:5000 hello-world
4.2.2 Dockerfile构建jdk+tomcat镜像
4.2.2.1 资源添加
创建一个目录存放资源# mkdir Dockerfile-tomcat
把jdk压缩包和tomcat压缩包放到 Dockerfile-tomcat 的目录下面
4.2.2.1 编辑Dockerfile
# 新建一个空文件Dockerfile,编辑Dockerfile内容。
# vi Dockerfile
Dockerfile内容:
# 基础镜像
FROM centos:7.6.1810
# 作者信息
MAINTAINER kh9x <kh9x@qq.com>
# 容器工作目录
WORKDIR /usr/local/
# 在宿主机/usr/local/docker路径下,上传压缩包,并添加tomcat和jdk到镜像中,ADD会自动解压
ADD jdk-8u192-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.73.tar.gz /usr/local/
# 设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_192/
ENV PATH $JAVA_HOME/bin:$PATH
ENV CATALINA_HOME=/usr/local/apache-tomcat-8.5.73
# 配置启动文件的权限
RUN chmod +x /usr/local/apache-tomcat-8.5.73/bin/*.sh
# 指定于外界交互的端口
EXPOSE 8080
# 定义在容器启动之后的运行程序,保持docker容器运行
ENTRYPOINT /usr/local/apache-tomcat-8.5.73/bin/startup.sh && /bin/bash && tail -f /usr/local/apache-tomcat-8.5.73/logs/catalina.out
4.2.2.3 执行构建命令构建(tomcat+jdk)服务镜像
执行命令# docker build -t 镜像名:tag .
举例# docker build -t tomcat:8.5.73-jdk8-kh96 .
注意:-t为执行镜像的名称,千万不要忽略结尾处的 . ,它表示当前上下文目录。不是Dockerfile的默认目录
构建完成后查看镜像# docker images
4.2.2.4 创建并启动容器 并 访问
先停止commit自定义提交的镜像tomcat02# docker stop tomcat02
创建并启动容器# docker run -itd -p8080:8080 --name tomcat03 tomcat:8.5.73-jdk8-kh96
通过服务器映射端口,访问docker容器tomcat
4.2.3 Dockerfile构建jdk+Springboot项目镜像
4.2.3.1 资源添加
创建一个目录存放资源# mkdir Dockerfile-springbootProject
把项目jar包放到 Dockerfile-springbootProject 的目录下面
4.2.3.2 编辑Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
4.2.3.3 执行构建命令构建(jdk+Springboot)服务镜像
构建镜像 # docker build -t springboot:jdk8-springboot .
构建完成后查看镜像# docker images
4.2.3.4 创建并启动容器
创建并启动容器# docker run -itd -p8080:8080 --name springboot01 springboot:jdk8-springboot
查看容器# dockers ps
4.2.3.5 postman访问请求
5、挂载共享数据
5.1 挂载测试
5.1.1 创建容器并指定挂载路径
语法# -v [宿主机路径]:[镜像路径]
创建容器mysql03
将 宿 主 机 的/usr/local/kh96/docker/mount-test
挂载到
容器mysql03的/usr/local/kh96/docker/mount-test
主要命令# -v /usr/local/kh96/docker/mount-test:/usr/local/kh96/docker/mount-test
完整命令
# docker run -itd --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 -v /usr/local/kh96/docker/mount-test:/usr/local/kh96/docker/mount-test mysql:5.7.30
查看容器#docker ps
5.1.2 查看挂载信息
查看容器详细信息# docker inspect mysql03
5.1.3 修改测试
5.1.3.1 宿主机:
修改宿主机上的内容后:
5.1.3.2 容器:
查看容器上的内容也发生了变化
5.1.4 停止容器后,修改宿主机上的内容
5.1.4.1 宿主机:
5.1.4.2 容器:
5.1.4.3 总结
关闭容器后,修改数据也会同步。
5.2 挂载宿主机mysql 数据和配置文件 到mysql容器 (想错了)
5.2.1 错误
5.2.1.1 mysql:Job for mysqld.service failed because the control process exited with error
#本来想挂载配置文件和数据文件
# 使用一下命令
docker run -itd --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 -v /etc/my.cnf:/etc/my.cnf -v /var/lib/mysql:/var/lib/mysql mysql:5.7.30
# 但是创建容器后无法启动;
# 后面就只挂载了mysql数据文件
docker run -itd --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 -v /var/lib/mysql:/var/lib/mysql mysql:5.7.30
#容器myslq03可以正常启动,远程也可以正常连接,但是宿主机上的mysql无法启动了;
报错信息#mysql:Job for mysqld.service failed because the control process exited with error
后面一直根据查询网上的解决方法都没有解决;
5.2.1.2 InnoDB: The innodb_system data file 'ibdata1' must be writable
最后看十查看mysql的错误日志,然后根据
错误日志# InnoDB: The innodb_system data file 'ibdata1' must be writable
查到解决方式# chmod -R 777 /var/lib/mysql
解决问题博客原文连接:
https://blog.csdn.net/weixin_40744265/article/details/91398308
https://blog.csdn.net/saywhat_sayhello/article/details/81294687
后面突然理解错了,我以为是将宿主机的配置文件和数据挂进去然后进行数据的同步;
5.3 将mysql03容器的配置文件 和 数据文件 挂载到宿主机 备份 (正确思路)
# 创建两个文件夹,存放容器的配置文件和数据文件
mkdir /usr/local/kh96/docker/mount-mysql03/conf
mkdir /usr/local/kh96/docker/mount-mysql03/data
# 创建并mysql03容器并挂载 配置文件和数据文件到 宿主机
docker run -itd --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 -v /usr/local/kh96/docker/mount-mysql03/conf:/etc/mysql/conf.d -v /usr/local/kh96/docker/mount-mysql03/data:/var/lib/mysql mysql:5.7.30
# 创建并运行成功,远程连接成功;
5.3.1 远程连接:
5.3.2 宿主机上存在容器mysql03的文件:
5.3.3 容器mysql03中的文件:
5.3.4 查看挂载信息
查看容器详细信息# docker inspect mysql03
5.4 匿名挂载,具名挂载,指定路径挂载
5.4.1 匿名挂载
匿名挂载# -v 容器内路径
没有写宿主机上的地址,会放在 /var/lib/docker/volumes 下
5.4.1.1 匿名挂载mysql02
docker run -itd --name mysql02 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -v /var/lib/mysql mysql:5.7.30
5.4.1.2 查看容器的挂载信息
查看容器详细信息# docker inspect mysql02
5.4.1.3 查看数据卷信息
查看所有的数据卷# docker volume ls
5.4.2 具名挂载
具名挂载#-v 卷名:容器内路径
没有写宿主机上的地址,会放在 /var/lib/docker/volumes 下
5.4.2.1 具名挂载 mysql02
docker run -itd --name mysql02 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -v mysql02-volume:/var/lib/mysql mysql:5.7.30
5.4.2.2 查看容器的挂载信息
查看容器mysql02的详细信息# docker inspect mysql02
5.4.2.3 查看数据卷的信息
查看所有的数据卷# docker volume ls
5.4.3 指定路径挂载
指定路径挂载# -v /宿主机路径:容器内路径:读写权限
读写权限:
rw :可读可写的权限
ro : 可读权限
5.4.3.1 指定路径挂载mysq03
5.3 的mysql03 挂载就是指定路径挂载
docker run -itd --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 -v /usr/local/kh96/docker/mount-mysql03/conf:/etc/mysql/conf.d -v /usr/local/kh96/docker/mount-mysql03/data:/var/lib/mysql mysql:5.7.30
5.4.3.2 查看容器的挂载信息
查看容器mysql03的详细信息# docker inspect mysql03
5.4.3.3 查看数据卷的信息
查看所有的数据卷# docker volume ls
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data 下,如果指定了目录,docker volume ls 是查看不到的。
5.4.4 数据卷删除
挂载在宿主上的数据卷不会自动删除,容器删除后,数据卷任然存在;需要手动删除;
5.4.4.1 查询所有没有被使用的数据卷
# 删除容器 mysql02
# 两次操作,存在个 mysql02的数据卷
# docker volume ls --filter dangling=true
5.4.4.2 删除数据卷
docker volume rm docker volume rm mysql02-volume c5e4ad96bc9eef3ffb987fdf930848c35284e5dc5f20ffe77ed850fc47647bf5
6、Docker常用命令
attach # 当前shell下 attach连接指定运行的镜像
build # 通过Dockerfile定制镜像
commit # 提交当前容器为新的镜像
cp # 拷贝文件
create # 创建一个新的容器
diff # 查看docker容器的变化
events # 从服务获取容器实时时间
exec # 在运行中的容器上运行命令
export # 导出容器文件系统作为一个tar归档文件[对应import]
history # 展示一个镜像形成历史
images # 列出系统当前的镜像
import # 从tar包中导入内容创建一个文件系统镜像
info # 显示全系统信息
inspect # 查看容器详细信息
kill # kill指定docker容器
load # 从一个tar包或标准输入中加载一个镜像[对应save]
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start # 启动容器
stats Display a live stream of container(s) resource usage statistics
stop # 停止容器
tag # 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
update Update configuration of one or more containers
version # 查看 docker版本号
wait # 截取容器停止时的退出状态值