Docker
1. 概述
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 -
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
2. Docker基本组成
-
镜像 ? docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。 -
容器 ? Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。 ? 目前就可以把这个容器理解为就是一个简易的 Linux系统。 -
仓库 ? 仓库就是存放镜像的地方
3. 常用命令
1. 帮助命令
docker version
docker info
docker 命令 --help
2. 镜像命令
docker images
docker search 搜索镜像
docker pull 下载镜像 docker image pull
docker rmi 删除镜像 docker image rm
3. 容器命令
docker run 镜像id 新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id 删除指定容器
docker start 容器id
docker restart容器id
docker stop 容器id
docker kill 容器id
4. 常用其他命令
docker run -d 镜像名 后台启动命令
docker logs -t --tail n 容器id 查看n行日志
docker top 容器id 查看容器进程信息ps
docker inspect 容器id 查看镜像的元数据
docker exec -it 容器id bashshell 进入当前正在运行的容器
docker attach 容器id 进入当前正在运行的容器
docker cp 容器id:容器内路径 主机目的路径 从容器内拷贝到主机上
-
docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用) -
docker attach # 进入容器正在执行的终端
5. 练习
docker search nginx
docker pull nginx
docker ps
docker run -d --name -p 3344:80 nginx
curl localhost:3344
查看正在运行的容器
进入docker容器
docker exec -it aa4bea3a7d1d /bin/bash
exit
通过网站访问
部署成功!
4. Docker 镜像
1. 镜像加载原理
-
镜像是什么 ? 镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某 个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。 ? 将所有的应用和环境,直接打包为docker镜像,就可以直接运行。 -
Unions(联合文件系统) ? Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应 用镜像。 ? 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 -
Docker镜像加载原理 ? docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。 ? boots(boot file system), Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。 ? rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。 由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs;
虚拟机是分钟级别,容器是秒级!
2. 分层理解
? 下载资源的时候,可以看到是一层层的在下载。
3. commit镜像
? 所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。
docker commit 提交容器成为一个新的副本
docker commit -m="描述信息" -a=“作者” 容器id 目标镜像名:[TAG]
- 实例 - 修改tomcat镜像包,并commit生成新的镜像包
docker run -d -p 8080:8080 tomcat
docker exec -it 容器id
cd -r wedapps.dist/* webapps
exit
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
docker commit -a=“kuangcheng” -m=“add webapps app” 291391e6d02c tomcat02:1.0
5. 数据卷
1. 什么是数据卷
-
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化; -
MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地! -
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面! -
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
2. 使用数据卷
**docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口 **
docker run -it -v /home/ceshi:/home centos /bin/bash -p 8080:8080
3. 实战:安装MySQL
# 获取mysql镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
# 参考官网hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动我们得
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
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=123456 --name mysql01 mysql:5.7
实现了容器数据持久化的功能。
4. 具名和匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx
docker volume ls DRIVER VOLUME NAME local 33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d local
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data下
如果指定了目录,docker volume ls 是查看不到的。
-v 容器内路径
-v 卷名:容器内路径
-v /宿主机路径:容器内路径
ro
rw
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
5. 数据容器卷
--volumes-from
? ~ 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=123456 --name mysql01 mysql:5.7 ? ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
6. Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件
1. 创建自己的镜像centos
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
docker build -f dockerfile1 -t centos_kc
docker inspect 容器id
2. Docker常用指令
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
FROM
MAINTAINER
RUN
ADD
WORKDIR
VOLUME
EXPOSE
CMD
ENTRYPOINT
ONBUILD
COPY
ENV
3 .实战 创建自己的centos
原先的centos,没有基本的vim、ipconfig指令
创建自己的centos
vim mydockerfile-centos
FROM centos
MAINTAINER cheng<1204598429@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 build -f mydockerfile-centos -t mycentos:0.1 .
docker images
docker run -it --name mycentos mycentos:0.1 /bin/bash
CMD
ENTRYPOINT
4. 实战:Tomcat镜像
自己写一个Tomcat镜像,并提交
-
准备镜像文件 准备tomcat 和 jdk到当前目录,编写好README 。 -
编写dockerfile
FROM centos
MAINTAINER cheng<1204598429@qq.com>
COPY README /usr/local/README
ADD jdk-8u231-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.35.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_231
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache- tomcat-9.0.35/logs/catalina.out
- 构建镜像
docker build -t mytomcat:0.1 .
- run镜像
docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test - v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
-
访问访问测试 -
发布项目
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
5. 发布自己的镜像
1. docker公共仓库
- 注册 https://hub.docker.com/
- 登录
docker login -u username -p password
- 提交镜像
docker push mytomcat
注意:
docker build -t chengcoder/mytomcat:0.1 .
docker tag 容器id chengcoder/mytomcat:1.0
2. 阿里云镜像服务
容器镜像服务 (aliyun.com)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mnq0xbyY-1626355538067)(问题总结.assets/image-20210715212418067.png)]
|