赞
踩
Docker文档中心: Docker Documentation | Docker Documentation
Docker商店: Docker Hub
Docker为什么出现?
一款产品:开发-上线 两套环境,各不相同,维护麻烦!
开发--运维 开发在自己的电脑上运行良好,然后把项目打成jar包或是war包,丢给运维,运维需要配置各种环境,各种集群,压力超大,而且还很有可能失败!
版本更新,导致服务不可用!
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是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 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操作详细图解
- #1、搜索镜像
- docker search nginx
- #2、拉取镜像
- docker pull nginx
- #3、启动容器
- docker run -d --name nginx01 -p 3304:80 nginx
- ps:3304是主机端口,暴露给外部访问,80是容器内部的端口
端口暴露的概念:
思考问题:我们每次改动nginx配置文件,都要进入容器内部?十分的麻烦,我们可以在容器外提供一个映射路径,达到在容器外修改,容器内就能修改? -v 数据卷
- #官方使用
- 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?思考网络如何才能连接过去!
镜像是一层一层的,我们从商店中pull一个应用到本地,它是一层一层下载的,镜像就是这种有很多层叠加而来的
镜像不但包含了软件包本身,还包含了其所需运行环境,各种配置,所以镜像只需要启动就可以使用了,免去了以前安装软件时,各种安装依赖、修改配置等繁琐的工作
加载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
- #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
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
Dokerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
编写一个dockerfile文件
docker build构建一个镜像
docker run运行镜像
docker push发布镜像(DockerHub、阿里云镜像仓库)
基础知识:
每个保留关键字(指令)都必须是大写字母
执行从上到下执行
#表示注释
每一个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,发布项目镜像给下游!
Docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发、部署、运维。。。缺一不可!
Dockerfile:构建文件,定义了一切的步骤,源代码
DockerImage:通过Dockerfile构建生成的镜像,最终发布和运行的产品(以前是jar和war包)
Docker容器:容器就是镜像运行起来提供服务
实战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时光
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。