技术复盘--docker
- 资料地址
- 环境
- 初始docker
- 安装docker
- docker常用命令-都需要先启动docker
- docker容器打包为镜像
- docker坑
- docker卸载
- docker数据卷
- dockerFile构建过程
- 搭建私有仓库--非图形化界面
- 搭建私有仓库--图形化界面
- docker理论知识
资料地址
docker官网:https://www.docker.com/
docker中文网:https://docker.p2hp.com/
docker-hub官网:https://hub.docker.com/
docker-compose:https://pan.baidu.com/s/1zBg83EwPdn1fce92_CnU1w?pwd=hf01
提取码:hf01
学习地址-B站狂神:https://www.bilibili.com/video/BV1og4y1q7M4
环境
centos7
初始docker
docker作用:将内核与容器隔离,容器内放置运行的程序和环境,每一个容器之间又相互隔离。防止环境干扰,避免不必要的加载。
docker命令图解–复习专用:
特点:
- 应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker :打包镜像发布测试,一键运行 - 更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!项目打包为一个镜像,如镜像中有tomcat7 mysql5,需要升级,升级为tomcat8 mysql8后,又作为一个新的镜像。别人只需要拿到这个镜像即拿到了整个升级后的环境。 - 更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。 - 更高效的计算资源利用
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
名词解释:
- 镜像( image )
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===> run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。当然,一个镜像中通常会含有多个环境,如mysql8 tomcat8,为保证你和你的小组成员开发环境一致,你可以将这个镜像分享给你的小组成员。 - 容器( container )
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令! - 仓库
仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub (默认是国外的)阿里云…都有容器服务器
:
安装docker
官方安装教程:https://docs.docker.com/engine/install/centos/【供参考】
1.卸载旧的版本:我这儿没有旧的版本,没有的可以略过这一步骤
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.设置存储库,采用阿里的镜像进行下载
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.更新yum软件包索引
yum makecache fash
4.安装docker,版本号为19.03.8
docker-ce表示社区版,docker-ee代表企业版
docker-ce-cli-19.03.8:表示docker客户端的版本号,不指定默认为最新
sudo yum install docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
5.启动docker
sudo systemctl start docker
6.查看docker版本号:能查询出来代表安装成功
docker version
7.运行hellow-world镜像
docker run hello-world
日志解读:
Unable to find image "hello-world:latest’ locally:未找到hello-world镜像
latest: Pulling from library/hello-world:去拉取最新的hello-world镜像
Pull complete :拉取成功
Hello from Docker!
This message shows that your installation appears to be working correctly.
如果你能看见Hello from Docker!就代表docker是安装正常的
8.补充:如果是买的云服务器,还可以配置镜像加速器,能够能快的下载镜像。具体怎么操作每个云服务器厂家不同略有区别。
9.安装docker compose,这个不知道的可以先不安,也不会有太大影响。我下载了个能正常用的,在资料地址处,将其下载下来上传到/usr/local/bin目录处。下面的地址是国内镜像下载,我下载后无法正常使用。
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 使Docker Compose二进制文件可执行
sudo chmod +x /usr/local/bin/docker-compose
11.测试Docker Compose是否安装成功
docker-compose --version
docker常用命令-都需要先启动docker
注意:在docker中,镜像和容器这两者容易混淆,从docker仓库中拉去的叫镜像,把镜像拿来启动后的叫容器。本文中有些地方也对这两者混淆了。
1.启动docker,停止为stop
sudo systemctl start docker
2.查询docker版本,最好在docker启动后查看,否则查看的信息不全
docker version
3.显示docker巨详细的信息
docker info
4.查看日志
docker logs
docker镜像命令:
1.查看自己主机上的所有镜像
docker images
2.删除镜像,通常通过id删除
docker rmi -f <镜像id或名称>
3.查询docker镜像,以mysql为例
docker search mysql
4.拉取docker镜像,以mysql5.7为例,不指定版本默认为最新版
docker pull mysql:5.7
docker容器命令:
1.运行docker镜像,以hello-world为例
run命令参数:
--name="name" 容器名称
-p 指定端口[小p]
-p 容器端口:主机端口
-p 容器端口
容器端口
-P 随机端口[大p]
-d 以后台方式运行
【后台启动问题:后台启动后如果没有前台进程,就会自动停止】
-it 使用交互方式运行,可以进入容器内部
【-it需要指定个工作目录,通常为/bin/bash】
docker run hello-world
2.停止docker容器,以hello-world为例
docker stop hello-world
3.列出当前正在运行的 Docker 容器
参数
-a 列出所有docker容器,包括已暂停或退出的容器
docker ps
4.退出容器
exit
5.删除容器
参数:
-f 强制删除
docker rm <容器id>
6.启动/停止/重启/强制停止 容器
docker start <容器id>
docker stop<容器id>
docker restart<容器id>
docker kill<容器id>
7.查看容器中的进程
docker top <容器id>
8.查看容器元数据
docker inspect <容器id>
9.进入当前正在运行的容器,开辟一个新的终端
docker exec -it <容器id> <命令行,通常为/bin/bash>
10.进入当前正在运行的容器,不开辟新的终端
docker attach <容器id>
11.容器内的文件拷贝到主机
docker cp <容器id>:<容器内路径> <主机路径>
docker容器打包为镜像
1.docker容器打包为镜像,目前还未上传
#命令和git原理类似
docker commit -m="提交的描述信息." -a="作者" 容器id 目标镜像名:[TAG]
docker坑
1.docker安装的容器都是最小可运行的,安装时最好百度一下或参考官网
docker卸载
1.卸载依赖
sudo yum remove docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
2.删除工作路径,这是docker的默认工作路径
rm -rf /var/lib/docker
docker数据卷
需求:数据存在容器中,容器删除后数据也会丢失,基于此,需要将docker容器中的数据同步到主机上。
1.启动centos,将容器内/home目录挂载到主机内/home/ceshi目录下,双向绑定,数据双向同步
-v全称:volume
docker run -it -v <容器目录>:<主机目录> <镜像> /bin/bash
docker run -it -v /home/ceshi:/home centos /bin/bash
2.实际运用:将mysql5.7配置文件和数据文件挂载在主机上,且mysql密码为root
-e全称:environment
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/data -e MYSQL_ROOT_PASSWORD="root" --name="mysql01" mysql:5.7
dockerFile构建过程
dockerFile基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile命令:
FROM #基础镜镜像,—切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤: tomcat镜像,这个tomcat压缩包,自动解压!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
构建jdk+tomcat镜像
1.上传jdk和tomcat,等会代码在mycentos中编写
2.编写代码
FROM centos
MAINTAINER lijian<2435024850@qq.com>
ADD jdk-8u162-linux-x64.tar.gz /usr/local
ADD apache-tomcat-7.5.87.tar.gz /usr/local
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_162
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.87
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.87
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.87-src/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.87/bin/logs/catalina.out
3.构建镜像
docker build -f mycentos -t diytomcat .
4.验证,启动容器并进入容器,输入java -version检测jdk,有则代表jdk成功,检测tomcat的话需要增加webapp和增加端口映射,这儿就不检测tomcatt了。
5.发布镜像到docker hub,步骤为:登录docker hub -> 对镜像打标签 -> 上传镜像,打标签格式为docker tag <镜像id或镜像名> <hub用户名>/<上传镜像名>:<版本号>,具体过程看图。
6.上传成功后就能在docker hub中找到自己刚刚上传的,和github是差不多的。
搭建私有仓库–非图形化界面
1.私有仓库本质也是一个镜像,拉取镜像
docker pull registry
2.以后台+交互的方式启动镜像,端口映射为5000:5000,随后访问**http://<自己的ip地址>:5000/v2/_catalog**
如下图所示表示搭建成功。
docker run -id --name=registry -p 5000:5000 registry
3.让本地的docker信任远程仓库,一般情况下docker仓库和自己的docker是两台不同的机器,但这儿只是为了学习,就搭建在的一台机器上。编辑vim /etc/docker/daemon.json
,将"insecure-registries":["<服务器ip>:5000"]插入到最后面,保存退出,如下图所示。
4.重启docker和docker仓库
systemctl restart docker
docker start registry
5.上传镜像到docker私有仓库,以mysql5.7为例:先将mysql打标签,打标签规则为打成的标签名必须以要上传仓库的ip地址:端口号命令,再将标签上传
docker tag <镜像名>:<版本号> <仓库地址>:<端口号>/<上传后的镜像名>:<上传后的镜像版本号>
docker tag mysql:5.7 <仓库地址>:5000/mysql:5.7
docker push <仓库地址>:5000/mysql:5.7
6.上传成功后我们再次访问html,就会发现repositories里多了个mysql
7.拉取镜像,拉取前先查看镜像极其具体的版本号:
查看:http://<仓库ip地址>:5000/v2/<需要查看的镜像>/tags/list
http://<仓库ip地址>:5000/v2/mysql/tags/list
拉取:docker pull <仓库ip地址>:5000/<镜像名>:<版本号>
docker pull <仓库ip地址>:5000/mysql:5.7
搭建私有仓库–图形化界面
【和搭建私有仓库–非图形化界面有很多相同点】
前置条件:该过程要求必须安装docker-compose
1.让本地的docker信任远程仓库,编辑vim /etc/docker/daemon.json
,将`“insecure-registries”:[“<服务器ip>:5000”,“<服务器ip>:8080”]
插入到最后面,保存退出,如下图所示。其中5000为docker-registry的端口,8080为docker-registry-ui的端口,5000可以选择不配置。
2.重启docker
systemctl restart docker
3.找个地方新建个目录,在目录中创建docker-compose.yml目录,将下列代码输入其中。
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/1ib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=个人docker仓库地址
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
4.启动docker-compose.yml,因为docker-compose.yml为docker-compose的默认文件,所以直接docker-compose up -d启动即可
docker-compose up -d
5.启动后正常贴图,访问地址:<ip地址>:8080
6.上传镜像的话和搭建私有仓库–非图形化界面中的一致,参考即可。
docker理论知识
作于复习,不建议不了解的同学直接阅读。
1.联合文件系统:
UnionFS ( 联合文件系统): Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件效统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性∶一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
实际运用:docker pull命令就是基于联合文件系统
2.docker镜像加载原理
bootis(boot file system):主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roots (root file system):在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。|
3.具名挂载和匿名挂载
字面意思,具名挂载就是指定挂载地,匿名随机生成一个挂载地,查看匿名挂载地方法:通过**docker volume inspect <容器id>**查看详情,详情里的mounts会有匿名挂载地。不建议匿名挂载,容易找不到。