Docker

Docker主要用于简化部署- 一次部署成功 通过相同的模板命令 compose , 或者单纯的cmd命令可以处处运行成功 方便集群部署

运行环境CentOs 7.9

用yum的话最好更改下国内的镜像的yum源

yum源更改的博客

安装配置

//安装

yum install -y docker  

//启动

systemctl start docker

systemctl start docker.service

//设置为开机自启动

systemctl enable docker

更换阿里云镜像

touch /etc/docker/daemon.json

vi /etc/docker/daemon.json

默认没有这个文件,需要先自己创建

{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload   //重新加载配置文件

 sudo systemctl restart docker    //重启docker

管理镜像

查找:

docker seach 仓库名;   //在官方仓库注册中心上查找镜像
docker pull 仓库名:标签;  //如docker pull centos:7就会自动获取centos7最新的版本(标签一般是版本号),如果要指定版本需要的官方网站hub.docker.com去查看
标签最好别用lastes , 可能并不是最新的版本, 也有可能拉到很早很早以前的版本 (看维护者更新的情况)
删除:

docker rmi 仓库名:标签;    //或者docker rmi 镜像ID

docker rmi $(docker images -q)  //删除所有镜像
查看:

docker images  //查看本地所有镜像
导入导出:

导出:docker save repository:tag/imageld> /opt/保存名字.tar.gz   //导出到宿主机opt目录下

导入:docker load</opt/保存名字.tar.gz
制作一个springboot项目的镜像
打包出 springboot项目的 .jar文件
新建一个文本名为Dockerfile,去掉扩展名;

Dockerfile
FROM openjdk:8
ADD *.jar app.jar
EXPOSE 9090
ENTRYPOINT ["java","-jar","/app.jar"]

然后用命令:docker build -f dockerfile文件路径 -t 镜像名:[tag]
docker build -f Dockerfile -t mySpringbootDemo:0.1

//打包好的docker的镜像文件存放在/var/lib/docker文件夹中。

or        
直接用mvn spring-boot:build-image

DockertFile命令

FROM        # 基础镜像,一切从这里开始构建
MAINTAINER    # 镜像是谁写的:姓名+邮箱
RUN            # 镜像构建的时候需要运行的命令
ADD            # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR        # 镜像的工作目录
VOLUME        # 挂载的目录
EXPOSE        # 暴露端口配置
CMD            # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD        # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY        # 类似ADD,将我们文件拷贝到镜像中
ENV            # 构建的时候设置环境变量!

操作容器

创建容器
docker run -d --name 容器名 repository:tag
//或者docker run-d--name 容器名 imagelD

启动容器
docker start 容器名

进入容器
docker exec -it 容器名 /bin/bash   //进入正在运行的容器
exit //退出交互页面

停止容器
docker stop 容器名/或id

查看容器
docker ps   //查看正在运行的容器
# 命令参数可选项
-a        # 列出当前正在运行的容器+历史运行过的容器
-n=?    # 显示最近创建的容器(可以指定显示几条,比如-n=1)
-q        # 只显示容器的编号

docker ps -a   //查看所有的容器

docker inspect 容器名  //查看容器内部基本信息 包含挂载卷等

删除容器
docker rm 容器名

docker rm 'docker ps -a -q'  //删除所有容器

文件复制
cp /opt/1.txt 容器名:/mysql/bin     //复制宿主机文件1.txt到容器的mysql/bin目录里面

docker cp 容器id:容器内路径 目的主机的路径

查看日志
 docker logs -tf  容器id
 -tf                        # 显示日志
--tail number    # 要显示的日志条数

数据卷

docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash
# 测试,查看容器信息
docker inspect 容器id

mounts  加载的文件系统
source 是源地址  就是 当前你这个docker里面的地址目录
destination 是 这个容器的目录


# 匿名挂载
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
docker volume ls
DRIVER    VOLUME NAME
local     964b8e505f12f65fb23fd21f05cfa9ecd6c2c6b2ca89c0e44f168bb017dfabd6
# 这种就是匿名挂载:我们在-v挂载目录时,只写了容器内的路径,没有写容器外的路径。

# 具名挂载
[root@JWei_0124 ~]# docker run -d -p 3344:80 --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@JWei_0124 home]# docker volume ls
DRIVER    VOLUME NAME
local     1be3512d772b7af8543c35141d5bbbfe29549dabf0babb7ce8693833387de41d
local     58ba3799ae59416c2b34d0672dfa848d158006f840bdb28b41ed463ed0a15599

其实很多卷是可以复用的, 也就是说可以挂载到宿主机的同一目录下

-v 容器内的路径                # 匿名挂载
-v 卷名:容器内的路径        # 具名挂载
-v /宿主机路径:容器内路径    # 指定路径挂载

前两者挂载的宿主机目录在docker的目录下
后者可以指定目录

有点类似分区的时候的挂载?
用mount命令挂载/dev/sda1 到 /

--volumens-from 容器名 可以实现共享另一个容器的数据卷
且可以复用多个,然后这多个互相挂载的数据卷会相互覆盖
也可与-v共用增加挂载数据卷

网络

用的网络的块内容不多,只需要了解172.17.0.1相当于VM的虚拟网卡的地址,充当路由器的角色

容器默认运行的网段也是 172.17.0.0/16

互联通信:

同一个宿主机上的多个docker容器之间如果想进行通信有三种方式:

  1. 通过使用容器的ip地址来通信【这样会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip】
  2. 通过宿主机的ip加上容器暴露出的端口号来通信【这样的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信】
  3. 通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。

使用docker --link需要注意以下几点:

  1. 使用link选项建立的容器所链接的主机需要在运行状态
  2. 使用link选项建立的容器运行时需要所链接的容器也必须是运行状态
  3. 使用link选项链接的主机ip不需要固定,因为每次新建容器都会检查所链接容器的ip,在/etc/hosts里生成新的alias 名称对应的ip

docker --link 使用了link机制后,可以通过指定的名字来和目标容器通信,这其实是通过给/etc/hosts中加入名称和IP的解析关系来实现的。

--link <name or id>:alias
name和id是源容器的name和id,alias是源容器在link下的别名。

创建一个tomcat02链接一个启动的tomcat01
docker run -d -P --name tomcat02 --link tomcat01:t1 tomcat

t1是tomcat01的主机别名

tomcat02可以通过tomcat01或者t1直接ping  tomcat01的Ip
单向指定,tomcat01不可以通过tomcat02来直接ping 

本博客大多内容整理于网络,仅用于知识点备份。

参考资料:

https://blog.csdn.net/demonXwire/article/details/128751626?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-3-128751626-blog-124292208.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-3-128751626-blog-124292208.pc_relevant_landingrelevant&utm_relevant_index=6

https://blog.csdn.net/qq_54729417/article/details/127913536

https://www.cnblogs.com/renshengdezheli/p/16640281.html

 posted on 2023-03-04 00:12    阅读(22)  评论(0编辑  收藏  举报