- Docker
- 一、Docker安装
- 1、Docker的基本组成
- 2、Docker常用命令
- 3、可视化
- 4、commit镜像
- 二、容器数据卷
- 1、使用数据卷
- (1)方式一:直接使用命令挂载 -v
- 实战训练:安装MySQL
- 具名挂载和匿名挂载
- 2、初始Dockerfile
- (2)方式二:使用DockerFile(常用)
- 3、数据卷容器
- 三、DockerFile
- 1、DockerFile介绍
- 2、DockerFile构建过程
- 基础知识
- 3、DockerFile的指令
- 实战测试:创建一个自己的centos
- 实战测试:Tomcat镜像
- 四、Docker网络
- 镜像(image):docker镜像就像是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器,最终服务运行或者项目运行都在容器中
- 容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建,可以把容器理解为简易的linux系统
- 仓库(repository):仓库是存放镜像的地方,分为私有仓库,公有仓库
-
帮助命令
docker version #查看版本信息 docker info #查看系统信息,包括镜像和容器的数量 docker 命令 ——help #帮助命令
-
镜像命令
docker images #查看所有本地主机上的镜像 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB REPOSITORY #镜像的仓库源 TAG #镜像的标签 IMAGE ID #镜像的id CREATED #镜像的创建时间 SIZE #镜像的大小 #可选项 -a, --all #列出所有镜像 -q, --quiet #只显示id
docker search #搜索镜像
docker pull #下载镜像
docker rmi #删除镜像 #可选项 docker rmi -f 容器id #删除指定的容器 docker rmi -f 容器id 容器id 容器id 容器id #删除多个容器 docker rmi -f $(docker images -aq) #删除全部容器
-
容器命令
说明:有了镜像才能有容器,linux,下载一个centos镜像测试学习
#创建容器并启动 docker run [可选参数] image #参数说明 --name="Name" #容器名字 tomcat01 tomcat02 ,用来区分容器 -d #后台方式运行 -it #使用交互方式运行,进入容器查看内容 -P #指定容器端口 -p 8080:8080 -P ip:主机端口:容器端口 -P 主机端口:容器端口 (常用) -P 容器端口 容器端口 -p #随机指定端口
#测试 #启动并进入容器 [root@iZ8vbis43wevef6250tlrhZ ~]# docker run -it centos /bin/bash #查看容器内的centos,基础版本,很多命令不完善 [root@0ff4aea98961 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var #退出容器 [root@0ff4aea98961 /]# exit exit
#列出所有运行的容器 docker ps #列出当前正在运行的容器 #可选项 docker ps -a #列出正在运行的容器+历史运行过的容器 docker ps -n=? #显示最近创建的容器 docker ps -q #只显示容器的编号
#退出容器 exit #直接退出容器并停止 Ctrl + P + Q #容器不停止并退出
#删除容器 docker rm 容器id #删除指定容器(不能删除正在运行的容器) 强制删除 rm -f docker rm -f $(docker ps -aq) #删除所有容器 docker ps -a -q|xargs docker rm #删除所有容器
#启动和停止容器的操作 docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
-
常用的其他命令
#命令 docker run -d 镜像名 docker run -d centos #问题 docker ps 发现centos停止了 #常见的坑:docker 容器使用后台运行,就必须要有一前台进程,docker发现没有应用,就会自动停止
#查看日志 #自己编写一个shell脚本 [root@iZ8vbis43wevef6250tlrhZ ~]# docker run -d centos /bin/sh -c "while true;do echo genius;sleep 1;done" #[root@iZ8vbis43wevef6250tlrhZ ~]# docker ps ConTAINER ID IMAGE 4bf285b338b5 centos #显示日志 -tf #显示日志 --tail #要显示的日志条数 [root@iZ8vbis43wevef6250tlrhZ ~]# docker logs -tf --tail 10 4bf285b338b5
#查看容器中进程信息 docker top 容器id
#查看镜像的元数据 docker inspect 容器id
#进入当前正在运行的容器 docker exec -it 容器id /bin/bash #方式一 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach 容器id #方式二 进入正在运行的终端,不会启动新的终端
#从容器内拷贝文件到主机上 docker cp 容器id:容器内路径 目的的主机路径 [root@iZ8vbis43wevef6250tlrhZ home]# docker run -it centos /bin/bash #运行一个容器 [root@3db61aeb88c1 /]# cd /home [root@3db61aeb88c1 home]# touch test.java #在docker中创建test.java文件 [root@iZ8vbis43wevef6250tlrhZ home]# docker cp 3db61aeb88c1:/home/test.java /home #docker拷贝文件到主机 [root@iZ8vbis43wevef6250tlrhZ home]# ls #拷贝成功 librarty_management.jar nohup.out test.java www
Docker图形化管理页面( portainer)
#下载 docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer4、commit镜像
docker commit 提交容器成为一个新的副本
#命令和git原理类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]二、容器数据卷
-
什么是容器数据卷
-
docker理念:将应用和环境打包成一个镜像
-
如果数据在容器中,那么我们容器删除,数据就回丢失
需求:数据可持久化
-
docker容器中产生的数据,同步到本地
-
目录的挂载,将容器内的目录,挂载到Linux上面
-
容器的持久化和同步操作,容器间可以数据共享
-
docker run -it -v 主机目录地址:容器内目录
#挂载信息 -v 卷
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi", #主机内地址
"Destination": "/home", #docker容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
数据同步(容器 <==> 主机)
实战训练:安装MySQL-
获取镜像
docker pull mysql:5.7
-
运行容器,需要做数据挂载
docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql
-
安装启动MySql,需要配置密码
#官方测试 docker run --name 数据库名称 -e MYSQL_ROOT_PASSWORD=密码 -d mysql:tag docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d #后台运行 -p #端口映射 -v #卷挂载 -e #环境配置 --name #容器名字
-
匿名挂载
-v 容器内地址 docker run -d -P --name naginx01 -v /ect/nginx nginx #查看所有的volume的情况 [root@iZ8vbis43wevef6250tlrhZ home]# docker volume ls DRIVER VOLUME NAME local b45807a6b7f000c44f440150bf5b5fae28fca90f323ebe19cd0ebae0a56bd695 #匿名挂载 在-v的时候只写了容器内路径,没有写容器外的路径
-
具名挂载
大多数情况下推荐使用就具名挂载
#具名挂载 docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx/ nginx #查看所有的volume的情况 [root@iZ8vbis43wevef6250tlrhZ data]# docker volume ls DRIVER VOLUME NAME local b45807a6b7f000c44f440150bf5b5fae28fca90f323ebe19cd0ebae0a56bd695 #匿名挂载 local jumin-nginx #具名挂载 #通过 -v 卷名:容器内路径 查看卷 [root@iZ8vbis43wevef6250tlrhZ data]# docker volume inspect jumin-nginx [ { "CreatedAt": "2021-11-05T20:57:48+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/jumin-nginx/_data", #卷路径 "Name": "jumin-nginx", "Options": null, "Scope": "local" } ] #所有的docker容器内的卷,没有指定目录的情况下都在 "/var/lib/docker/volumes/jumin-nginx/_data" -
区分具名挂载,匿名挂载,指定路径挂载
-v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载
-
拓展
#通过-v 容器内路径:ro rw 改变读写权限 ro readonly #只读(只能通过宿主机来操作,容器内无法操作) rw readwrite #可读可写 #一旦设置了容器权限,容器对我们挂载出来的内容就有了限定 docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx:rw nginx
- Dockerfile就是用来构建docker镜像的文件,命令脚本
- 通过脚本可以生成镜像,镜像就是一层一层的,脚本一个个的命令,每个命令就是一层
vim dockerfile1
#创建一个dockerfile文件 名字可以随意,建议使用Dockerfile #文件中的内容 指令(大写) 参数 FROM centos VOLUME ["volume01","volume02"] #匿名挂载 CMD echo "----end----" CMD /bin/bash #这里每个命令 就是镜像的一层
docker build -f /home/docker-test-volume/dockerfile1 -t genius/centos1.0 . # 文件路径 镜像名称 [root@iZ8vbis43wevef6250tlrhZ docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE genius/centos1.0 latest e09cdff19b0c 9 minutes ago 231MB
#启动容器 [root@iZ8vbis43wevef6250tlrhZ docker-test-volume]# docker run -it e09cdff19b0c /bin/bash [root@145ebb74b3cb /]# ls -l ........ drwxr-xr-x 2 root root 4096 Nov 6 02:18 volume01 #生成镜像自动挂载的数据卷目录 drwxr-xr-x 2 root root 4096 Nov 6 02:18 volume023、数据卷容器
- 多个mysql同步数据
#创建并运行容器docker01 docker run -it --name docker01 e09cdff19b0c #创建并运行容器docker01 挂载到docker01 # son extend father(docker01 就是数据卷容器) docker run -it --name docker02 --volumes-from docker01 e09cdff19b0c
- 删除docker01容器,docker01文件依旧在
- 共享卷是一种拷贝的概念
docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3355:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
-
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,本地的数据是不会删除的
- DockerFile是用来构建docker镜像的文件,命令参数脚本
- 构建步骤
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run运行镜像
- docker push发布镜像
-
每个保留关键字(指令)都必须是大写字母
-
执行从上到下顺序执行
-
#表示注解
-
每一个指令都会创建一个新的镜像层,并提交
-
步骤:开发,部署,运围
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的,姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤:tomcat镜像,添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOST # 暴露端口位置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令 onBUILD # 当构建一个被继承 DockerFile 的时候,运行。触发指令 COPY # 类似ADD,将文件拷贝到镜像中 ENV # 构建的时候设置环境变量实战测试:创建一个自己的centos
-
创建一个自己的centos
-
编写配置文件
#编写配置文件 FROM centos MAINTAINER genius<2629425320@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash
-
通过这个文件构建镜像
docker bild -f dockerfile文件路径 -t 镜像名:[tag] Successfully built e2749f018b27 Successfully tagged mycentos:0.1
-
测试运行
[root@iZ8vbis43wevef6250tlrhZ dockerfile]# docker run -it e2749f018b27 [root@5d5995c57143 local]# pwd /usr/local
-
CMD 和 ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令
CMD后面不能追加命令,CMD 的追加命令会覆盖CMD的命令
ENTRYPOINT的追加命令直接拼接再ENTRYPOINT命令后面
-
准备镜像文件tomcat压缩包,jdk压缩包
-
编写Dockerfile文件,官方命名,build会自动寻找这个文件,不需要-f指定了
FROM centos MAINTAINER genius<2629425320@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.48-linux.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0/bin/logs/catalina.out
-
构建镜像
docker build -t mytomcat .
-
启动镜像
docker run -d -p 3344:8080 --name geniustomcat -v /home/genius/build/tomcat/test:/usr/local/apache-tomcat-9.0/webapps/test -v /home/genius/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0/logs mytomcat mytomcat
-
发布项目
挂载到了/home/genius/build/tomcat/test,直接将项目文件放入即可
日志挂载到/home/genius/build/tomcat/tomcatlogs/,可直接查看
-
理解Docker网络
[root@iZ8vbis43wevef6250tlrhZ ~]# ip addr # 本机回环地址 1: lo:
mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #阿里云内网地址 2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:08:fe:d8 brd ff:ff:ff:ff:ff:ff inet 172.18.142.46/20 brd 172.18.143.255 scope global dynamic eth0 valid_lft 314952895sec preferred_lft 314952895sec inet6 fe80::216:3eff:fe08:fed8/64 scope link valid_lft forever preferred_lft forever #docker0地址 3: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:7b:b0:12:93 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:7bff:feb0:1293/64 scope link valid_lft forever preferred_lft forever 三个网络代表了三种不同的环境



