文章目录
- docker镜像命令
- docker 容器命令
- docker run [可选参数] 镜像名 新建一个容器并启动
- docker stop containerId 停止一个容器
- exit 退出container
- docker rm 删除容器
- 常规命令
- docker logs containerId 打印日志
- 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 分层原理
- Commit自己的镜像
- 容器数据卷
- 具名挂载、匿名挂载、指定目录挂载
- Dockerfile
- 数据卷容器
- 把镜像发布到Docker Hub上
- Docker 总结图
- Docker 网络
- Docker Compose(未完待续)
- Docker Swarm(未完待续)
- CI/CD之Jenkins(未完待续)
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能够连通