Docker概述
Docker文档中心: https://docs.docker.com/
Docker商店: https://hub.docker.com/
Docker为什么出现?
-
一款产品:开发-上线 两套环境,各不相同,维护麻烦!
-
开发--运维 开发在自己的电脑上运行良好,然后把项目打成jar包或是war包,丢给运维,运维需要配置各种环境,各种集群,压力超大,而且还很有可能失败!
-
版本更新,导致服务不可用!
-
Docker可以把项目和它所依赖的环境整合打包,非常方便!
-
Docker的思想就来自于集装箱,应用之间相互隔离,隔离的思想
-
Docker通过隔离机制,将服务器利用到极致
Docker安装步骤
#1、卸载旧的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2、需要安装包
yum install -y yum-utils
#3、设置镜像地址
官方地址:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
阿里云镜像地址(推荐):
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4、安装docker相关的
yum install docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
#6、判断Docker是否启动成功
docker version
#7、测试DOcker
docker run hello-world
#8、查看镜像
docker images
#9、配置 阿里云docker 镜像加速(要配置你自己的)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5mybeny2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
登录你自己的阿里云账号,找到自己的镜像加速如下图:
卸载
#1、卸载Docker Engine,CLI和Containerd软件包:
$ sudo yum remove docker-ce docker-ce-cli containerd.io
#2、主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
$ sudo rm -rf /var/lib/docker
Docker流程
Docker组成
Docker运行流程图
Docker底层原理
Docker是怎么工作的
Docker是server-client结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问
Docker-server接收到Docker-client的指令,就会去执行这个指令
Docker为什么比虚拟机快
1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
Docker的常用命令
帮助命令
docker version #查看docker版本信息
docker info #查看docker系统信息
docker --help #查看docker帮助命令
镜像命令
查询本地已有镜像:
docker images -qa #一般用这个,其中q表示显示id,a显示所有
查询商店中相关软件: docker search
docker search mysql
下载镜像
docker pull 镜像名[:tag]
删除镜像
docker rmi -f 镜像id1 镜像id2 #删除多个镜像
docker rmi -f $(docker images -qa) #删除全部镜像
容器命令
ps:我们有了镜像才能创建容器,下载一个centos镜像来学习
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字
-d 以后台方式运行
-it 使用交互方式运行,进入容器查看
-p(小p) 指定容器的端口
-p 主机端口:容器端口
-p 容器端口
-P(大p) 随机指定端口
例子:docker run -it centos /bin/bash
列出所有正在运行的容器
docker ps
没有参数查看正在运行的容器
-a 查看曾经运行过的
-n=? 显示最近创建的容器
-q 只显示容器的编号
退出容器
exit 直接容器停止并退出
ctrl+p+q 容器不停止退出
删除容器
docker rm 容器id 删除指定的容器,容器正在运行则不能删除
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 ps,发现centos停止了
#常见的坑,docker容器使用后台启动,就必须有一个前台进程,docker发现没有应用,就会自动停止
#解决办法,以这个命令启动:docker run -d -it centos /bin/bash
查看日志
docker logs -tf --tail 10 容器id
-tf 显示全部的
--tail number 显示指定条数
查看容器中进程信息
docker top 容器id
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
#方式一,进入容器开启一个新终端
docker exec -it 容器id /bin/bash
#方式二,进入容器正在执行的终端
docker attach 容器id
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
Docker操作详细图解
作业练习
Docker安装nginx
#1、搜索镜像
docker search nginx
#2、拉取镜像
docker pull nginx
#3、启动容器
docker run -d --name nginx01 -p 3304:80 nginx
ps:3304是主机端口,暴露给外部访问,80是容器内部的端口
端口暴露的概念:
思考问题:我们每次改动nginx配置文件,都要进入容器内部?十分的麻烦,我们可以在容器外提供一个映射路径,达到在容器外修改,容器内就能修改? -v 数据卷
Docker安装tomcat
#官方使用
docker run -it --rm tomcat:9.0
--rm:用完之后立即删掉
#docker启动的tomcat发现以下问题:1、Linux命令少了;2、没有webapps 3、阿里云镜像默认是最小得镜像,所有不必要的都剔除掉,保证最小的可运行环境
部署es+kibana
#es暴露的端口很多,十分耗内存
#数据一般要放到安全目录,挂载
#1、拉取镜像
docker pull elasticsearch:7.14.2
#2、创建用户自定义网络
docker network create hahanetwork
#3、运行es:
docker run --name elasticsearch --net hahanetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -d elasticsearch:7.14.2
#ps:这个启动之后超级卡,linux终端都卡住了
#docker stats 查看状态
思考:kibana连接es?思考网络如何才能连接过去!
Docker镜像
镜像是什么
-
镜像是一层一层的,我们从商店中pull一个应用到本地,它是一层一层下载的,镜像就是这种有很多层叠加而来的
-
镜像不但包含了软件包本身,还包含了其所需运行环境,各种配置,所以镜像只需要启动就可以使用了,免去了以前安装软件时,各种安装依赖、修改配置等繁琐的工作
Docker镜像加载原理
-
加载boot层,也就是引导层
-
加载root层,也就是/root ,/user这些linux目录
-
加载容器层,也就是docker本身相关的东西
#1、docker加载的底层层级能共用的就共用,比如tomcat和mysql共用了boot层
#2、docker之所以快,一是因为它的每一层都尽量精简,也就是阉割版;二是因为它不需要每次都去加载boot层,boot层加载时间是分钟级别的,容器层加载时秒级别的
-
Docker镜像都是只读的,当容器启动时,一个新的可写层被加入到镜像的顶部!
-
这一层就是我们通常所说的容器层,容器层之下都是镜像层!
commit镜像
commit镜像的意思是说把一个容器生成为一个本地镜像,并没有上传到docker商店
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
#commit镜像类似于虚拟机的快照
容器数据卷
什么是容器数据卷
docker理念回顾
-
将应用和环境打包成一个镜像!
-
数据?如果数据在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化
-
mysql,容器删了,删库跑路!需求:mysql数据可以本地存储
-
容器之间可以有一个数据共享的技术!Docker容器产生的数据,同步到本地!
-
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面!
总结:容器的持久化和同步操作,容器间的数据也是可以共享的!(可以和vue的双向绑定类比)
以后我们只需要修改本地即可,容器内会自动同步
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 本机目录:容器目录 镜像id /bin/bash
实战:同步mysql数据
#1、下载mysql
[root@localhost dockerfile]# docker pull mysql:5.7
#2、启动mysql容器
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 指定容器名字
[root@localhost dockerfile]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7
#3、在本地用navicat连接mysql,新建一个数据库test,可以在linux中和mysql容器中查看到test
[root@localhost dockerfile]# cd /home/mysql/data/
[root@localhost data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
[root@localhost data]# docker exec -it b9ff5c7b7ce7 /bin/bash
root@b9ff5c7b7ce7:/# cd /var/lib/mysql
root@b9ff5c7b7ce7:/var/lib/mysql# ls
auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem test
具名挂载和匿名挂载
docker run -d -P --name nginx01 -v [卷名:]/etc/nginx[:ro|rw] nginx
#解释:只写容器内路径,不指定本地路径,是匿名挂载,写了卷名是具名挂载,
#ro表示在容器内部只读,但在外面可以修改
#rw表示可读可写
#配置文件建议rw,数据库文件建议ro
docker volume ls
docker volume inspect 卷名
-
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volume/xxx/_data
-
我们可以通过具名挂载方便地找到我们的一个卷,大多数情况下使用具名挂载
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
方式二:使用Dockerfile
Dockerfile就是用来构建docker镜像的构建文件,是一段命令脚本
实验:编写一个Dockerfile
生成镜像命令:
docker build -f /home/docker/dockerfile01 -t 镜像名 .
#ps:最后有一个"."
数据卷容器
多个mysql同步数据!
--volumes-from
案例:多个mysql实现数据共享
[root@localhost dockerfile]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7
[root@localhost dockerfile]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=admin --name mysql02 mysql:5.7 --volumes-from mysql01
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
DockerFile
Dokerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
-
编写一个dockerfile文件
-
docker build构建一个镜像
-
docker run运行镜像
-
docker push发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
基础知识:
-
每个保留关键字(指令)都必须是大写字母
-
执行从上到下执行
-
#表示注释
-
每一个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,发布项目镜像给下游!
Docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发、部署、运维。。。缺一不可!
Dockerfile:构建文件,定义了一切的步骤,源代码
DockerImage:通过Dockerfile构建生成的镜像,最终发布和运行的产品(以前是jar和war包)
Docker容器:容器就是镜像运行起来提供服务
Dockerfile构建指令:
实战测试
实战1:创建自己的centos:
1、原始的centos没有vim和ifconfig
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 3 weeks ago 13.3kB
centos latest 5d0da3dc9764 4 weeks ago 231MB
elasticsearch 7.14.2 2abd5342ace0 4 weeks ago 1.04GB
[root@localhost dockerfile]# docker run -it centos
[root@7a61c7e92b9f /]# pwd
/
[root@7a61c7e92b9f /]# vim
bash: vim: command not found
[root@7a61c7e92b9f /]# ifconfig
bash: ifconfig: command not found
[root@7a61c7e92b9f /]# ifconfig
bash: ifconfig: command not found
2、构建dockerfile文件
[root@localhost dockerfile]# vi mydockerfile.centos
[root@localhost dockerfile]# cat mydockerfile.centos
FROM centos
MAINTAINER whw<353538982@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
ENTRYPOINT echo $MYPATH
ENTRYPOINT echo "---END---"
ENTRYPOINT /bin/bash
3、构建镜像
[root@localhost dockerfile]# docker build -f mydockerfile.centos -t mycentos:0.1 .
4、运行容器并验证
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 93cdc922f14e 43 seconds ago 336MB
hello-world latest feb5d9fea6a5 3 weeks ago 13.3kB
centos latest 5d0da3dc9764 4 weeks ago 231MB
elasticsearch 7.14.2 2abd5342ace0 4 weeks ago 1.04GB
[root@localhost dockerfile]# docker run -it mycentos:0.1 /bin/bash
[root@c8f0ff352c8a local]# pwd
/usr/local
[root@c8f0ff352c8a local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
实战2:创建自己的tomcat镜像
1、准备镜像文件tomcat压缩包、jdk压缩包
[root@localhost dockerfile]# ll
total 153428
-rw-r--r--. 1 root root 11576317 Oct 17 01:52 apache-tomcat-9.0.54.tar.gz
-rw-r--r--. 1 root root 145520298 Oct 17 01:52 jdk-8u301-linux-x64.tar.gz
-rw-r--r--. 1 root root 201 Oct 16 15:02 mydockerfile.centos
-rw-r--r--. 1 root root 550 Oct 17 02:10 mydockerfile.tomcat
2、编写Dockerfile文件
[root@localhost dockerfile]# cat mydockerfile.tomcat
#基础镜像
FROM centos
#作者
MAINTAINER whw<353538982@qq.com>
#设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
#复制文件
COPY readme.txt $MYPATH/readme.txt
#添加jdk和tomcat到容器
ADD apache-tomcat-9.0.54.tar.gz $MYPATH
ADD jdk-8u301-linux-x64.tar.gz $MYPATH
#安装vim
RUN yum -y install vim
#设置环境变量
ENV JAVA_HOME $MYPATH/jdk1.8.0_301
ENV PATH $PATH:$JAVA_HOME/bin
#暴露端口
EXPOSE 8080
#启动tomcat(注意:这里CMD建议用ENTRYPOINT代替,否则启动容器时如果后面加了命令如/bin/bash很可能不会启动tomcat)
CMD ["/usr/local/apache-tomcat-9.0.54/bin/catalina.sh","run"]
3、构建镜像
[root@localhost dockerfile]# docker build -f mydockerfile.tomcat -t mytomcat:1.0 .
4、运行镜像并验证
docker run -it -p 9090:8080 --name diytomcat mytomcat:1.0
原创不易,拒绝白嫖,请点赞和关注,微信公众号:java时光
网友评论