Docker总结

文章目录

docker镜像命令

docker images 查看本地镜像

docker images -a

docker images -q

docker search 搜索镜像

docker search mysql 搜索名字为mysql的镜像

docker search mysql --filter=STARS=3000 搜索名字为Mysql的镜像, 并且stars数>=3000

docker pull 下载镜像

docker pull mysql 下载mysql镜像, 并且是最新版

latest: Pulling from library/mysql			#分层下载  ,   联合文件系统
5ed150ed0abe: Pull complete 
0fede58e17ac: Pull complete 
994a6ddd6efe: Pull complete 
028bda79779b: Pull complete 
426fbe9e56a2: Pull complete 
1a00e58dd193: Pull complete 
4a4f64494005: Pull complete 
fba8ab3534a7: Pull complete 
2695938edf88: Pull complete 
3754e2587bed: Pull complete 
1b9f154543e7: Pull complete 
Digest: sha256:147572c972192417add6f1cf65ea33edfd44086e461a3381601b53e1662f5d15
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

docker pull mysql:5.7 下载mysql镜像,版本为5.7

docker rmi 删除镜像

docker rmi image Id 删除指定id的镜像

docker rmi -f $(docker images -aq) 删除全部的镜像

docker 容器命令

docker run [可选参数] 镜像名 新建一个容器并启动

  • -it /bin/bash 用bash进入容器
  • –name==“containerName” 设置容器名称
  • -d 后台运行 -itd可以运行

docker stop containerId 停止一个容器

docker ps 显示正在运行的容器

docker ps -a 显示全部容器

docker ps -aq 显示全部容器的id号

docker ps -n=3 显示最近创建的容器, n为个数

exit 退出container

ctrl + p + q 退出容器,但是容器后台运行

docker rm 删除容器

docker rm containerId 根据容器id删除容器

docker rm -f 强制删除

docker rm -f $(docker ps -aq) 删除全部容器

常规命令

docker start

docker restart

docker stop

docker kill

docker logs containerId 打印日志

-f 打印日志内容

-t 打印时间戳

-n number 打印指定条数的日志

docker top containerId 查看进程信息

docker inspect containerId 查看镜像元数据

docker exec -it containerId bashSheel 进入容器

docker attach containerId 进入容器正在运行的bashSheel

docker cp containerId:文件路径 主机文件路径 把容器内的文件拷贝到主机上

docker run -d --name nginx01 -p 3344:80 nginx 启动nginx, docker端口是80, 服务器端口是3344, 命名为nginx01,后台运行

Docker 分层原理

docker 下载镜像是一层一层的下载,如果已经存在某一层,那么这一层就会被下载,而是直接使用前面下载过的。这样子可以省去大量的空间,这个就是Union FS 文件联合系统。

docker的镜像是只读的,不会随着用户的操作改变,用户的操作实际上是在镜像上面新增加了一层,这就是容器层,下面就是镜像层,镜像层是不会改变的。

图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7ncASK4-1666429352594)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018163922039.png)]

Commit自己的镜像

docker commit -a=“创建人” -m=“提交信息” containerId 起的镜像名称

例子: docker commit -a=“haoshui” -m=“a new image” a000c8018500 mytomcat:1.0

注意:镜像名称中不能有大写字母

commit理解:

commit有点类似git中的commit, 是提交到自己本地的images中, 提交的时候需要用-m来写下提交注释。

容器数据卷

什么是容器数据卷:

Docker Volume

数据卷就是本地宿主的一个文件或者目录, docker 容器可以挂载这个目录或文件, 使得容器中的文件或目录和本地连通

如果删除掉容器,挂载在本地的文件不会被删除,能够保存, 这就实现了数据持久化。

同是也可以连通配置文件, 这样不需要进入容器中就可以更改配置

注意:挂载容器数据卷实际上是拷贝一份文件。

连通指令:

-v 主机目录或文件:容器文件或者目录

例子:假设要一个容器mysql, 为了简化操作,每次配置文件不需要进入mysql容器,就可以把mysql容器里的配置文件和本地做一个连通,同时为了保留数据,防止容器的丢失导致数据丢失,应当把数据库文件和本地做一个连通。

命令:

docker dun -d -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3310:3306 --name mysql01 mysql

解析:

第一个 -v 命令把 mysql容器里 路径为 /etc/mysql/conf.d 这一文件路径 和 本地的 /home/mysql/config 做了一个连通。 这样就可以在本地配置mysql相关配置。

第二个 -v 命令把 mysql容器里 路径为 /var/lib/mysql 这一文件路径 和 本地的 /home/mysql/data 做了一个连通。 这样就可以保证当这个mysql容器被删除时,mysql里的数据库还保存在本地。

-e 命令用来配置mysql的登录密码, 此命令中设置为123456 。

-p 命令用来配置容器端口 和 主机端口的映射,第一个端口号为主机端口号, 第二个端口号为mysql容器的端口号, 这样就可以通过访问主机的3310端口 来访问mysql容器的3306端口,即数据库端口。

–name mysql01 给容器起了一个名字, mysql01

mysql 镜像名称,如果有版本号,那么就写成mysql:5.7这种格式

图解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkdSAwIu-1666429352596)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018211738547.png)]

文件中查看连通配置:

使用命令 docker inspect containerId

docker inspect f2045fa4e648


//在结果中有一块配置如下,这就是连通后增加的配置
            "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/mysql/data",				//本地文件位置
                "Destination": "/var/lib/mysql",			//容器内文件位置
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/home/mysql/config",
                "Destination": "/etc/mysql/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

容器数据卷好处:

  • 能够方便配置环境,不需要频繁进入容配置
  • 能够保存数据,实现了容器数据持久化。

具名挂载、匿名挂载、指定目录挂载

指定目录挂载:

就是之前的指令 -v 主机文件或者路径:容器文件或者路径

如 : -v /home/mysql/data:/var/lib/mysql

具名挂载:

也是 -v指令, 只不过这次并没有指定主机上的路径,而是只给出了一个名称,这样的话机器就不知道要把这个挂载文件创建在哪了,于是就创建在了docker的工作目录里

可以先创建一个具名挂载,然后查看配置文件找到默认的目录在哪里

操作如下:

docker run -P -v J-nginx:/var/etc/nginx nginx

创建一个具名挂载,叫做J-nginx

通过命令

docker volume ls 查看卷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PViMn9Ym-1666429352597)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018220041760.png)]

结果就是这个

然后通过 指令查看挂载卷的信息

docker volume inspect J-nginx

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2O50B03-1666429352598)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018220217176.png)]

可以看到一个路径,那就是docker的工作路径,创建的具名挂载都存在那里

进入这个目录,就可以看到自己的具名挂载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9jvXeKd-1666429352599)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018220416658.png)]

匿名挂载:

实际上就是在具名挂载的基础上更加偷懒, 连一个名字都不给定义了,

例如 -v /etc/nginx 就是一个匿名挂载,挂载需要的主机目录, 具体名称都没有给出,这样就是匿名的,名称是一串字符, 依然存放在docker工作目录的volumes路径下,和具名挂载的存放目录相同

实验:

docker run -P -v /etc/nginx nginx 创建一个nginx容器,并且用匿名挂载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmG96M3p-1666429352601)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221018220954915.png)]

可以和上面的图作比较,可以发现volumes目录多了一个文件夹,这个就是那个匿名挂载的卷。

Dockerfile

作用:

用于编写一个镜像:

步骤:

1、编写Dockerfile:

FROM centos
  
VOLUME ["volume1", "volmue2"]

CMD echo "--------end-------"
CMD /bin/bash

这个镜像是一个centos

2、docker build 命令, 构建镜像:

docekr build -f 这个文件的目录 -t 生成镜像的名称 .

注意最后要添加一个点

例子: dockerfile 文件所在路径为home/dockerfile/centos-docker-file, 目标名称为hs/centos . ,如果要指定版本,可以在名称后面添加:版本

docker build -f /home/dockerfile/centos-docker-file  -t hs/centos .

3、现在就成功创建了一个镜像,通过docker images 命令就可以查看。

4、docker push 命令上传镜像

构建Dockerfile

Dockerfile文件的基本语法规则:

所有指令必须大写

#代表注释

指令格式为 指令 + 参数

Dockerfile 固定命令:

FROM 基础系统

RUN 安装程序包

ENTRYPOINT 执行命令,并且可以追加

CMD [] 执行命令,如果外部有命令,那么就会被覆盖,只有最后一个cmd’命令会被执行

ENV 设置环境变量

EXPOSE 暴露给外部的端口

VOLUME [ ] 添加数据卷容器

例子:

编写一个Dockerfile,文件的名字就叫做这个,这样的话在 这个目录下运行docker build 不用指定文件位置

FROM centosy													#centos作为镜像基础
MAINTAINER haoshui<1654067927@qq.com>							#作者名字和联系邮箱

COPY readme.txt /usr/local/readme.txt							#复制本地的readme.txt 到镜像的指定路径

ADD jdk-8u351-linux-x64.tar.gz /usr/local						#添加jdk压缩包,会自动解压
ADD apache-tomcat-8.5.83.tar.gz /usr/local						#添加tomcat压缩包,自动解压

Run yum -y install vim											#安装vim

EXPOSE 8080														#暴露端口8080

ENV MYPATH /usr/local											#配置环境变量
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_351
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.83
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.83
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

CMD /usr/local/apache-tomcat-8.5.83/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.83/bin/logs/catalina.log

然后运行指令 docker build -t tomcat01 .

就可以创建一个 名字为tomcat01 的镜像

数据卷容器

定义:

一项技术,可以使得两个或多个容器互通,互通的容器文件都是一样的,这样就可以同步数据。

已经绑定过的数据卷容器,只要还有一个容器存在,那么这一组相互绑定的容器的数据就不会丢失。

绑定过程具有传递性, 即 a绑定b , b绑定c ,那么 a 和c 也是绑定的。

数据卷容器也可以和本地文件进行绑定。 使用前面的 -v命令就可以。

命令:

在新创建一个容器的时候, 可以通过添加 --volume-from containerId 来绑定。

例子;

docker run -it --name centos03 --volumes-from 05cbd1dd295b     c29fce9cfd4d
											  已经存在的容器      镜像id

上面的命令就是新生成了一个 镜像id为 c29fce9cfd4d 的容器, 并使得这个容器和 05cbd1dd295b 容器绑定。

把镜像发布到Docker Hub上

首先要确定本地的镜像有一个版本号,如果没有,可以通过 docker tag imageId 新的名称:版本号 来更改镜像的名称和添加一个版本号。

例子

docker tag 1ccd657b6da1 haoshui/mycentos:1.0

然后就是要有一个docker hub 的账号,可以在官网注册。

在之后就是在主机上登录docker hub的账号

使用命令 docker login -u 用户名 登录

之后会弹出输入密码,输入账号的密码,回车就可以登录上去

最后只要docker push 镜像名称:版本号就可以上传上去。

例子:

docker push haoshui/mycentos:1.0

Docker 总结图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RnwToLk1-1666429352602)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221019205112727.png)]

Docker 网络

Docker 自带的3个网络:

当安装一个docker 的时候,会自动生成3个网络,可以使用docker network ls 命令查看

[root@haoshui tomcat]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a1d99edd4fe6   bridge    bridge    local
c798a18aa36f   host      host      local
51e70c43b4dc   none      null      local

这三个网络名称分别是 bridge 、host、 none

当新创建一个容器的时候,如果不指定具体的网络类型,就会默认指定容器的网络是bridge模式, 什么是bridge,后面解释,那么如何定义容器的网络。

命令: --net 网络名称

docker run -d --net host --name tomcat01 tomcat
# 新建并启动一个tomcat容器, 这个容器的名字是 tomcat01, 是后台运行的, 他的网络是host
host网络:

见名知意,host就是主机,也就是把容器桥接到主机上,所以此时容器使用的就是主机的ip,相当于直接在主机上启动的tomcat一样,不过tomcat的数据还是存在容器里面。

例子:

使用命令:

docker run -d --net host --name tomcat01 tomcat

tomcat在启动的时候,会默认打开8080端口,如果想要在外网通过主机ip:端口的方式访问tomcat, 就需要在启动的时候配置端口映射

即 : -p 主机端口:容器端口 添加这一字段才可以 例如下面的指令

docker run --name tomcat02 -d --net bridge -p 3310:8080 tomcat

启动了一个tomcat容器,名字为tomcat02, 然后设置网络为bridge(不写–net字段就会默认设置成这个), 端口映射之后可以通过访问主机的3310端口访问tomcat02。

而tomcat01不需要做端口映射,就可以直接把端口暴露在主机下,这样直接访问主机的8080端口就相当于访问了tomcat01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hw83DlzI-1666429352603)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221019234325105.png)]

下面介绍bridge

bridge:

bridge网络模式 ,就是bridge网络虚拟出来一个网络,然后网络模式是这个模式的容器就会划入到这个虚拟的网络中,这样就可以通过ip互相交流通信。但是如果外网想要访问,就要为这个容器配置端口映射。

新创建一个tomcat容器, 叫tomcat03

命令:

docker run -d --name tomcat03 --net bridge tomcat

模型图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YQ4MwRKa-1666429352604)(C:\Users\86182\AppData\Roaming\Typora\typora-user-images\image-20221020000408488.png)]

注意:这个bridge网络并不好用,我们不能通过容器名直接连接

none:

当设置为这个类型的时候,这个容器就不会有网络连接了,就是一个没有办法通过网络来进行连接。

通过-p来设置端口也不会生效

创建Docker网络:

命令: docker network create --subnet 192.168.0.0/16 --gateway 192.168.0.1 --driver bridge mynet

这样就可以创建于一个自己的docker网络, 网络的网段是192.168.0.0/16, 网关是192.168.0.1 , 名字是mynet

网络连通:

假设我们有两个网络:mynet01 、 mynet02 , mynet01里有一个容器tomcat01, mynet02里有一个容器tomcat02.

很显然, tomcat01 和 tomcat02 不在同一个网段,不能够通信, 我们可以通过把容器添加到网络的方法,使得tomcat01, 和tomcat02能够连通

命令: docker network connect [OPTIONS] NETWORK CONTAINER

Docker Compose(未完待续)

Docker Swarm(未完待续)

CI/CD之Jenkins(未完待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值